使用 sklearn 在 3 维上进行 K 均值聚类

Posted

技术标签:

【中文标题】使用 sklearn 在 3 维上进行 K 均值聚类【英文标题】:K-means clustering on 3 dimensions with sklearn 【发布时间】:2017-11-30 16:32:24 【问题描述】:

我正在尝试使用 lat/lon 作为 X/Y 轴和 DaysUntilDueDate 作为我的 Z 轴对数据进行聚类。我还想保留索引列 ('PM'),以便稍后使用此聚类分析创建计划。我发现here 的教程非常棒,但我不知道它是否考虑了 Z 轴,而且我四处寻找除了错误之外没有任何结果。我认为代码中的重点是这一行的iloc位的参数:

kmeans_model = KMeans(n_clusters=k, random_state=1).fit(A.iloc[:, :])

我尝试将此部分更改为 iloc[1:4](仅适用于第 1-3 列),但这导致了以下错误:

ValueError: n_samples=3 should be >= n_clusters=4

所以我的问题是:如何设置我的代码以在 3 维上运行聚类分析,同时保留索引 ('PM') 列?

这是我的python文件,感谢您的帮助:

from sklearn.cluster import KMeans
import csv
import pandas as pd

# Import csv file with data in following columns:
#    [PM (index)] [Longitude] [Latitude] [DaysUntilDueDate]

df = pd.read_csv('point_data_test.csv',index_col=['PM'])

numProjects = len(df)
K = numProjects // 3    # Around three projects can be worked per day


print("Number of projects: ", numProjects)
print("K-clusters: ", K)

for k in range(1, K):
    # Create a kmeans model on our data, using k clusters.
    #   Random_state helps ensure that the algorithm returns the
    #   same results each time.
    kmeans_model = KMeans(n_clusters=k, random_state=1).fit(df.iloc[:, :])

    # These are our fitted labels for clusters --
    #   the first cluster has label 0, and the second has label 1.
    labels = kmeans_model.labels_

    # Sum of distances of samples to their closest cluster center
    SSE = kmeans_model.inertia_

print("k:",k, " SSE:", SSE)

# Add labels to df
df['Labels'] = labels
#print(df)

df.to_csv('test_KMeans_out.csv')

【问题讨论】:

【参考方案1】:

看来问题出在iloc[1:4] 的语法上。

从你的问题看来你改变了:

kmeans_model = KMeans(n_clusters=k, random_state=1).fit(df.iloc[:, :])

到:

kmeans_model = KMeans(n_clusters=k, random_state=1).fit(df.iloc[1:4])

在我看来,要么您有错字,要么您不了解 iloc 的工作原理。所以我会解释的。

您应该首先阅读 Pandas 文档中的 Indexing and Selecting Data。

但简而言之,.iloc 是一种基于整数的索引方法,用于按位置选择数据。

假设你有数据框:

 A    B    C
 1    2    3
 4    5    6
 7    8    9
10   11   12  

在您提供的示例中使用 iloc iloc[:,:] 会选择所有行和列并生成整个数据框。如果您不熟悉 Python 的切片符号,请查看问题Explain slice notation 或An Informal Introduction to Python 的文档。您所说的示例导致您的错误iloc[1:4] 选择索引 1-3 处的行。这将导致:

 A    B    C
 4    5    6
 7    8    9
10   11   12 

现在,如果您考虑一下您正在尝试做什么以及您收到的错误,您会意识到您从数据中选择的样本数量少于您正在寻找的集群。 3 个样本(第 1、2、3 行),但您告诉 KMeans 找到 4 个集群,这是不可能的。

您真正打算做的(据我了解)是选择与您的 lat、lng 和 z 值相对应的所有行和列 1-3。为此,只需添加一个冒号作为 iloc 的第一个参数,如下所示:

df.iloc[:, 1:4]

现在您将选择所有样本以及索引 1、2 和 3 处的列。现在,假设您有足够的样本,KMeans 应该可以按预期工作。

【讨论】:

以上是关于使用 sklearn 在 3 维上进行 K 均值聚类的主要内容,如果未能解决你的问题,请参考以下文章

使用 sklearn.cluster 进行 K 均值聚类

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

Sklearn K均值聚类

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

学习sklearn聚类使用

K均值算法