Tło:
Najbardziej logicznym sposobem na przekształcenie godziny są dwie zmienne, które kołyszą się w jedną i drugą synchronizację. Wyobraź sobie pozycję końca wskazówki godzinowej 24-godzinnego zegara. Te x
wahania pozycji iz powrotem zsynchronizowany z y
pozycji. Na zegarze 24-godzinnym można to osiągnąć z x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Potrzebujesz obu zmiennych lub utracisz właściwy ruch w czasie. Wynika to z faktu, że pochodna grzechu lub cos zmienia się w czasie, podczas gdy (x,y)
pozycja zmienia się płynnie, gdy przemieszcza się po okręgu jednostki.
Na koniec zastanów się, czy warto dodać trzecią cechę do śledzenia czasu liniowego, którą można skonstruować jako godziny (lub minuty lub sekundy) od początku pierwszego rekordu lub uniksowy znacznik czasu lub coś podobnego. Te trzy cechy zapewniają następnie przybliżenie zarówno cyklicznego, jak i liniowego przebiegu czasu, np. Można wyciągać zjawiska cykliczne, takie jak cykle snu w ruchu ludzi, a także liniowy wzrost, taki jak populacja w funkcji czasu.
Przykład realizacji:
# 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
Teraz wypróbujmy:
kmeansshow(6,df[['x', 'y']].values)
Ledwo widać, że niektóre są po północy dołączone do zielonej gromady przed północą. Teraz zmniejszmy liczbę klastrów i pokażmy, że przed i po północy można połączyć bardziej szczegółowo w jednym klastrze:
kmeansshow(3,df[['x', 'y']].values)
Zobacz, jak niebieski klaster zawiera czasy sprzed i po północy, które są skupione w tym samym klastrze ...
Możesz to zrobić dla czasu, dnia tygodnia, tygodnia miesiąca, dnia miesiąca, sezonu lub cokolwiek innego.