学习sklearn聚类使用
学习利用sklearn的几个聚类方法:
一.几种聚类方法
1.高斯混合聚类(mixture of gaussians)
2.k均值聚类(kmeans)
3.密度聚类,均值漂移(mean shift)
4.层次聚类或连接聚类(ward最小离差平方和)
二.评估方法
1.完整性:值:0-1,同一个类别所有数据样本是否划分到同一个簇中
2.同质性:值:0-1,每个簇是否只包含同一个类别的样本
3.上面两个的调和均值
4.以上三种在评分时需要用到数据样本的真正标签,但实际很难做到。轮廓系数(1,-1):只使用聚类的数据,它计算的是每个数据样本与同簇数据样本和其它簇数据样本之间的相似度,因为从平均来看,与同簇比较起来,比其它簇更相似。
三.说明
1.kmeans与高斯需要指定簇的数量(n_clusters=2,n_components=2);均值漂移指定带宽(bandwidth=7);层次使用ward链接定义合并代价(距离),终止最大距离max_d。
2.图中可以看出高斯的评估指标最好,其次是均值漂移,k均值与层次较差
四.sklearn聚类
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn.cluster import KMeans
- from sklearn.cluster import MeanShift
- from sklearn.metrics import homogeneity_completeness_v_measure
- from sklearn import mixture
- from scipy.cluster.hierarchy import linkage
- from scipy.cluster.hierarchy import fcluster
- class ClusterMethod:
- def __init__(self):
- l1=np.zeros(100)
- l2=np.ones(100)
- self.labels=np.concatenate((l1,l2),)
- #随机创建两个二维正太分布,形成数据集
- def dataProduction(self):
- # 随机创建两个二维正太分布,形成数据集
- np.random.seed(4711)
- c1 = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[100, ])
- l1 = np.zeros(100)
- l2 = np.ones(100)
- # 一个100行的服从正态分布的二维数组
- c2 = np.random.multivariate_normal([0, 10], [[3, 1], [1, 4]], size=[100, ])
- # 加上一些噪音
- np.random.seed(1)
- noise1x = np.random.normal(0, 2, 100)
- noise1y = np.random.normal(0, 8, 100)
- noise2 = np.random.normal(0, 8, 100)
- c1[:, 0] += noise1x # 第0列加入噪音数据
- c1[:, 1] += noise1y
- c2[:, 1] += noise2
- # 定义绘图
- self.fig = plt.figure(figsize=(20, 15))
- # 添加子图,返回Axes实例,参数:子图总行数,子图总列数,子图位置
- ax = self.fig.add_subplot(111)
- # x轴
- ax.set_xlabel('x', fontsize=30)
- # y轴
- ax.set_ylabel('y', fontsize=30)
- # 标题
- self.fig.suptitle('classes', fontsize=30)
- # 连接
- labels = np.concatenate((l1, l2), )
- X = np.concatenate((c1, c2), )
- # 散点图
- pp1 = ax.scatter(c1[:, 0], c1[:, 1], cmap='prism', s=50, color='r')
- pp2 = ax.scatter(c2[:, 0], c2[:, 1], cmap='prism', s=50, color='g')
- ax.legend((pp1, pp2), ('class 1', 'class 2'), fontsize=35)
- self.fig.savefig('scatter.png')
- return X
- def clusterMethods(self):
- X=self.dataProduction()
- self.fig.clf()#reset plt
- self.fig,((axis1,axis2),(axis3,axis4))=plt.subplots(2,2,sharex='col',sharey='row')#函数返回一个figure图像和一个子图ax的array列表
- #k-means
- self.kMeans(X,axis1)
- #mean-shift
- self.meanShift(X,axis2)
- #gaussianMix
- self.gaussianMix(X,axis3)
- #hierarchicalWard
- self.hierarchicalWard(X,axis4)
- def kMeans(self,X,axis1):
- kmeans=KMeans(n_clusters=2)#聚类个数
- kmeans.fit(X)#训练
- pred_kmeans=kmeans.labels_#每个样本所属的类
- print('kmeans:',np.unique(kmeans.labels_))
- print('kmeans:',homogeneity_completeness_v_measure(self.labels,pred_kmeans))#评估方法,同质性,完整性,两者的调和平均
- #plt.scatter(X[:,0],X[:,1],c=kmeans.labels_,cmap='prism')
- axis1.scatter(X[:,0],X[:,1],c=kmeans.labels_,cmap='prism')
- axis1.set_ylabel('y',fontsize=40)
- axis1.set_title('k-means',fontsize=40)
- #plt.show()
- def meanShift(self,X,axis2):
- ms=MeanShift(bandwidth=7)#带宽
- ms.fit(X)
- pred_ms=ms.labels_
- axis2.scatter(X[:,0],X[:,1],c=pred_ms,cmap='prism')
- axis2.set_title('mean-shift',fontsize=40)
- print('mean-shift:',np.unique(ms.labels_))
- print('mean-shift:',homogeneity_completeness_v_measure(self.labels,pred_ms))
- def gaussianMix(self,X,axis3):
- gmm=mixture.GMM(n_components=2)
- gmm.fit(X)
- pred_gmm=gmm.predict(X)
- axis3.scatter(X[:, 0], X[:, 1], c=pred_gmm, cmap='prism')
- axis3.set_xlabel('x', fontsize=40)
- axis3.set_ylabel('y', fontsize=40)
- axis3.set_title('gaussian mixture', fontsize=40)
- print('gmm:',np.unique(pred_gmm))
- print('gmm:',homogeneity_completeness_v_measure(self.labels,pred_gmm))
- def hierarchicalWard(self,X,axis4):
- ward=linkage(X,'ward')#训练
- max_d=110#终止层次算法最大的连接距离
- pred_h=fcluster(ward,max_d,criterion='distance')#预测属于哪个类
- axis4.scatter(X[:,0], X[:,1], c=pred_h, cmap='prism')
- axis4.set_xlabel('x',fontsize=40)
- axis4.set_title('hierarchical ward',fontsize=40)
- print('ward:',np.unique(pred_h))
- print('ward:',homogeneity_completeness_v_measure(self.labels,pred_h))
- self.fig.set_size_inches(18.5,10.5)
- self.fig.savefig('comp_clustering.png',dpi=100)#保存图
- if __name__=='__main__':
- cluster=ClusterMethod()
- cluster.clusterMethods()
五.评估图
参考:1.Machine.Learning.An.Algorithmic.Perspective.2nd.Edition.
2.Machine Learning for the Web
学习sklearn聚类使用的更多相关文章
- 用scikit-learn学习DBSCAN聚类
在DBSCAN密度聚类算法中,我们对DBSCAN聚类算法的原理做了总结,本文就对如何用scikit-learn来学习DBSCAN聚类做一个总结,重点讲述参数的意义和需要调参的参数. 1. scikit ...
- 用scikit-learn学习K-Means聚类
在K-Means聚类算法原理中,我们对K-Means的原理做了总结,本文我们就来讨论用scikit-learn来学习K-Means聚类.重点讲述如何选择合适的k值. 1. K-Means类概述 在sc ...
- sklearn聚类模型:基于密度的DBSCAN;基于混合高斯模型的GMM
1 sklearn聚类方法详解 2 对比不同聚类算法在不同数据集上的表现 3 用scikit-learn学习K-Means聚类 4 用scikit-learn学习DBSCAN聚类 (基于密度的聚类) ...
- ArcGIS案例学习笔记-聚类点的空间统计特征
ArcGIS案例学习笔记-聚类点的空间统计特征 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:对于聚集点,根据分组字段case field,计算空间统计特征 ...
- 用scikit-learn学习BIRCH聚类
在BIRCH聚类算法原理中,我们对BIRCH聚类算法的原理做了总结,本文就对scikit-learn中BIRCH算法的使用做一个总结. 1. scikit-learn之BIRCH类 在scikit-l ...
- 用scikit-learn学习谱聚类
在谱聚类(spectral clustering)原理总结中,我们对谱聚类的原理做了总结.这里我们就对scikit-learn中谱聚类的使用做一个总结. 1. scikit-learn谱聚类概述 在s ...
- 机器学习之sklearn——聚类
生成数据集方法:sklearn.datasets.make_blobs(n_samples,n_featurs,centers)可以生成数据集,n_samples表示个数,n_features表示特征 ...
- sklearn聚类评价指标
sklearn中的指标都在sklearn.metric包下,与聚类相关的指标都在sklearn.metric.cluster包下,聚类相关的指标分为两类:有监督指标和无监督指标,这两类指标分别在skl ...
- 零基础学习Kmeans聚类算法的原理与实现过程
内容导入: 聚类是无监督学习的典型例子,聚类也能为企业运营中也发挥者巨大的作用,比如我们可以利用聚类对目标用户进行群体分类,把目标群体划分成几个具有明显特征区别的细分群体,从而可以在运营活动中为这些细 ...
随机推荐
- 【模板】SPFA(不完全详解)
一种最短路求法(个人觉得比DIJKSTRA好用) 用于有向图. 大概思路:从根节点开始,枚举每一个点,同时更新他们所联通的点的最短路径,如果路径被更新,则把这个点入队,一直重复这个操作直到队伍为空为止 ...
- # 丢包&&掉帧&&文件删除
丢包&&掉帧&&文件删除 丢包:指一个或多个数据包(packet)的数据无法透过网络到达目的地,丢失一些信息 掉帧:帧数就是在1秒钟时间里传输的图片的量,每一帧都是静止 ...
- Vue的响应系统
随着 Vue 3.0 Pre Alpha 版本的公布,我们得以一窥其源码的实现.Vue 最巧妙的特性之一是其响应式系统,而我们也能够在仓库的 packages/reactivity 模块下找到对应的实 ...
- composer命令介绍之install和update及其区别
composer 是 php 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 然而,对于如何『安装他们』,新手可能并不清楚.网上的答案有的说 composer in ...
- Python和其他编程语言
Python和其他编程语言 一.Python介绍 Python的创始人为吉多·范罗苏姆(Guido van Rossum),如下图,少数几个不秃头的语言创始人.1989年的圣诞节期间,Guido为了打 ...
- Java后端技术面试汇总(第五套)
1.Java相关 • 乐观悲观锁的设计,如何保证原子性,解决的问题:• char和double的字节,以及在内存的分布是怎样:• 对象内存布局,然后讲下对象的死亡过程?• 对象头,详细讲下:• syn ...
- Elasticsearch入门教程(五):Elasticsearch查询(一)
原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...
- yii的多表查询
获取用户发布消息的指定消息id的总和点赞数 Yii $productIds = ['2260', '2262', '2263', '2268', '2269']; $plSql = Like::fin ...
- 新增分区格式化时提示设备文件不存在:--- No such file or directory的处理方法
[原文链接]:http://blog.itpub.net/28874898/viewspace-774249/ 在系统中的空余空间添加新的分区: fdisk /dev/sda (第一块硬盘上) ...
- traceback:让你更加灵活地处理python的异常
异常 异常在python中是屡见不鲜了,程序在执行到某一行代码时,发现有问题,比如数组索引越界,变量没有定义啊等等,此时就会抛出异常 捕获异常 在python,一般都是使用try···except来对 ...