Die logischste Art, die Stunde umzuwandeln, besteht in zwei Variablen, die aus der Senke heraus und zurück schwingen. Stellen Sie sich die Position des Stundenendzeigers einer 24-Stunden-Uhr vor. Die x
Position schwingt mit der y
Position aus der Senke . Für eine 24-Stunden - Uhr können Sie erreichen dies mit x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Sie brauchen beide Variablen oder die richtige Bewegung durch die Zeit geht verloren. Dies ist auf die Tatsache zurückzuführen, dass sich die Ableitung von sin oder cos zeitlich ändert, wenn sich die (x,y)
Position gleichmäßig ändert, während sie sich um den Einheitskreis bewegt.
Überlegen Sie abschließend, ob es sich lohnt, ein drittes Feature zur Verfolgung der linearen Zeit hinzuzufügen, das aus Stunden (oder Minuten oder Sekunden) ab dem Beginn des ersten Datensatzes oder einem Unix-Zeitstempel oder ähnlichem erstellt werden kann. Diese drei Funktionen liefern dann Proxys für den zyklischen und linearen Verlauf der Zeit. Sie können zyklische Phänomene wie Schlafzyklen in der Bewegung von Menschen und auch lineares Wachstum wie Bevölkerungszahl im Verhältnis zur Zeit herausfiltern.
Hoffe das hilft!
Hinzufügen eines relevanten Beispielcodes, den ich für eine andere Antwort generiert habe:
Beispiel für das Erreichen von:
# 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
Jetzt probieren wir es aus:
kmeansshow(6,df[['x', 'y']].values)
Sie können kaum erkennen, dass der grüne Cluster vor Mitternacht einige Zeiten nach Mitternacht enthält. Reduzieren Sie jetzt die Anzahl der Cluster und zeigen Sie, dass vor und nach Mitternacht in einem einzelnen Cluster eine detailliertere Verbindung hergestellt werden kann:
kmeansshow(3,df[['x', 'y']].values)
Sehen Sie, wie der blaue Cluster Zeiten vor und nach Mitternacht enthält, die im selben Cluster zusammengefasst sind ...
QED!