2016-06-08 1 views
1

여러 타임 스탬프 (분 단위)에 대해 클러스터링을 수행하고자합니다. 그래서 내가 무슨 짓을했는지 지금까지입니다 :sklearn과 함께 라디안 거리 행렬에 DBSCAN을 적용 하시겠습니까?

1) 각 지점에서 짧은 거리를 지정) 라디안

#points containing time value in minutes 
points = [100, 200, 600, 659, 700] 

def convert_to_radian(x): 
    return((x/(24 * 60)) * 2 * pi) 

rad_function = np.vectorize(convert_to_radian) 
points_rad = rad_function(points) 

2) 생성 거리 행렬

#generate distance matrix from each point 
dist = points_rad[None,:] - points_rad[:, None] 

3 점을 변환

dist[((dist > pi) & (dist <= (2*pi)))] = dist[((dist > pi) & (dist <= (2*pi)))] -(2*pi) 
dist[((dist > (-2*pi)) & (dist <= (-1*pi)))] = dist[((dist > (-2*pi)) & (dist <= (-1*pi)))] + (2*pi) 
dist = abs(dist) 

이제 거리 매트릭스에 DBSCAN을 사용하고 싶습니다. 클러스터에 대해 어떻게 생각합니까? 그것을 라디안 거리에 넣으시겠습니까?

감사합니다.

+0

내가 당신의 거리 행렬은 거리 행렬하지라고 생각합니다. –

+0

왜 단순 선형 측정을 각도로 변환하고 싶습니까? (BTW, 대부분의 시계는 다이얼에 12 시간이 아니라 24 시간) –

+0

@ Anony-Mousse입니다! 나는 그것을 알아낼 수 있었다! – cookiedookie

답변

1

많은 파고가 난 후에 DBSCAN 메트릭을 '사전 계산'으로 설정하고 .fit() 메서드를 사용하고 내 거리 매트릭스를 전달할 수 있음을 알았습니다. 여기에 관심있는 것들에 대한 소스입니다 :

import numpy as np 
from math import pi 
from sklearn.cluster import DBSCAN 

#points containing time value in minutes 
points = [100, 200, 600, 659, 700] 

def convert_to_radian(x): 
    return((x/(24 * 60)) * 2 * pi) 

rad_function = np.vectorize(convert_to_radian) 
points_rad = rad_function(points) 

#generate distance matrix from each point 
dist = points_rad[None,:] - points_rad[:, None] 

#Assign shortest distances from each point 
dist[((dist > pi) & (dist <= (2*pi)))] = dist[((dist > pi) & (dist <= (2*pi)))] -(2*pi) 
dist[((dist > (-2*pi)) & (dist <= (-1*pi)))] = dist[((dist > (-2*pi)) & (dist <= (-1*pi)))] + (2*pi) 
dist = abs(dist) 

#check dist 
print(dist) 

#using default values, set metric to 'precomputed' 
db = DBSCAN(eps=((100/(24*60)) * 2 * pi), min_samples = 2, metric='precomputed') 

#check db 
print(db) 

db.fit(dist) 

#get labels 
labels = db.labels_ 

#get number of clusters 
no_clusters = len(set(labels)) - (1 if -1 in labels else 0) 

print('No of clusters:', no_clusters) 
print('Cluster 0 : ', np.nonzero(labels == 0)[0]) 
print('Cluster 1 : ', np.nonzero(labels == 1)[0]) 

출력 :

[[ 0.   0.43633231 2.18166156 2.43909763 2.61799388] 
[ 0.43633231 0.   1.74532925 2.00276532 2.18166156] 
[ 2.18166156 1.74532925 0.   0.25743606 0.43633231] 
[ 2.43909763 2.00276532 0.25743606 0.   0.17889625] 
[ 2.61799388 2.18166156 0.43633231 0.17889625 0.  ]] 

DBSCAN(algorithm='auto', eps=0.4363323129985824, leaf_size=30, 
metric='precomputed', min_samples=2, p=None, random_state=None) 

No of clusters: 2 
Cluster 0 : [0 1] 
Cluster 1 : [2 3 4] 
관련 문제