चक्रीय साधारण विशेषताओं को बदलने का एक अच्छा तरीका क्या है?


21

मैं अपनी विशेषता के रूप में 'घंटे' क्षेत्र में हूँ, लेकिन यह एक चक्रीय मान लेता है। मैं '23' और '0' घंटे जैसी सूचनाओं को संरक्षित करने के लिए फीचर को कैसे बदल सकता हूं, यह बहुत दूर नहीं है।

एक तरीका मुझे लगता है कि परिवर्तन करना है: min(h, 23-h)

Input: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

Output: [0 1 2 3 4 5 6 7 8 9 10 11 11 10 9 8 7 6 5 4 3 2 1]

क्या ऐसी विशेषताओं को संभालने के लिए कोई मानक है?

अद्यतन: मैं यादृच्छिक वन वर्गीकरण को प्रशिक्षित करने के लिए, पर्यवेक्षित शिक्षण का उपयोग करूंगा!


1
बहुत बढ़िया पहला सवाल! क्या आप इस विशिष्ट सुविधा परिवर्तन को करने के लिए अपने लक्ष्य के बारे में कुछ और जानकारी जोड़ सकते हैं? क्या आप एक पर्यवेक्षित शिक्षण समस्या के इनपुट के रूप में इस रूपांतरित सुविधा का उपयोग करने का इरादा रखते हैं? यदि हां, तो कृपया उस जानकारी को जोड़ने पर विचार करें क्योंकि इससे दूसरों को इस प्रश्न का बेहतर उत्तर देने में मदद मिल सकती है।
नितेश

1
@ नितेश, अपडेट देखें
मंगत राय मोदी

आप यहाँ उत्तर पा सकते हैं: datascience.stackexchange.com/questions/4967/…
MrMeritology

क्षमा करें, लेकिन मैं टिप्पणी नहीं कर सकता। @ AN6U5 क्या आप इस बात का विस्तार कर सकते हैं कि आप अद्भुत दृष्टिकोण के बाद सप्ताह और घंटे का अनुकरण कैसे करें? मैं एक सप्ताह से इस पर संघर्ष कर रहा हूं और मैंने एक क्यू भी पोस्ट किया लेकिन आपने इसे नहीं पढ़ा।
सीमौर

जवाबों:


33

घंटे को बदलने का सबसे तार्किक तरीका दो चर में है जो सिंक से बाहर और पीछे स्विंग करता है। 24 घंटे की घड़ी के घंटे के हाथ की समाप्ति की स्थिति की कल्पना करें। xस्थिति झूलों के साथ आगे और पीछे सिंक से बाहर yस्थिति। एक 24 घंटे की घड़ी के लिए आप के साथ ऐसा कर सकते हैं x=sin(2pi*hour/24), y=cos(2pi*hour/24)

समय के माध्यम से आपको चर या उचित आंदोलन की आवश्यकता होती है। यह इस तथ्य के कारण है कि या तो पाप या कॉस के व्युत्पन्न समय में बदल जाते हैं जहां (x,y)स्थिति सुचारू रूप से बदलती है क्योंकि यह यूनिट सर्कल के चारों ओर घूमती है।

अंत में, विचार करें कि क्या रैखिक समय का पता लगाने के लिए एक तीसरी विशेषता जोड़ना उचित है, जो कि पहले रिकॉर्ड या यूनिक्स समय की मुहर या कुछ इसी तरह की शुरुआत से मेरे घंटों (या मिनट या सेकंड) का निर्माण किया जा सकता है। ये तीन विशेषताएं तब समय के चक्रीय और रैखिक प्रगति दोनों के लिए परदे के पीछे प्रदान करती हैं जैसे आप लोगों के आंदोलन में नींद चक्र जैसी चक्रीय घटना को खींच सकते हैं और जनसंख्या बनाम समय की तरह रैखिक विकास भी कर सकते हैं।

उम्मीद है की यह मदद करेगा!

कुछ प्रासंगिक उदाहरण कोड जो मैंने दूसरे उत्तर के लिए उत्पन्न किए हैं:

यदि पूरा किया जा रहा है तो इसका उदाहरण:

# Enable inline plotting
%matplotlib inline

#Import everything I need...

import numpy as np
import matplotlib as mp

import matplotlib.pyplot as plt
import pandas as pd

# Grab some random times from here: https://www.random.org/clock-times/
# put them into a csv.
from pandas import DataFrame, read_csv
df = read_csv('/Users/angus/Machine_Learning/ipython_notebooks/times.csv',delimiter=':')
df['hourfloat']=df.hour+df.minute/60.0
df['x']=np.sin(2.*np.pi*df.hourfloat/24.)
df['y']=np.cos(2.*np.pi*df.hourfloat/24.)

df

यहाँ छवि विवरण दर्ज करें

