使用 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 均值聚类的主要内容,如果未能解决你的问题,请参考以下文章
聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用