Lý lịch:
Cách hợp lý nhất để chuyển đổi giờ là thành hai biến xoay qua lại không đồng bộ. Hãy tưởng tượng vị trí của kim giờ của đồng hồ 24 giờ. Vị x
trí dao động qua lại không đồng bộ với y
vị trí. Đối với một đồng hồ 24 giờ bạn có thể thực hiện điều này với x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Bạn cần cả hai biến hoặc chuyển động thích hợp qua thời gian bị mất. Điều này là do thực tế là đạo hàm của sin hoặc cos thay đổi theo thời gian trong khi (x,y)
vị trí thay đổi trơn tru khi nó di chuyển xung quanh vòng tròn đơn vị.
Cuối cùng, xem xét liệu có đáng để thêm một tính năng thứ ba để theo dõi thời gian tuyến tính, có thể được xây dựng dưới dạng giờ (hoặc phút hoặc giây) từ khi bắt đầu bản ghi đầu tiên hoặc dấu thời gian Unix hoặc một cái gì đó tương tự. Ba tính năng này sau đó cung cấp các proxy cho cả sự tiến triển theo chu kỳ và tuyến tính của thời gian, ví dụ: bạn có thể tạo ra các hiện tượng theo chu kỳ như chu kỳ giấc ngủ trong chuyển động của mọi người và cả sự tăng trưởng tuyến tính như dân số theo thời gian.
Ví dụ về nếu được hoàn thành:
# 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
Bây giờ hãy thử xem:
kmeansshow(6,df[['x', 'y']].values)
Bạn chỉ có thể thấy rằng có một số sau nửa đêm bao gồm các cụm màu xanh lá cây trước nửa đêm. Bây giờ, hãy giảm số lượng cụm và chỉ ra rằng trước và sau nửa đêm có thể được kết nối trong một cụm chi tiết hơn:
kmeansshow(3,df[['x', 'y']].values)
Xem cách cụm màu xanh chứa thời gian từ trước và sau nửa đêm được nhóm lại với nhau trong cùng một cụm ...
Bạn có thể làm điều này trong thời gian, hoặc ngày trong tuần, hoặc tuần trong tháng, hoặc ngày trong tháng, hoặc mùa, hoặc bất cứ điều gì.