バックグラウンド:
時間を変換する最も論理的な方法は、同期を外れて前後に変動する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)
青いクラスターに、同じクラスターにクラスター化された真夜中前後の時刻がどのように含まれているかを確認してください...
これは、時間、曜日、月の週、日、季節のいずれかで行うことができます。