我正在尝试使用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
所以我的问题是:如何在保留索引('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')
答案 0 :(得分:2)
似乎问题在于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文档中的索引和选择数据。
但简而言之,.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
应该按预期工作。