Fundo:
A maneira mais lógica de transformar a hora é em duas variáveis que oscilam para frente e para trás fora de sincronia. Imagine a posição do ponteiro de fim de hora de um relógio de 24 horas. A x
posição oscila para frente e para trás fora de sincronia com a y
posição. Para um relógio de 24 horas você pode fazer isso com x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Você precisa de ambas as variáveis ou o movimento adequado ao longo do tempo é perdido. Isso se deve ao fato de que a derivada do pecado ou cos muda no tempo, enquanto a (x,y)
posição varia suavemente à medida que viaja ao redor do círculo unitário.
Por fim, considere se vale a pena adicionar um terceiro recurso para rastrear o tempo linear, que pode ser construído como horas (ou minutos ou segundos) desde o início do primeiro registro ou um carimbo de data / hora do Unix ou algo semelhante. Esses três recursos fornecem proxies para a progressão cíclica e linear do tempo, por exemplo, você pode retirar fenômenos cíclicos como ciclos de sono no movimento das pessoas e também crescimento linear como população versus tempo.
Exemplo de se está sendo realizado:
# 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
Agora vamos tentar:
kmeansshow(6,df[['x', 'y']].values)
Você mal consegue ver que há alguns horários após a meia-noite incluídos no cluster verde antes da meia-noite. Agora vamos reduzir o número de clusters e mostrar que antes e depois da meia-noite podem ser conectados em um único cluster com mais detalhes:
kmeansshow(3,df[['x', 'y']].values)
Veja como o cluster azul contém horários anteriores e posteriores à meia-noite agrupados no mesmo cluster ...
Você pode fazer isso por hora, dia da semana, semana do mês, dia do mês, estação do ano ou qualquer outra coisa.