Фон:
Самый логичный способ преобразования часа - это две переменные, которые качаются взад и вперед несинхронно. Представьте себе положение конца часовой стрелки на 24-часовых часах. В x
колебании позиции вперед и назад из синхронизации с y
позицией. Для 24-часовой вы можете сделать это с x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Вам нужны обе переменные или правильное движение во времени потеряно. Это связано с тем, что производная от sin или cos изменяется во времени, в то время как (x,y)
положение изменяется плавно по мере того, как оно перемещается по окружности.
Наконец, подумайте, стоит ли добавлять третью функцию для отслеживания линейного времени, которая может быть построена в виде часов (или минут или секунд) от начала первой записи или метки времени Unix или чего-то подобного. Эти три функции затем обеспечивают прокси как для циклической, так и для линейной прогрессии времени, например, вы можете вытянуть циклические явления, такие как циклы сна в движении людей, а также линейный рост, такой как численность и время.
Пример выполнения:
# 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
Теперь давайте попробуем это:
kmeansshow(6,df[['x', 'y']].values)
Вы едва можете видеть, что есть некоторые после полуночи, включенные в зеленый кластер до полуночи. Теперь давайте уменьшим количество кластеров и покажем, что до и после полуночи можно более подробно подключиться к одному кластеру:
kmeansshow(3,df[['x', 'y']].values)
Посмотрите, как синий кластер содержит моменты времени до и после полуночи, которые объединены в одном кластере ...
Вы можете сделать это для времени, или дня недели, или недели месяца, или дня месяца, или сезона, или чего-либо еще.