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