Calinski-Harabaz(CH)
CH指標經過計算類中各點與類中心的距離平方和來度量類內的緊密度,經過計算各種中心點與數據集中心點距離平方和來度量數據集的分離度,CH指標由分離度與緊密度的比值獲得。從而,CH越大表明着類自身越緊密,類與類之間越分散,即更優的聚類結果。dom
在scikit-learn中, Calinski-Harabasz Index對應的方法是metrics.calinski_harabaz_score.ide
CH和輪廓係數適用於實際類別信息未知的狀況,如下以K-means爲例,給定聚類數目K,則:idea
類內散度爲:spa
W(K)=∑k=1K∑C(j)=k||xj−x¯¯¯k||2 W(K)=∑k=1K∑C(j)=k||xj−x¯k||2 類間散度:code
B(K)=∑k=1Kak||x¯¯¯k−x¯¯¯||2 B(K)=∑k=1Kak||x¯k−x¯||2 則CH爲:orm
CH(K)=B(K)(N−K)W(K)(K−1) CH(K)=B(K)(N−K)W(K)(K−1)ci
CH相對來講速度可能會更快。generator
在這裏我本身碼了一個kmeans的代碼,計算並輸出其中的ch和輪廓係數pandas
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs
from sklearn.metrics import calinski_harabaz_score
from sklearn import metrics
from sklearn import preprocessing
# X爲樣本特徵,Y爲樣本簇類別, 共1000個樣本,每一個樣本2個特徵,共4個簇,簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分別爲[0.4, 0.2, 0.2]
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.2, 0.2, 0.2],
random_state =9)
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()
#X=np.array([[2,3,6],[8,7,9],[2,8,3],[3,6,1]])
k=5
y_pred = KMeans(n_clusters=k, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
c=KMeans(n_clusters=k, random_state=7)
y_pred = c.fit_predict(X)
kmeans_model = c.fit(X)
labels = kmeans_model.labels_
print('這個是k={}次時的CH值:'.format(k),metrics.calinski_harabaz_score(X,y_pred))
print('這個是k={}次時的輪廓係數:'.format(k),metrics.silhouette_score(X, labels, metric='euclidean'))