Şu anda oyuncak veri setim için BIC'yi hesaplamaya çalışıyorum (ofc iris (:). Sonuçları burada gösterildiği gibi çoğaltmak istiyorum (Şekil 5) Bu makale aynı zamanda BIC formülleri için kaynağım.
Bu konuda 2 problemim var:
- Gösterim:
- ben küme eleman = sayısı
- i = küme merkez koordinatları
- i = küme atanan veri noktaları
- = küme sayısı
1) Denklemde tanımlanan varyans. (2):
Gördüğüm kadarıyla sorunludur ve kümedeki elemanlardan daha fazla küme olduğunda varyansın negatif olabileceği kapsanmamıştır . Bu doğru mu?
2) Kodumu doğru BIC'yi hesaplamak için çalıştıramıyorum. Umarım bir hata yoktur, ancak birisinin kontrol edebilmesi çok takdir edilecektir. Denklemin tamamı Denklemde bulunabilir. (5). Şu anda her şey için scikit öğrenmek kullanıyorum (anahtar kelimeyi haklı göstermek için: 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 sonuçlarım şöyle:
Bu, beklediğim şeye yakın bile değil ve aynı zamanda bir anlam ifade etmiyor ... Bir süre için denklemlere baktım ve hatamı daha fazla bulamıyorum):