Python K-均值,膝盖定位器,不太正确

Python K-均值,膝盖定位器,不太正确,python,machine-learning,cluster-analysis,k-means,Python,Machine Learning,Cluster Analysis,K Means,使用我在这里和google中找到的一些代码,我制作了一个基于Knee的kmeans聚类算法。定位器: def kmeans_clustering(data_set: pd.DataFrame, column: str, clusters_count: int): '''K means clustering on dataframe, choosing specific columns and cluster count''' data_set = data_set[column]

使用我在这里和google中找到的一些代码,我制作了一个基于Knee的kmeans聚类算法。定位器:

def kmeans_clustering(data_set: pd.DataFrame, column: str, clusters_count: int):
    '''K means clustering on dataframe, choosing specific columns and cluster count'''
    data_set = data_set[column].to_numpy()
    data_values = data_set.reshape(-1, 1)
    kmeans = KMeans(n_clusters=clusters_count).fit(data_values)
    y = kmeans.fit_predict(data_values)  # prediction of k
    frame = pd.DataFrame(y, index=data_set.index)
    frame.index = frame.index[frame.index.isin(data_set.index)]
    return frame.join(data_set)

wcss =[]
    for i in range(1, 11):
        kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
        kmeans.fit(RTN)
        wcss.append(kmeans.inertia_)
    kn = KneeLocator(
                        range(1, 11), wcss,  # put range in variable
                        curve='convex',
                        direction='decreasing', interp_method='interp1d')

for i in RTN:
    frame = kmeans_clustering(data_set=RTN, column= val, clusters_count= kn.knee)

for i in RTN:
    frame = kmeans_clustering(data_set=RTN, column= val, clusters_count= kn.knee)
我的数据帧是“RTN”。以“val”表示的列(大约有1000个)。运行代码后,我收到以下警告:

ConvergenceWarning: Number of distinct clusters (3) found smaller than n_clusters (4). Possibly due to duplicate points in X.
  kmeans = KMeans(n_clusters=clusters_count).fit(data_values)
C:\Users\AppData\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\cluster\_kmeans.py:1122: ConvergenceWarning: Number of distinct clusters (3) found smaller than n_clusters (4). Possibly due to duplicate points in X.
  return self.fit(X, sample_weight=sample_weight).labels_

我知道我可能做了“双重手术”,但哪里出了问题?

我想你没有做错。这只是意味着KMeans没有找到足够的集群。您知道,KMeans在您的集合中选择许多数据点来构建集群。然后将其余的点指定给这些簇,并计算这些簇的“中心”,然后将所有点再次关联到最近的中心,依此类推,直到不再有任何更改

在此过程中,可能会发生这样的情况:分配给一个集群的数据点都被附近的其他集群“捕获”,因此集群的数量会变小。这在很大程度上取决于开始集群的数据点的初始选择

因此,您可以尝试设置random_state参数,以查看是否可以获得所需的簇数。如果使用该参数,还可以使用相同的集群大小进行少量运行,并针对每个集群大小(最小的
惯性
)进行最佳集群。您可能还想使用
init
参数

这里有一个例子:


Immagine,您希望将点聚集在四个簇中。如果你运气不好,随机选择使用了四个红色点。在初始阶段使用这种设置,几乎可以肯定的是,中间的3个单点被添加到一个集群,而三个外部结构将获得它们自己的集群。因此,在第一个聚类步骤之后,内部聚类(具有三个内点)将被分配到这3个点中间的一个点,但与此同时,外部星团的中点也会朝着三个点移动,最终可能会导致中点更接近外部星团的中点,从而被外部星团“捕获”,这将导致内部群集不再包含点并消失。

感谢您的响应。如果我不想改变什么,我还可以继续看结果吗?还是我应该尝试另一种算法?第二个问题,“wcss”之后的部分困扰着我,因为我在n_簇中选择了1-11之间的数字,然后我使用knee来找到正确的n_簇,我在for循环中使用kn.knee.TBH,我不确定我的代码是否执行了正确的操作,因为我使用了“I”来检测要选择knee的簇的数量,然后是def本身使用的Knee方法。我自己还没有使用
KneeLocator
,但是从api doku来看,您的调用看起来不错。你已经画好曲线了吗?里面有一个清晰的“膝盖”吗?如果有什么不对劲,那么很可能与您的数据有关。例如,过多地查看不同的点等。如果数据帧中有数据,可以尝试
在其上放置重复项()
,以查看实际有多少不同的数据点。您的参数
n_init=10
已经让KMeans尝试了10次来获得一个好的集群,但我认为这并不意味着它一定会选择一个具有
n_集群
的集群,……因为可能会有集群较少且
intertia
较低的集群(由上述效果产生)。但如果将膝部应用于包含两个或多个连续值且簇数相同的曲线,则膝部可能会被误导并检测到“膝部”。因此,我建议将
n_init
设置为1,并添加一个循环,尝试并选择最好的约束,找到的实际聚类数等于
n_clusters
你是对的,我的数据中有许多相同的点,但我在每一列上分别使用K表示,如果我每列只有3或4个不同的点,使用它是否正确?