Antecedentes:
La forma más lógica de transformar la hora es en dos variables que se desvían de la sincronización. Imagine la posición de la manecilla de fin de hora de un reloj de 24 horas. La x
posición oscila de un lado a otro fuera de sincronización con la y
posición. Para un reloj de 24 horas se puede lograr esto con x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Necesita ambas variables o se pierde el movimiento adecuado a través del tiempo. Esto se debe al hecho de que la derivada de sin o cos cambia en el tiempo, mientras que la (x,y)
posición varía suavemente a medida que viaja alrededor del círculo unitario.
Finalmente, considere si vale la pena agregar una tercera característica para rastrear el tiempo lineal, que se puede construir como horas (o minutos o segundos) desde el comienzo del primer registro o una marca de tiempo Unix o algo similar. Estas tres características proporcionan proxies para la progresión cíclica y lineal del tiempo, por ejemplo, puede extraer fenómenos cíclicos como los ciclos de sueño en el movimiento de las personas y también el crecimiento lineal como la población frente al tiempo.
Ejemplo de si se está logrando:
# 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
Ahora probémoslo:
kmeansshow(6,df[['x', 'y']].values)
Apenas puede ver que hay algunos momentos posteriores a la medianoche incluidos con el clúster verde anterior a la medianoche. Ahora reduzcamos el número de clústeres y demostremos que antes y después de la medianoche se pueden conectar en un solo clúster con más detalle:
kmeansshow(3,df[['x', 'y']].values)
Vea cómo el clúster azul contiene horas anteriores y posteriores a la medianoche que se agrupan en el mismo clúster ...
Puede hacer esto por tiempo, día de la semana, semana del mes, día del mes, temporada o cualquier cosa.