代码之家  ›  专栏  ›  技术社区  ›  Suhail Gupta

值错误:标签数为1。使用剪影分数时,有效值为2到n_个样本-1(包括1个样本)

  •  4
  • Suhail Gupta  · 技术社区  · 7 年前

    我正在计算 silhouette score 当我找到要创建的最佳集群数时,会得到一个错误,它说:

    ValueError: Number of labels is 1. Valid values are 2 to n_samples - 1 (inclusive)
    

    我不明白为什么会这样。这是我用来聚类和计算的代码 轮廓分数 .

    我读取包含要群集和运行的文本的csv K-Means n 群集值。为什么我会出现这个错误?

      #Create cluster using K-Means
    #Only creates graph
    import matplotlib
    #matplotlib.use('Agg')
    import re
    import os
    import nltk, math, codecs
    import csv
    from nltk.corpus import stopwords
    from gensim.models import Doc2Vec
    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.metrics import silhouette_score
    
    model_name = checkpoint_save_path
    loaded_model = Doc2Vec.load(model_name)
    
    #Load the test csv file
    data = pd.read_csv(test_filename)
    overview = data['overview'].astype('str').tolist()
    overview = filter(bool, overview)
    vectors = []
    
    def split_words(text):
      return ''.join([x if x.isalnum() or x.isspace() else " " for x in text ]).split()
    
    def preprocess_document(text):
      sp_words = split_words(text)
      return sp_words
    
    for i, t in enumerate(overview):
      vectors.append(loaded_model.infer_vector(preprocess_document(t)))
    
    sse = {}
    silhouette = {}
    
    
    for k in range(1,15):
      km = KMeans(n_clusters=k, max_iter=1000, verbose = 0).fit(vectors)
      sse[k] = km.inertia_
      #FOLLOWING LINE CAUSES ERROR
      silhouette[k] = silhouette_score(vectors, km.labels_, metric='euclidean')
    
    best_cluster_size = 1
    min_error = float("inf")
    
    for cluster_size in sse:
        if sse[cluster_size] < min_error:
            min_error = sse[cluster_size]
            best_cluster_size = cluster_size
    
    print(sse)
    print("====")
    print(silhouette)
    
    2 回复  |  直到 7 年前
        1
  •  5
  •   seralouk    7 年前

    错误 产生的原因是您有一个针对不同数量集群的循环 n . 在第一次迭代中, n_clusters 1 这导致 all(km.labels_ == 0) 成为 True .

    换句话说, 只有一个带有标签0的群集 (因此, np.unique(km.labels_) 印刷品 array([0], dtype=int32) )


    silhouette_score 需要1个以上的群集标签 . 这会导致错误。错误消息已清除。


    例子:

    from sklearn import datasets
    from sklearn.cluster import KMeans
    import numpy as np
    
    iris = datasets.load_iris()
    X = iris.data
    y = iris.target
    
    km = KMeans(n_clusters=3)
    km.fit(X,y)
    
    # check how many unique labels do you have
    np.unique(km.labels_)
    #array([0, 1, 2], dtype=int32)
    

    我们有3个不同的集群/集群标签。

    silhouette_score(X, km.labels_, metric='euclidean')
    0.38788915189699597
    

    功能正常。


    现在,让我们来引起这个错误:

    km2 = KMeans(n_clusters=1)
    km2.fit(X,y)
    
    silhouette_score(X, km2.labels_, metric='euclidean')
    
    ValueError: Number of labels is 1. Valid values are 2 to n_samples - 1 (inclusive)
    
        2
  •  0
  •   Don A.R.B.N    7 年前

    从文件中,

    请注意,只有当标签数量为2<=n_标签<=n_样本-1时,才定义轮廓系数。

    所以解决这个问题的一个方法是 for k in range(1,15) ,尝试从k=2开始迭代,即 for k in range(2,15) . 这对我很有用。