현재 장난감 데이터 세트 (ofc iris (:))의 BIC를 계산하려고합니다. 여기에 표시된 결과를 재현하려고합니다 (그림 5).이 논문은 BIC 공식의 소스이기도합니다.
나는 이것에 2 가지 문제가있다 :
- 표기법:
- = 클러스터 의 요소 수
- = 군집 중심 좌표
- = 클러스터 할당 된 데이터 포인트
- = 클러스터 수
1) 식에서 정의 된 분산 (2) :
내가 알 수있는 한, 문제는 있지만 클러스터의 요소보다 많은 클러스터 이 있을 때 분산이 음수가 될 수 있다는 것은 다루지 않습니다 . 이 올바른지?
2) 올바른 BIC를 계산하기 위해 코드를 작동시킬 수 없습니다. 잘만되면 오류가 없지만 누군가 확인할 수 있다면 높이 평가 될 것입니다. 전체 방정식은 Eq. 종이에 (5). scikit learn을 사용하여 모든 것을 지금 당장 사용하고 있습니다 (키워드 : P를 정당화하기 위해).
from sklearn import cluster
from scipy.spatial import distance
import sklearn.datasets
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import numpy as np
def compute_bic(kmeans,X):
"""
Computes the BIC metric for a given clusters
Parameters:
-----------------------------------------
kmeans: List of clustering object from scikit learn
X : multidimension np array of data points
Returns:
-----------------------------------------
BIC value
"""
# assign centers and labels
centers = [kmeans.cluster_centers_]
labels = kmeans.labels_
#number of clusters
m = kmeans.n_clusters
# size of the clusters
n = np.bincount(labels)
#size of data set
N, d = X.shape
#compute variance for all clusters beforehand
cl_var = [(1.0 / (n[i] - m)) * sum(distance.cdist(X[np.where(labels == i)], [centers[0][i]], 'euclidean')**2) for i in xrange(m)]
const_term = 0.5 * m * np.log10(N)
BIC = np.sum([n[i] * np.log10(n[i]) -
n[i] * np.log10(N) -
((n[i] * d) / 2) * np.log10(2*np.pi) -
(n[i] / 2) * np.log10(cl_var[i]) -
((n[i] - m) / 2) for i in xrange(m)]) - const_term
return(BIC)
# IRIS DATA
iris = sklearn.datasets.load_iris()
X = iris.data[:, :4] # extract only the features
#Xs = StandardScaler().fit_transform(X)
Y = iris.target
ks = range(1,10)
# run 9 times kmeans and save each result in the KMeans object
KMeans = [cluster.KMeans(n_clusters = i, init="k-means++").fit(X) for i in ks]
# now run for each cluster the BIC computation
BIC = [compute_bic(kmeansi,X) for kmeansi in KMeans]
plt.plot(ks,BIC,'r-o')
plt.title("iris data (cluster vs BIC)")
plt.xlabel("# clusters")
plt.ylabel("# BIC")
BIC에 대한 내 결과는 다음과 같습니다.
어느 것도 내가 예상했던 것과 비슷하지 않으며 또한 이해가되지 않습니다 ... 나는 잠시 동안 방정식을 보았고 더 이상 내 실수를 찾지 못했습니다.)