使用K-Means算法进行分组分类

3

我正在尝试在类似这样的数据框中进行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

你可以从这里下载它。
正如你所看到的,"df"指的是省内不同城市地区(具有不同的城市密度值)。因此,我想通过一个名为"DENSITY"的列进行K-means分类。为此,我执行了以下代码:
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']) - David Lee
@DavidLee 我得到了这个错误信息:ValueError: 用序列设置数组元素。请求的数组在2维后具有不同形状。检测到的形状为(3, 2)+ 不同部分。 - José Rojas
1个回答

2

试试这个

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 是做什么的。 - José Rojas
3
在这个例子中,我创建了自己的函数并将其应用于您的数据框。你遇到的问题是试图在不是数据帧的对象上使用“groupby”方法。为了解决这个问题,你首先按“PROVINCE”对数据帧进行分组,然后通过将函数应用于该组来拟合模型。当你将一个函数应用于分组的数据框时,每个组都会独立地传递到函数中。你可以通过在函数k_means中加入“print(row)”来看到这一点。 - fthomson
1
def是define的缩写,用于定义函数。return是你想从该函数返回的值。 - fthomson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接