Contexte:
Le moyen le plus logique de transformer l'heure est en deux variables qui oscillent dans les deux sens hors de la synchronisation. Imaginez la position de la fin de l'aiguille des heures d'une horloge de 24 heures. La x
position oscille d'avant en arrière par rapport à la y
position. Pour une horloge de 24 heures , vous pouvez y arriver avec x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Vous avez besoin des deux variables ou le bon mouvement dans le temps est perdu. Cela est dû au fait que la dérivée de sin ou cos change dans le temps tandis que la (x,y)
position varie en douceur lorsqu'elle se déplace autour du cercle unitaire.
Enfin, examinez s'il vaut la peine d'ajouter une troisième fonctionnalité pour tracer le temps linéaire, qui peut être construite en heures (ou minutes ou secondes) à partir du début du premier enregistrement ou un horodatage Unix ou quelque chose de similaire. Ces trois caractéristiques fournissent ensuite des indicateurs pour la progression cyclique et linéaire du temps, par exemple, vous pouvez extraire des phénomènes cycliques tels que les cycles de sommeil dans le mouvement des personnes et également une croissance linéaire comme la population en fonction du temps.
Exemple de réalisation:
# 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
Essayons maintenant:
kmeansshow(6,df[['x', 'y']].values)
Vous pouvez à peine voir qu'il y a des heures après minuit incluses avec le cluster vert avant minuit. Réduisons maintenant le nombre de clusters et montrons qu'avant et après minuit peuvent être connectés en un seul cluster plus en détail:
kmeansshow(3,df[['x', 'y']].values)
Voyez comment le cluster bleu contient des heures antérieures et postérieures à minuit regroupées dans le même cluster ...
Vous pouvez le faire pour l'heure, le jour de la semaine ou la semaine du mois, le jour du mois ou la saison, etc.