Hintergrund:
Der logischste Weg, die Stunde umzuwandeln, besteht in zwei Variablen, die nicht synchron hin und her schwingen. Stellen Sie sich die Position des Stundenendzeigers einer 24-Stunden-Uhr vor. Die x
Position schwingt nicht synchron mit der y
Position hin und her . Für eine 24-Stunden-Uhr können Sie dies mit x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Sie benötigen 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, während sich die (x,y)
Position gleichmäßig ändert, wenn sie sich um den Einheitskreis bewegt.
Überlegen Sie abschließend, ob es sich lohnt, ein drittes Feature zum Verfolgen der linearen Zeit hinzuzufügen, das als Stunden (oder Minuten oder Sekunden) ab dem Beginn des ersten Datensatzes oder als Unix-Zeitstempel oder ähnliches erstellt werden kann. Diese drei Merkmale bieten dann Proxys sowohl für den zyklischen als auch für den linearen Verlauf der Zeit, z. B. können Sie zyklische Phänomene wie Schlafzyklen in der Bewegung von Menschen und auch lineares Wachstum wie Bevölkerung gegen Zeit herausziehen.
Beispiel für die Durchführung:
# 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
Probieren wir es jetzt aus:
kmeansshow(6,df[['x', 'y']].values)
Sie können kaum sehen, dass einige Zeiten nach Mitternacht im grünen Cluster vor Mitternacht enthalten sind. Lassen Sie uns nun die Anzahl der Cluster reduzieren und zeigen, dass vor und nach Mitternacht eine Verbindung zu einem einzelnen Cluster 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 ...
Sie können dies für die Zeit oder den Wochentag oder die Woche des Monats oder den Tag des Monats oder die Jahreszeit oder irgendetwas tun.