如果真實標籤未事先知道(如您的情況),那麼可以使用Silhouette係數評估模型(例如clustering
)。
從sklearn documentation,
較高的剪影係數得分涉及具有更好的定義的簇的模型。每個樣本的輪廓係數被定義並且由兩個分數組成: '
a:樣本與同一類別中所有其他點之間的平均距離。
b:樣本與下一個 最近羣集中所有其他點之間的平均距離。
剪影係數被用於單個樣品然後被下式給出:
現在,以找到最佳的k
爲KMeans
通過1..N爲n_clusters在KMeans
值,環並計算每個樣本的輪廓係數。
較高的輪廓係數表示該物體與自己的聚類很好地匹配,並且與鄰近聚類很差地匹配。
from sklearn.metrics import silhouette_score
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
X = load_iris().data
y = load_iris().target
for n_cluster in range(2, 11):
kmeans = KMeans(n_clusters=n_cluster).fit(X)
label = kmeans.labels_
sil_coeff = silhouette_score(X, label, metric='euclidean')
print("For n_clusters={}, The Silhouette Coefficient is {}".format(n_cluster, sil_coeff))
輸出 -
對於n_clusters = 2所述的剪影係數是0.680813620271
對於n_clusters = 3,該剪影係數是0.552591944521
對於n_clusters = 4,該剪影係數是0.496992849949
對於n_clusters = 5,輪廓係數爲0.488517550854
對於n_clusters = 6,輪廓係數NT是0.370380309351
對於n_clusters = 7,該剪影係數是0.356303270516
對於n_clusters = 8,該剪影係數是0.365164535737
對於n_clusters = 9,該剪影係數被0.346583642095
對於n_clusters = 10,該剪影係數被0.328266088778
如我們所見,n_clusters = 2具有最高的輪廓係數。這意味着2應該是聚類的最佳數量,對嗎?
但是,這裏有一個問題。
虹膜數據集有3種花,與2作爲羣的最佳數量相矛盾。因此,儘管n_clusters = 2具有最高的剪影係數,我們會考慮n_clusters = 3爲最佳簇由於數量 -
- 虹膜數據集有3種。 (最重要)
- n_clusters = 2具有第二高的Silhouette係數值。
所以選擇n_clusters = 3是最佳的no。虹膜數據集的集羣。
選擇最優號碼。的集羣將取決於數據集的類型和我們試圖解決的問題。但大多數情況下,採用最高的輪廓係數會產生最佳數量的聚類。
希望它有幫助!
但是在你的例子中,是不是n = 2的更高的輪廓係數? – mattdeak
感謝@mattdeak指出。在這種情況下,選擇n = 3將是最好的,因爲虹膜數據集有三個物種,但同時也是輪廓coeff。並不是最高的。這看起來與較高的sillhouette coeff相矛盾。導致羣集的最佳數量。 您可以嘗試[gap static method](http://web.stanford.edu/~hastie/Papers/gap.pdf) –
請優化n_cluster == 3。謝謝 – Yogesh