Le moyen le plus logique de transformer l'heure est en deux variables qui oscillent d'avant en arrière hors de l'évier. 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 de l'évier avec la y
position. Pour une horloge de 24 heures, vous pouvez accomplir cela avecx=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 alors que(x,y)
position varie en douceur lorsqu'elle se déplace autour du cercle unitaire.
Enfin, demandez-vous s'il est utile d'ajouter une troisième fonctionnalité pour tracer le temps linéaire, qui peut être construite mes heures (ou minutes ou secondes) depuis le 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 un phénomène cyclique comme les cycles de sommeil dans le mouvement des personnes et également une croissance linéaire comme la population en fonction du temps.
J'espère que cela t'aides!
Ajout d'un exemple de code pertinent que j'ai généré pour une autre réponse:
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 en a certains après minuit inclus avec le cluster vert avant minuit. Permet maintenant de réduire le nombre de clusters et de montrer 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 ...
QED!