首页 > 解决方案 > 如何使用 KMeans 对多维和未知数据进行聚类?

问题描述

我有两个关于使用 Python 进行 Kmeans 聚类的问题。

我有一个名为 Mystery.npy 的自动生成的数据,它的形状是 (30309, 784)。我正在尝试对其应用 KMeans 聚类,但出现以下错误:

valueerror: the truth value of an array with more than one element is ambiguous. use a.any() or a.all()

您是否知道如何克服此错误,或者如何使用 KMeans 方法对此类数据进行聚类?

第二个问题,是否有特定的代码可以知道我拥有的数据类型?

非常感谢您的帮助。谢谢,

标签: pythonmachine-learningcluster-analysisk-means

解决方案


@Nael Alsaleh,您可以通过以下方式运行 K-Means:

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt

X=np.load('Mistery.npy')

wx = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters = i, random_state = 0)
    kmeans.fit(X)
    wx.append(kmeans.inertia_)
plt.plot(range(1, 11), wx)
plt.xlabel('Number of clusters')
plt.ylabel('Variance Explained')
plt.show()

由簇数解释的方差

请注意,这X是一个 numpy 数组。此代码将创建肘部曲线,您可以在其中选择完美的簇数,在本例中为 5-6。

如果您使用 numpy,您将拥有一个数组:

array([0.86992608, 0.11252552, 0.25573737, ..., 0.32652233, 0.14927118,
        0.1662449 ])

您可能还使用列表,

[0.86992608, 0.11252552, 0.25573737, ..., 0.32652233, 0.14927118,
        0.1662449 ]

您将需要转换为array: np.array(X),甚至是Pandas数据框:

在此处输入图像描述

您可以通过执行以下操作检查数据框中的列类型Pandas

import pandas as pd
pd.DataFrame(X).dtypes

numpy,x.dtype

将数据转换为数组后,运行:

n=5
kmeans=KMeans(n_clusters=n, random_state=20).fit(X)
labels_of_clusters = kmeans.fit_predict(X)

这将为您提供每个示例所属的集群类的编号。

array([1, 4, 0, 0, 4, 1, 4, 0, 2, 0, 0, 4, 3, 1, 4, 2, 2, 3, 0, 1, 1, 0,
       4, 4, 2, 0, 3, 0, 3, 1, 1, 2, 1, 0, 2, 4, 0, 3, 2, 1, 1, 2, 2, 2,
       2, 0, 0, 4, 1, 3, 1, 0, 1, 4, 1, 0, 0, 0, 2, 0, 1, 2, 2, 1, 2, 2,
       0, 4, 4, 4, 4, 3, 1, 2, 1, 2, 2, 1, 1, 3, 4, 3, 3, 1, 0, 1, 2, 2,
       1, 2, 3, 1, 3, 3, 4, 2, 2, 0, 2, 1, 3, 4, 2, 0, 2, 1, 3, 3, 3, 4,
       3, 1, 4, 4, 4, 2, 0, 3, 2, 0, 1, 2, 2, 0, 3, 1, 1, 1, 4, 0, 2, 2,
       0, 0, 1, 1, 0, 3, 0, 2, 2, 1, 2, 2, 4, 0, 1, 0, 3, 1, 4, 4, 0, 4,
       1, 2, 0, 2, 4, 0, 1, 2, 3, 1, 1, 0, 3, 2, 4, 0, 1, 3, 1, 2, 4, 3,
       1, 1, 2, 0, 0, 2, 3, 1, 3, 4, 1, 2, 2, 0, 2, 1, 4, 3, 1, 0, 3, 2,
       4, 1, 4, 1, 4, 4, 0, 4, 4, 3, 1, 3, 4, 0, 4, 2, 1, 1, 3, 4, 0, 4,
       4, 4, 4, 2, 4, 2, 3, 4, 3, 3, 1, 1, 4, 2, 3, 0, 2, 4])

可视化:

from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs(n_samples=200, centers=4,
                       cluster_std=0.60, random_state=0)

kmeans = KMeans(n_clusters=4, random_state=0).fit(X)
cc=kmeans.fit_predict(X)

plt.scatter(X[:, 0], X[:, 1], c=cc, s=50, cmap='viridis')

K-均值


推荐阅读