時間を変換する最も論理的な方法は、シンクからシンクへと前後にスイングする2つの変数になります。24時間時計の時針の終わりの位置を想像してください。x
前後にとシンクのうち位置スイングy
位置。24時間制の場合x=sin(2pi*hour/24)
、でこれを達成できますy=cos(2pi*hour/24)
。
両方の変数が必要です。そうでない場合、時間の経過とともに適切な動きが失われます。これは、sinまたはcosのいずれかの微分が時間的に変化するという事実によるものです。この場合、(x,y)
位置は単位円の周りを移動するときに滑らかに変化します。
最後に、線形時間をトレースする3番目の機能を追加する価値があるかどうかを検討します。これは、最初のレコードの開始から数時間(または分または秒)、Unixタイムスタンプまたは同様のもので構成できます。これらの3つの機能は、時間の周期的および線形的進行の両方のプロキシを提供します。たとえば、人々の動きの睡眠サイクルなどの周期的現象や、人口対時間などの線形成長を引き出すことができます。
お役に立てれば!
別の回答用に生成したいくつかの関連するサンプルコードを追加します。
達成された場合の例:
# 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)
真夜中より前の緑のクラスターには、真夜中より後の時刻が含まれていることがほとんどわかりません。次に、クラスターの数を減らして、深夜の前後に1つのクラスターでより詳細に接続できることを示します。
kmeansshow(3,df[['x', 'y']].values)
青いクラスターに、同じクラスター内で一緒にクラスター化された深夜の前後の時刻がどのように含まれているかを確認してください...
QED!