def kmeansshow(k,X):

    from sklearn import cluster
    from matplotlib import pyplot
    import numpy as np

    kmeans = cluster.KMeans(n_clusters=k)
    kmeans.fit(X)

    labels = kmeans.labels_
    centroids = kmeans.cluster_centers_
    #print centroids

    for i in range(k):
        # select only data observations with cluster label == i
        ds = X[np.where(labels==i)]
        # plot the data observations
        pyplot.plot(ds[:,0],ds[:,1],'o')
        # plot the centroids
        lines = pyplot.plot(centroids[i,0],centroids[i,1],'kx')
        # make the centroid x's bigger
        pyplot.setp(lines,ms=15.0)
        pyplot.setp(lines,mew=2.0)
    pyplot.show()
    return centroids

अब इसे आज़माते हैं:

kmeansshow(6,df[['x', 'y']].values)

यहाँ छवि विवरण दर्ज करें

आप बस मुश्किल से देख सकते हैं कि आधी रात के बाद के कुछ समय हैं जिनमें मध्यरात्रि के पहले के हरे रंग के क्लस्टर शामिल हैं। अब क्लस्टर की संख्या को कम करने देता है और दिखाता है कि आधी रात से पहले और बाद में एक ही क्लस्टर में अधिक विस्तार से जोड़ा जा सकता है:

kmeansshow(3,df[['x', 'y']].values)

यहाँ छवि विवरण दर्ज करें

देखें कि नीले क्लस्टर में मध्यरात्रि से पहले और बाद के समय कैसे होते हैं जो एक ही क्लस्टर में एक साथ क्लस्टर किए जाते हैं ...

QED!


इसे संभालने का शानदार तरीका। यह 0 और 23 घंटे समान स्कोर देगा, लेकिन क्या यह भी समान / पीएम समय नहीं होगा? जो वास्तव में 12hr विंडो द्वारा अलग किया गया है।
मंगत राय मोदी

12 घंटे (AM / PM) का समय काम नहीं करता है, बस इसे 24 घंटे के समय में बदल दें।
AN6U5

मैंने अभी देखा कि आप 24 से विभाजित हो रहे हैं। जब आपने घड़ी को सादृश्य दिया, तो मुझे लगा कि यह 12 घंटे की मानक घड़ी है। हालाँकि आप 24 घंटे की घड़ी ले रहे हैं। यह मेरे लिए रूपांतरित करने का सबसे अच्छा तरीका है। धन्यवाद!
मंगत राय मोदी

अद्भुत जवाब बिल्कुल धन्यवाद के लिए मैं क्या देख रहा था ..
आदित्य

पाप () और लागत () के संयोजन का स्वीकृत उत्तर बहुत अच्छा है; यहाँ एक पूरक इयान लंदन द्वारा इसके लिए एक बहुत विस्तृत और अच्छी व्याख्या के रूप में।
फ्लोरियानएच

3

सवाल बहुत दिलचस्प है और मुझे दिलचस्प जवाबों के बारे में पढ़ना याद नहीं है। उसकी वजह से मैं आपको एक संभव समाधान देने की हिम्मत करता हूं, भले ही वह पर्याप्त पागल लग रहा हो।

आमतौर पर एक ही जानकारी को कई विशेषताओं में रखने से बचा जाता है, क्योंकि कई एल्गोरिदम इसे संभाल नहीं सकते हैं। लेकिन यह यादृच्छिक वन का मामला नहीं है। कंट्रास्टिंग लीनियर रिग्रेशन (और सभी मॉडल समान विचारों पर आधारित), रैंडम फॉरेस्ट एक बार में प्रत्येक फीचर को ध्यान में रखते हुए, सभी सुविधाओं का परीक्षण करते हैं। इस तरह से सीखने के प्रदर्शन को प्रभावित किए बिना, समान रूप से स्थान और चलने के समय को एक ही जानकारी को कई तरीकों से कोड करना संभव है।

(h+offset)

यह कुछ जगह और समय बर्बाद करता है, लेकिन मैं इसे देखने की कोशिश करूँगा कि यह कैसे काम करता है।


0

आदर्श रूप से आपको किसी परिवर्तन की आवश्यकता नहीं है। दूरी बिंदु के रूप में दो बिंदुओं के बीच सापेक्ष समय अंतर का उपयोग किया जा सकता है। जहां वर्गीकरण इस पर आधारित हो सकता है।

जावा में:

public class TimeDistanceMeasurer implements DistanceMeasure {

    @Override
    public double compute(double[] a, double[] b) throws DimensionMismatchException {
        String time1 = String.format("%02d", (int)a[0]) + String.format("%02d", (int)a[0]);
        String time2 = String.format("%02d", (int)b[0]) + String.format("%02d", (int)b[0]);

        SimpleDateFormat format = new SimpleDateFormat("HHmm");
        try {
            Date date1 = format.parse(time1);
            Date date2 = format.parse(time2);
            return Math.abs(date2.getTime() - date1.getTime());
        } catch (Exception e) {
            throw new IllegalStateException("Something went wrong.", e);
        }
    }
}

1
यह सब ठीक है, लेकिन सवाल कुछ और चाहिए ..
आदित्य
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.