Sfondo:
Il modo più logico per trasformare l'ora è in due variabili che oscillano avanti e indietro fuori sincrono. Immagina la posizione della fine della lancetta delle ore di un orologio di 24 ore. La x
posizione oscilla avanti e indietro fuori sincrono con la y
posizione. Per un orologio di 24 ore è possibile raggiungere questo obiettivo con x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Sono necessarie entrambe le variabili o si perde il movimento corretto nel tempo. Ciò è dovuto al fatto che la derivata di sin o cos cambia nel tempo, mentre la (x,y)
posizione varia senza intoppi mentre viaggia attorno al cerchio unitario.
Infine, considera se vale la pena aggiungere una terza funzione per tracciare il tempo lineare, che può essere costruito come ore (o minuti o secondi) dall'inizio del primo record o un timestamp Unix o qualcosa di simile. Queste tre caratteristiche forniscono quindi proxy per la progressione ciclica e lineare del tempo, ad esempio è possibile estrarre fenomeni ciclici come i cicli del sonno nel movimento delle persone e anche una crescita lineare come la popolazione rispetto al tempo.
Esempio di realizzazione:
# 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
Ora proviamolo:
kmeansshow(6,df[['x', 'y']].values)
Riesci a malapena a vedere che ci sono alcuni dopo mezzanotte inclusi nel cluster verde prima di mezzanotte. Ora riduciamo il numero di cluster e mostriamo che prima e dopo la mezzanotte possono essere collegati in un singolo cluster in modo più dettagliato:
kmeansshow(3,df[['x', 'y']].values)
Scopri in che modo il cluster blu contiene i periodi precedenti e successivi alla mezzanotte raggruppati nello stesso cluster ...
Puoi farlo per tempo, o giorno della settimana, settimana del mese, giorno del mese, stagione o altro.