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

这里写图片描述
通过判断彼此间的距离来实现聚类

#无监督:数据没有明确说明属于哪一类,无需去训练模型
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()

机器学习之无监督聚类问题_第1张图片

#离群点分析,距离最远
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  

你可能感兴趣的:(机器学习之无监督聚类问题)