转换小时的最合乎逻辑的方法是转换成两个来回摆动不同步的变量。想象一下 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)
看看蓝色集群如何包含从午夜之前和之后聚集在同一个集群中的时间......
QED!