K-Means 按组分类

Posted

技术标签:

【中文标题】K-Means 按组分类【英文标题】:K-Means classification by group 【发布时间】:2021-09-14 20:03:16 【问题描述】:

我正在尝试在这样的数据框中进行 K-means 分析:

    URBAN AREA  PROVINCE    DENSITY
0   1          TRUJILLO     0.30
1   2          TRUJILLO     0.03
2   3          TRUJILLO     0.80
3   1          LIMA         1.20
4   2          LIMA         0.04
5   1          LAMBAYEQUE   0.90
6   2          LAMBAYEQUE   0.10
7   3          LAMBAYEQUE   0.08

(可以从here下载)

如您所见,df 指的是省内不同的城市区域(具有不同的城市密度值)。所以,我想通过一列进行 K-means 分类:DENSITY。为此,我执行以下代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

df=pd.read_csv('C:/Path/to/example.csv')

clustering=KMeans(n_clusters=2, max_iter=300)
clustering.fit(df[['DENSITY']])

df['KMeans_Clusters']=clustering.labels_
df

我得到了这个结果,这对于示例的第一部分来说是可以的:

    URBAN AREA  PROVINCE    DENSITY     KMeans_Clusters
0   1           TRUJILLO       0.30     0
1   2           TRUJILLO       0.03     0
2   3           TRUJILLO       0.80     1
3   1           LIMA           1.20     1
4   2           LIMA           0.04     0
5   1           LAMBAYEQUE     0.90     1
6   2           LAMBAYEQUE     0.10     0
7   3           LAMBAYEQUE     0.08     0

但现在我想按省份对城市地区进行 k-means 分类。我的意思是,在任何省份重复同样的过程。所以我试过这段代码:

df=pd.read_csv('C:/Users/rojas/Desktop/example.csv')

clustering=KMeans(n_clusters=2, max_iter=300)

clustering.fit(df[['DENSITY']]).groupby('PROVINCE')

df['KMeans_Clusters']=clustering.labels_
df

但我收到此消息:

AttributeError                            Traceback (most recent call last)
<ipython-input-4-87e7696ff61a> in <module>
      3 clustering=KMeans(n_clusters=2, max_iter=300)
      4 
----> 5 clustering.fit(df[['DENSITY']]).groupby('PROVINCE')
      6 
      7 df['KMeans_Clusters']=clustering.labels_

AttributeError: 'KMeans' object has no attribute 'groupby'

有办法吗?

【问题讨论】:

改用clustering.fit(df.groupby('PROVINCE')['DENSITY']) @DavidLee 我明白了:ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 2 dimensions. The detected shape was (3, 2) + inhomogeneous part. 【参考方案1】:

试试这个

def k_means(row):
    clustering=KMeans(n_clusters=2, max_iter=300)
    model = clustering.fit(row[['DENSITY']])
    row['KMeans_Clusters'] = model.labels_
    return row

df = df.groupby('PROVINCE').apply(k_means)

结果

URBAN   AREA    PROVINCE    DENSITY KMeans_Clusters
0   0   1   TRUJILLO    0.30    0
1   1   2   TRUJILLO    0.03    0
2   2   3   TRUJILLO    0.80    1
3   3   1   LIMA    1.20    1
4   4   2   LIMA    0.04    0
5   5   1   LAMBAYEQUE  0.90    0
6   6   2   LAMBAYEQUE  0.10    1
7   7   3   LAMBAYEQUE  0.08    1

【讨论】:

谢谢。有用。如果不是很麻烦,你能解释一下defreturn 函数吗?我也不知道row 做了什么(在第一行代码中)。 所以在这个例子中我创建了我自己的函数并将它应用到你的数据框。您遇到的问题是您试图在不是数据框的对象上使用“groupby”方法。因此,要解决该问题,您首先按“PROVINCE”对数据框进行分组,然后通过对组应用函数来拟合模型。当您将函数应用于分组数据帧时,每个组都单独传递到函数中。您可以通过在函数 k_means 中粘贴“print(row)”来看到这一点 def 是define 的缩写,用于定义函数。 return 是您要从该函数返回的值

以上是关于K-Means 按组分类的主要内容,如果未能解决你的问题,请参考以下文章

使用k-means进行面部表情分类

matlab下利用K-Means进行图像分类

利用K-means聚类分类,进行特征学习

如何使用K-MEANS聚类算法解决分类问题

半监督分类基于K-means和Label+Propagation的半监督网页分类

K-Means 实现图像分割