算法概述
机器学习算法可以分为三大类:监督学习、无监督学习和强化学习。监督学习可用于一个特定的数据集(训练集)具有某一属性(标签),但是其他数据没有标签或者需要预测标签的情况。无监督学习可用于给定的没有标签的数据集(数据不是预分配好的),目的就是要找出数据间的潜在关系。强化学习位于这两者之间,每次预测都有一定形式的反馈,但是没有精确的标签或者错误信息。下面我们就把机器学习中常用的十几种算法给大家罗列一下,也是我们后续学习的课程目录的主要内容:
- 决策树,Decision Trees
- 随机森林,RF
- 回归(Logistic回归、线性回归)
- 主成分分析,PCA
- 线性判别分析,LDA
- 支持向量机,SVM
- 朴素贝叶斯,Naïve Bayesian
- K-近邻法,KNN
- 聚类,Clustering
- 马尔可夫,Markov
- 奇异值分解,SVD
- 集成方法,EM
聚类算法
今天,我们就从最为常用的聚类分析开始,给大家逐个讲解常用的机器学习算法。所谓聚类算法(clustering analysis)是指将一堆没有标签的数据自动划分成几类的方法,属于无监督学习方法。通俗的讲,就是给你一堆杂七杂八的样本数据把它们分成几个组,组内成员有一定的相似,不同组之间成员有一定的差别。看下面一张图,我们就明白“聚类”具体是做什么的了。
很多人把“聚类”和“分类”搞不清楚,两者所用的算法也是傻傻分不清楚,今天我们就来给大家好好讲讲。我们知道『物以类聚,人以群分』,“聚类分析”和“分类分析(Classification analysis)”不同。两者主要区别在于,分类是将一组数据根据不同的类区分,已经知道有哪些类,也就是数据已经有了类的标签。而聚类是一种事先不知道有多少类,通过算法学习,分出来了一些类别。分类跟聚类也分别是有监督学习和无监督学习的范畴。比如垃圾分类就是分类算法,我们事先已经知道垃圾分为干垃圾、厨余垃圾、可回收垃圾和有害垃圾等;而聚类是事先不知道的,打扫房间时你把杂物都分分类,这是聚类,你事先不知道所有的杂物改分为几类,你可能按照物品的用途分为3类,也可以按照物品大小分5类,这都是有可能的。聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来。总而言之,我们要清楚何为“聚类”,不要将其与“分类”概念搞混淆。
聚类的基本思想
基本设定:给定一个有N个对象的数据集,构造数据的K个簇,k<=n,并且满足下列条件:
- 每一个簇至少包含一个对象。
- 每一个对象属于且仅属于一个簇。
- 将满足上述条件的K个簇称作一个合理划分。
基本思想:对于给定的类别K,首先给定初始的划分,通过迭代改变样本和簇的隶属关系,使得每一次改进之后的划分方案都较前一次好。
最终目标:根据样本之间的距离或者说是相似性(亲疏性),把越相似、差异越小的样本聚成一类(簇),最后形成多个簇,使同一个簇内部的样本相似度高,不同簇之间差异性高。
K-Means算法
01
基本概念
要学习聚类算法,我们就从最经典的开始。K-means算法,也被称为K-平均或K-均值,是一种广泛使用的聚类算法,或者成为其他聚类算法的基础,它是基于点与点距离的相似度来计算最佳类别归属。我们先讲几个相关概念:
- K值:要得到的簇的个数;
- 质心:每个簇的均值向量,即向量各维取平均即可;
- 距离量度:常用欧几里得距离和余弦相似度(先标准化);
02
算法流程
- 首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。
- 从数据集中随机选择k个数据点作为质心。
- 对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。
- 把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。
- 如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。
- 如果新质心和原质心距离变化很大,需要迭代3~5步骤。
这个过程看似复杂难以理解,其实看得多了就容易明白,具体流程的演示如下图所示。
03
算法实例
在开始实例演示之前,我们说点题外话,那就是编程语言的问题。关于机器学习,有几种推荐的语言可以选择,有些人说Python,有些人说R,当然两种语言都可以。对于我们来说,因为我们不着重流程开发,而重点是数据解读和操作,所以还是用R语言多一点。不过,如果大家精力充足,建议Python和R都可以去学习一下的。
在这里,为了体现K-means算法的特点,我们用一个比较经典的数据来进行展示。简单介绍一下数据,这个数据是美国50个州的犯罪率统计,总共50行,4列。当然,对我们来说,这个数据只是一个演示,你也可以用自己的基因表达数据,或者甲基化数据,或者突变位点数据,或者检测到的各种数值。我们来看下,R代码如下所示,我们通过kmeans()函数去进行聚类分析,选定的初始k值是2,然后用factoextra包中的函数fviz_cluster()去进行可视化。结果如下:
当然,正如我们前面在介绍K-means聚类的时候所说的,k值是可以自己调整的,我们把k调整为3,4,5都可以,其聚类的结果就是我们定义的簇数。结果如下所示:
关于Kmeans聚类的算法实现,我们讲到这里,最关键的:文末联系客服领取代码。
04
算法总结
我们来总结一下Kmeans算法的优缺点,以及我们在使用中的注意事项。
优点:
- 一种经典算法,简单,快速的聚类算法;
- 对于大数据集,该算法保持可伸缩性和高效率;
- 当簇近似为高斯分布时,它的效果较好;
缺点:
- 在簇的平均值可被定义的情况下才能使用,可能不适用某些情况;
- 必须实现给出K(聚类的簇数目),而且是初值敏感的,对于不同的初始值,可能会导致不同的结果;
- 不适合于发现非凸型的簇或者大小差别很大的簇;
- 对噪声和孤立点数据敏感;
使用前注意事项:
- 对数据异常值的处理;
- 对数据标准化处理;
- 每一个类别的数量要大体均等;
本章小结
本节内容比较多,我们讲解了机器学习的算法概论,特别是聚类算法,其中着重解读和演示了Kmeans算法。Kmeans算法在我们的日常科研工作中用处颇多,举个实际的例子,我们检测了100个肿瘤病人的突变位点,想要用突变位点对病人进行分子分型,比如高危组、中危组、低危组等,这个时候不妨试试看K-means聚类哦。好了,关于Kmeans聚类,我们讲到这里,赶紧领取代码,拿着自己的数据做起来吧。