Фон:
Найбільш логічний спосіб перетворити годину на дві змінні, які змінюються синхронізовано назад і назад. Уявіть положення кінця годинної руки цілодобового годинника. В 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)
Подивіться, як синій кластер містить часи, що передують до і після півночі, які об'єднані в один кластер ...
Ви можете це робити час, або день тижня, або тиждень місяця, або день місяця, або сезон, або все що завгодно.