Najbardziej logicznym sposobem na przekształcenie godziny są dwie zmienne, które wychylają się do przodu i do tyłu z ujścia. Wyobraź sobie pozycję końca wskazówki godzinowej 24-godzinnego zegara. Te x
wahania pozycji iz powrotem z umywalką 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, 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ć w ciągu moich godzin (lub minut lub sekund) od początku pierwszego rekordu, uniksowego znacznika czasu lub czegoś podobnego. Te trzy cechy zapewniają następnie przybliżenie zarówno cyklicznego, jak i liniowego postępu czasu, np. Można wyciągnąć zjawisko cykliczne, takie jak cykle snu w ruchu ludzi, a także liniowy wzrost, jak populacja w funkcji czasu.
Mam nadzieję że to pomoże!
Dodając odpowiedni przykładowy kod wygenerowany dla innej odpowiedzi:
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 to:
kmeansshow(6,df[['x', 'y']].values)
Ledwo widać, że niektóre są po północy dołączone do zielonego gromady przed północą. Teraz pozwala zmniejszyć liczbę klastrów i pokazać, ż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 ...
CO BYŁO DO OKAZANIA!