机器学习 | 聚类分析总结 & 实战解析
聚类分析是没有给定划分类别的情况下,根据样本相似度进行样本分组的一种方法,是一种非监督的学习算法。聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或相似度划分为若干组,划分的原则是组内距离最小化而组间距离最大化,如下图所示:
常见的聚类分析算法如下:
- K-Means: K-均值聚类也称为快速聚类法,在最小化误差函数的基础上将数据划分为预定的类数K。该算法原理简单并便于处理大量数据。
- K-中心点:K-均值算法对孤立点的敏感性,K-中心点算法不采用簇中对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心。
- 系统聚类:也称为层次聚类,分类的单位由高到低呈树形结构,且所处的位置越低,其所包含的对象就越少,但这些对象间的共同特征越多。该聚类方法只适合在小数据量的时候使用,数据量大的时候速度会非常慢。
下面我们详细介绍K-Means聚类算法。 K-Means聚类算法 K-Means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。
算法实现
选择K个点作为初始质心 repeat 将每个点指派到最近的质心,形成K个簇 重新计算每个簇的质心 until 簇不发生变化或达到最大迭代次数
K如何确定 与层次聚类结合,经常会产生较好的聚类结果的一个有趣策略是,首先采用层次凝聚算法决定结果粗的数目,并找到一个初始聚类,然后用迭代重定位来改进该聚类。
初始质心的选取 常见的方法是随机的选取初始质心,但是这样簇的质量常常很差。 (1)多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。这种策略简单,但是效果可能不好,这取决于数据集和寻找的簇的个数。 (2)取一个样本,并使用层次聚类技术对它聚类。从层次聚类中提取K个簇,并用这些簇的质心作为初始质心。该方法通常很有效,但仅对下列情况有效:样本相对较小;K相对于样本大小较小。 (3)取所有点的质心作为第一个点。然后,对于每个后继初始质心,选择离已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。
距离的度量 常用的距离度量方法包括:欧几里得距离和余弦相似度。欧几里得距离度量会受指标不同单位刻度的影响,所以一般需要先进行标准化,同时距离越大,个体间差异越大;空间向量余弦夹角的相似度度量不会受指标刻度的影响,余弦值落于区间[-1,1],值越大,差异越小。
质心的计算 对于距离度量不管是采用欧式距离还是采用余弦相似度,簇的质心都是其均值。
算法停止条件 一般是目标函数达到最优或者达到最大的迭代次数即可终止。对于不同的距离度量,目标函数往往不同。当采用欧式距离时,目标函数一般为最小化对象到其簇质心的距离的平方和;当采用余弦相似度时,目标函数一般为最大化对象到其簇质心的余弦相似度和。
空聚类的处理 如果所有的点在指派步骤都未分配到某个簇,就会得到空簇。如果这种情况发生,则需要某种策略来选择一个替补质心,否则的话,平方误差将会偏大。 (1)选择一个距离当前任何质心最远的点。这将消除当前对总平方误差影响最大的点。 (2)从具有最大SSE的簇中选择一个替补的质心,这将分裂簇并降低聚类的总SSE。如果有多个空簇,则该过程重复多次。
适用范围及缺陷 K-Menas算法试图找到使平方误差准则函数最小的簇。当潜在的簇形状是凸面的,簇与簇之间区别较明显,且簇大小相近时,其聚类结果较理想。对于处理大数据集合,该算法非常高效,且伸缩性较好。 但该算法除了要事先确定簇数K和对初始聚类中心敏感外,经常以局部最优结束,同时对“噪声”和孤立点敏感,并且该方法不适于发现非凸面形状的簇或大小差别很大的簇。 克服缺点的方法:使用尽量多的数据;使用中位数代替均值来克服outlier的问题。
实例解析
>>> import pandas as pd
# 载入sklearn包自带数据集
>>> from sklearn.datasets importload_iris
>>> iris = load_iris()
# 需要聚类的数据150个样本,4个变量
>>> iris.data
>>> data = pd.DataFrame(iris.data)
# 数据标准化(z-score)
>>> data_zs = (data -data.mean())/data.std()
# 导入sklearn中的kmeans
>>> from sklearn.cluster importKMeans
# 设置类数k
>>> k = 3
# 设置最大迭代次数
>>> iteration = 500
# 创建kmeans对象
>>> model = KMeans(n_clusters=k,n_jobs=4,max_iter=iteration)
# 使用数据训练训练model
>>> model.fit(data_zs)
# 每个类别样本个数
>>> pd.Series(model.labels_).value_counts()
# 每个类别的聚类中心
>>> pd.DataFrame(model.cluster_centers_)
下面我们用TSNE(高维数据可视化工具)对聚类结果进行可视化
>>> import matplotlib.pyplot asplt
>>> from sklearn.manifold importTSNE >>> tsne = TSNE(learning_rate=100)
# 对数据进行降维
>>> tsne.fit_transform(data_zs)
>>> data =pd.DataFrame(tsne.embedding_, index=data_zs.index) # 不同类别用不同颜色和样式绘图
>>> d = data[model.labels_==0]
>>> plt.plot(d[0],d[1],'r.')
>>> d = data[model.labels_==1]
>>> plt.plot(d[0],d[1],'go')
>>> d = data[model.labels_==2]
>>> plt.plot(d[0],d[1],'b*')
>>> plt.show()
聚类效果图如下:
下面我们用PCA降维后,对聚类结果进行可视化
>>> from sklearn.decompositionimport PCA
>>> pca = PCA()
>>> data =pca.fit_transform(data_zs)
>>> data = pd.DataFrame(data,index=data_zs.index)
>>> d = data[model.labels_==0]
>>> plt.plot(d[0],d[1],'r.')
>>> d = data[model.labels_==1]
>>> plt.plot(d[0],d[1],'go')
>>> d = data[model.labels_==2]
>>> plt.plot(d[0],d[1],'b*')
>>> plt.show()
聚类效果图如下:
Python主要的聚类分析算法总结 在scikit-learn中实现的聚类算法主要包括K-Means、层次聚类、FCM、神经网络聚类,其主要相关函数如下:
- KMeans: K均值聚类;
- AffinityPropagation: 吸引力传播聚类,2007年提出,几乎优于所有其他方法,不需要指定聚类数K,但运行效率较低;
- MeanShift:均值漂移聚类算法;
- SpectralClustering:谱聚类,具有效果比KMeans好,速度比KMeans快等特点; 5.** AgglomerativeClustering**:层次聚类,给出一棵聚类层次树;
- DBSCAN:具有噪音的基于密度的聚类方法;
- BIRCH:综合的层次聚类算法,可以处理大规模数据的聚类。
这些方法的使用大同小异,基本都是先用对应的函数建立模型,然后用fit()方法来训练模型,训练好之后,就可以用labels_属性得到样本数据的标签,或者用predict()方法预测新样本的标签。
机器学习 | 聚类分析总结 & 实战解析的更多相关文章
- 006-Map、Tuple、Zip实战解析
006-Map.Tuple.Zip实战解析 实战代码 Map实战 本身是映射,映射关系在实际中应用非常广泛,比如:配置信息都是Key-Value形式 键值对不存在下边关系 是一个immutable(不 ...
- GJM : Unity3D 常用网络框架与实战解析 【笔记】
Unity常用网络框架与实战解析 1.Http协议 Http协议 存在TCP 之上 有时候 TLS\SSL 之上 默认端口80 https 默认端口 ...
- Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- AngularJS进阶(三十九)基于项目实战解析ng启动加载过程
基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...
- MySQL 主从复制实战解析
前言:前面几篇文章讲解了在应用层读写分离的配置和使用,这篇文章将来个主从复制的实战解析. 说明:主从复制,读写分离结构图 原理图 主库生成一个线程: Binlog Dump线程 1.此线程运行在主库, ...
- 牛客网数据库SQL实战解析(51-61题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(41-50题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(31-40题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(21-30题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
随机推荐
- js数组、对象处理
js arry: var arry = []; js object: var obj = {}; obj定义属性: obj.filename=''; obj.id=''; 把 obj 添加到 arry ...
- linux安装nvm和nodejs
下载nvm包: [root@centos ~]# wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install ...
- linux里安装使用svn
1.安装 sudo apt-get install subversion 2.checkout工程 svn checkout svn://192.168.0.3/测试工具 /home/testtool ...
- Linux的.a、.so和.o文件 对比 window下的dll,lib,exe文件
连续几天终于将一个又一个问题解决了,这里说其中一个问题 描述问题:使用多线程pthread的时候,(我用的IDE,CODEBOLCKS)编译后发现直接弹出窗口,程序还没有被Build..巴拉巴拉,然后 ...
- syncronizationcontext
FormDesign.cs 增加变量定义 public string testName { get; set; } TaskWrapper.cs string tmpTest = &qu ...
- SQL Server PARTITION FUNCTION(分区)
分区并不影响Linq,sql查询 在MSSQL中,选中目标表,右键-存储-创建分区 根据提示完成分区,存储成sql 这里展示如何根据Id的数据范围分区 在执行前,可能需要设置日志文件大小为" ...
- [QT] - HTTP文件传输服务器#工程源码
简介: 大学时期学习弄的一个小软件,当初做的目的是在实验室的局域网内方便同学之间文件的传输,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 打开软件,选择IP及需绑定的 ...
- Ubuntu下好用的pdf工具
安装okular sudo apt-get install okular 汉化 sudo apt-get install kde-l10n-zhcn 然后打开PDF文件时,右键选择打开方式选择okul ...
- mysql慢查询及查询优化
mysql默认是没有开启慢查询的 1 查看慢查询的配置状态 show variables like 'slow_query%'; slow_query_log 慢查询开启状态 slow_query_l ...
- Android调试桥 adb安装详解
Android调试桥(adb) 一.简介 Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Uni ...