机器学习之无监督聚类问题

本文通过使用Python的pandas和sklearn库,介绍了如何应用K-means算法进行无监督聚类分析。通过对美国国会投票记录数据集进行预处理及分析,展示了如何计算样本间的欧式距离,并运用K-means算法对参议员的投票行为进行聚类,最终通过图表形式直观展示聚类结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#无监督:数据没有明确说明属于哪一类,无需去训练模型
import pandas as pd
votes = pd.read_csv("D:\\test\machineLearning\\114_congress.csv")

print(votes["party"].value_counts())
print votes.mean()
R    54
D    44
I     2
Name: party, dtype: int64
00001    0.325
00004    0.575
00005    0.535
00006    0.945
00007    0.545
00008    0.415
00009    0.545
00010    0.985
00020    0.525
00026    0.545
00032    0.410
00038    0.480
00039    0.510
00044    0.460
00047    0.370
dtype: float64
from sklearn.metrics.pairwise import euclidean_distances
#欧式距离
#reshape指定了行的维度,-1代表列的维度由程序自己推断
print(euclidean_distances(votes.iloc[0,3:].reshape(1,-1),votes.iloc[1,3:].reshape(1,-1)))

distance = euclidean_distances(votes.iloc[0,3:].reshape(1,-1),votes.iloc[2,3:].reshape(1,-1))
[[ 1.73205081]]
import pandas as pd
from sklearn.cluster import KMeans
#KMeans是聚类算法的一种,n_clusters是堆的个数,你需要分成几类,
#random_state=1代表随机值是一样的,这样一来聚类的结果也是一样的
kmeans_model = KMeans(n_clusters=2,random_state=1)
#求出分类后的距离
senator_distances = kmeans_model.fit_transform(votes.iloc[:,3:])
#分成2类,0,1代表不同的类,label就是将这些打印出来
labels=kmeans_model.labels_
#print labels 
#从这一步分数据可以看出,数据被分成2类,其中D和R区分明显,说明分类有效
#crosstab生成一个列表,统计一下不同的label有多少值
print(pd.crosstab(labels,votes["party"]))
democratic = votes[(labels == 1)&(votes["party"]!="D")]
party   D  I   R
row_0           
0      41  2   0
1       3  0  54
#以上数据label为1的D有3个,和R走的很近,如何将他们找出来
democratic = votes[(labels == 1)&(votes["party"]=="D")]
print democratic
        name party state  00001  00004  00005  00006  00007  00008  00009  \
42  Heitkamp     D    ND    0.0    1.0    0.0    1.0    0.0    0.0    1.0   
56   Manchin     D    WV    0.0    1.0    0.0    1.0    0.0    0.0    1.0   
74      Reid     D    NV    0.5    0.5    0.5    0.5    0.5    0.5    0.5   

    00010  00020  00026  00032  00038  00039  00044  00047  
42    1.0    0.0    0.0    0.0    1.0    0.0    0.0    0.0  
56    1.0    1.0    0.0    0.0    1.0    1.0    0.0    0.0  
74    0.5    0.5    0.5    0.5    0.5    0.5    0.5    0.5  
import matplotlib.pyplot as plt
#用散点图表示,使数据更加清晰
plt.scatter(x=senator_distances[:,0],y=senator_distances[:,1],c=labels)
plt.show()

这里写图片描述

#离群点分析,距离最远
extremism = (senator_distances ** 3).sum(axis=1)
votes["extremism"] = extremism
votes.sort_values("extremism",inplace=True,ascending=False)
print votes.head(2)
        name party state  00001  00004  00005  00006  00007  00008  00009  \
98    Wicker     R    MS    0.0    1.0    1.0    1.0    1.0    0.0    1.0   
53  Lankford     R    OK    0.0    1.0    1.0    0.0    1.0    0.0    1.0   

    00010  00020  00026  00032  00038  00039  00044  00047  extremism  
98    0.0    1.0    1.0    0.0    0.0    1.0    0.0    0.0  46.250476  
53    1.0    1.0    1.0    0.0    0.0    1.0    0.0    0.0  46.046873  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值