Latar Belakang:
Cara paling logis untuk mengubah jam adalah menjadi dua variabel yang berayun bolak-balik. Bayangkan posisi ujung jarum jam dari 24 jam. The x
ayunan posisi bolak-balik tidak sinkron dengan y
posisi. Untuk jam 24-jam Anda dapat melakukannya dengan x=sin(2pi*hour/24)
, y=cos(2pi*hour/24)
.
Anda perlu kedua variabel atau gerakan yang tepat melalui waktu hilang. Hal ini disebabkan oleh fakta bahwa turunan dari dosa atau cos berubah dalam waktu sedangkan (x,y)
posisi bervariasi dengan lancar saat bergerak di sekitar satuan lingkaran.
Akhirnya, pertimbangkan apakah perlu untuk menambahkan fitur ketiga untuk melacak waktu linier, yang dapat dibangun sebagai jam (atau menit atau detik) dari awal catatan pertama atau cap waktu Unix atau yang serupa. Ketiga fitur ini kemudian memberikan proksi untuk progresif siklus dan linear waktu, mis. Anda dapat mengeluarkan fenomena siklus seperti siklus tidur dalam pergerakan manusia dan juga pertumbuhan linear seperti populasi vs waktu.
Contoh jika dilakukan:
# 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
Sekarang mari kita coba:
kmeansshow(6,df[['x', 'y']].values)
Anda hanya bisa melihat bahwa ada beberapa setelah tengah malam yang termasuk dalam kluster hijau sebelum tengah malam. Sekarang mari kita kurangi jumlah cluster dan tunjukkan bahwa sebelum dan sesudah tengah malam dapat dihubungkan dalam satu cluster secara lebih detail:
kmeansshow(3,df[['x', 'y']].values)
Lihat bagaimana gugus biru berisi waktu dari sebelum dan sesudah tengah malam yang dikelompokkan bersama di dalam kluster yang sama ...
Anda dapat melakukan ini untuk waktu, atau hari dalam seminggu, atau minggu dalam sebulan, atau hari dalam sebulan, atau musim, atau apa pun.