【问题标题】:How to Cluster Multidimentional and Unkown Data using KMeans?如何使用 KMeans 对多维和未知数据进行聚类?
【发布时间】:2020-02-16 13:25:46
【问题描述】:

我有两个关于使用 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 方法对此类数据进行聚类吗?

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

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

【问题讨论】:

标签: python machine-learning cluster-analysis k-means


【解决方案1】:

您可以使用 scikit-learns KMeans 模块来完成您想做的事情,这是一个使用您的数据的工作示例:

import numpy as np
from sklearn.cluster import KMeans
# loading your data from .npy-file
mystery = np.load('mystery.npy')
# n_clusters is a hyperparameter set by you
kmeans = KMeans(n_clusters=42, n_jobs=-1).fit(mystery[:1000])
pred = kmeans.predict(mystery[1000:1200])
print(pred)
array([36, 16, 21, 15, 15,  0,  5,  7, 31, 33, 10, 14,  1, 36, 30, 22, 12,
        1, 35, 12, 16, 12, 28, 14, 13, 15,  2, 21, 36,  7,  7,  4, 39,  4,
        4, 18,  5, 31, 17,  2,  2, 26, 38, 34, 34, 36, 13, 13, 26,  1, 26,
        8, 38,  0, 38, 34,  0, 21, 36, 12, 16, 38, 23, 15,  0,  6, 34,  0,
       19,  7,  8, 21, 16, 36, 24,  0,  4, 22, 33, 21, 12, 12,  2, 10, 23,
        2,  3,  0, 12,  0, 24, 21, 12, 33,  4, 14, 34, 10, 21,  0, 33, 26,
       36,  2, 12, 34, 29, 27, 33,  3, 12, 12, 15, 39, 34, 26, 26, 16,  8,
        2, 12,  0, 21, 15, 40, 16, 38, 22, 26, 36, 17,  3, 12,  3, 23, 39,
       34, 36, 33, 38, 15, 21,  7, 34, 23, 33, 34, 33, 26, 34, 26, 30, 16,
        2,  3,  0, 33, 34, 39, 12,  5, 34, 26, 33, 30, 39, 12,  2, 15, 29,
       12, 38, 36, 10, 36, 28,  1, 19, 12, 17, 32, 35, 11, 16, 28, 18, 14,
       15, 31, 34, 19,  0, 17, 12, 11, 39, 18, 26, 31,  0], dtype=int32)

如果您想使用完整的数据集,kmeans.fit(mystery) 可能需要一些时间,出于测试目的,我只使用了前 1000 个实例并预测了接下来的 200 个实例。

【讨论】:

    【解决方案2】:

    @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
    

    numpyx.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')
    

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2017-10-05
      • 2011-12-08
      • 1970-01-01
      • 2020-05-16
      • 2019-01-06
      • 2018-04-01
      • 1970-01-01
      • 2018-06-14
      相关资源
      最近更新 更多