พื้นหลัง:
วิธีที่สมเหตุสมผลที่สุดในการแปลงชั่วโมงคือตัวแปรสองตัวที่แกว่งไปมาระหว่างการซิงค์ ลองนึกภาพตำแหน่งของจุดสิ้นสุดของเข็มชั่วโมงของนาฬิกา 24 ชั่วโมง x
ชิงช้าตำแหน่งสำรองและออกจากซิงค์กับy
ตำแหน่ง สำหรับนาฬิกา 24 ชั่วโมงคุณสามารถทำสิ่งนี้ได้ด้วยx=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
คุณต้องการตัวแปรทั้งสองหรือการเคลื่อนไหวที่เหมาะสมผ่านเวลาจะหายไป นี่คือความจริงที่ว่าอนุพันธ์ของบาปหรือการเปลี่ยนแปลงในเวลาในขณะที่(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)
ดูว่าคลัสเตอร์สีน้ำเงินประกอบด้วยเวลาที่มาจากก่อนและหลังเที่ยงคืนที่รวมเข้าด้วยกันในคลัสเตอร์เดียวกัน ...
คุณสามารถทำสิ่งนี้ได้ตามเวลาหรือวันของสัปดาห์หรือสัปดาห์ของเดือนหรือวันของเดือนหรือฤดูกาลหรืออะไรก็ได้