现在有一个数据集是美国国会投票的数据,数据集如图所示: 数据集第一列为name,表示国会议员的名字,第二列为议员政党R是共和党,D是民主党,I是无党派人士 后面的00001,00004表示的是法案的标号,0表示不支持,1表示支持 我们现在并不知道这个数据集的一些情况,但是我们可以通过聚类算法来看一下这个数据集有哪些特点 我们先来读取这个数据,然后看以下这些数据的均值,和各党派的人数 输出的结果为: value_counts()表示每个类别中的人数,通过输出的这个结果,可以看出R共和党为54人,D民主党为44ren,I无党派人士为2个人,这就是所有的议会中人员的组成。后面的是输出的均值,也就是每个议案的均值得多少分,0是0分,1是1分,得分高表示支持率大。 每个议员都会对每个法案投票,0是反对,1是支持,我们如何才能判断出两个议员之间的都投法案的相似度呢?我们可以使用欧式距离来表示两个样本之间的相似程度。 它的公式为: 假如以下面的两个议员数据来分析两个一下这两个议员的相似度,来看一下两个议员之间投票的相似度。 Cardin,D,MD,1,0,0,1,0,1,0,1,0,0,1,1,0,1,1Carper,D,DE,0,0,0,1,0,1,0,1,0,0,0,1,0,1,1 那么此时x1=1,y1=0 x2=0,y1=0 以此类推,通过这个公式算出来的就是欧式距离,欧式距离越小就表示样本之间的差距越小,越相似。在python中已经封装好了这个方法,我们可以通过调用这个方法来完成计算欧式距离的操作 这个euclidean_distances为欧式距离,可以通过这个方法来计算欧式距离 votes.iloc[0,3:]获取第一行的第三列开始的所有数据 votes.iloc[1,3:]获取第二行的第三列开始的所有数据 默认是数据是列的形式,然后改变其形状改成(1,-1),也就是行的形式 输出的结果就是两个样本之间的距离。距离值为:[[1.73205081]] 下面通过python的库来直接使用kmeans来聚合这些数据 这个表示聚合成两个簇,random_state表示两个中心点不是随机的,而是在random_state=1的那个固定的位置 kmeans_model_transform表示拟合数据,它会将传入的数据聚类,聚成两类,拟合数据的返回值为样本距离聚簇中心点的距离 这个就是 senator_distances的值,是有多少个样本就有多少行,聚成多少个簇就有多少列,比如第一个【3.12141628 1.3134775】就表示该瘦身样本与聚簇中心1的距离是3.12141628,与聚簇中心2的距离是1.3134775,第二行就表示第二个样本分别与聚簇中心的距离。 labels为聚类之后的类别,我们输出labels的结果为: 可以看出有些样本被分到了1,有些样本被分到了0,那么这就表示分类成功了,为了更加清晰的可以看出聚类的情况,我们可以以图像的形式进行显示: 通过图,我们可以看出这些样本点的聚类情况,我们还可以使用另外一种方式 print(pd.crosstab(labels, votes["party"])) 交叉表crosstab,可以按照指定的行和列统计分组频数,用起来非常方便,行就是labels,列就是votes["party"],我们输出它的效果为: 这个看着很清晰,可以看出D党派的聚类中有41个人聚到了0,还有3个人聚到了1 而R党派中全部的54个人都聚到了类别1中,这就是非常直观的情况 我们可以通过这个还可以发现,D党派中有3个人是偏向R党派的,所以我们下面的任务是把这些人给找出来,来看这三个人究竟是谁? democratic_outliers=votes[(labels==1) & (votes["party"]=="D")] print(democratic_outliers) 这个代码就是选出聚类类别是1的,并且党派还是D的,我们输出这个,就可以看到这三个人究竟是谁? 我们已经将数据聚成了两个类,但是有一种点叫做离群点,就是说这个样本点无论它属于哪个簇,它距离所有簇的中心点都是很远的额,这就是离群点。我们通过什么样的方式才能找到这样的离群点呢? 我们在上面已经获取了样本与聚簇中心点之间的距离 senator_distances,所以只要距离和最大的就是离群点了,但是有一种情况是他恰好在两者的中间的位置,那么它不是离群点,但是它距离聚簇中心点的距离和加起来也不小,为了防止出现这种问题,我们不能简单的相加,而是将其来个立方,这样的话,刚才的情况的值会很小。 这个就是将样本与聚簇中心点的距离算一个立方,然后加起来,然后创造一个新的列extremism,然后对votes根据extremism进行排序,输出结果为: 可以每个样本与聚簇中心的距离,越大就表示越远,可以定义为离群点。 |
|
来自: 新用户0175WbuX > 《待分类》