K-means使用sklearn在3维上进行聚类

时间:2017-06-27 14:48:25

标签: python pandas multidimensional-array scikit-learn k-means

我正在尝试使用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')

1 个答案:

答案 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 notationAn 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应该按预期工作。