本文仅对常见的无监督学习算法进行了简单讲述,其他的如自动编码器,受限玻尔兹曼机用于无监督学习,神经网络用于无监督学习等未包括。同时虽然整体上分为了聚类和降维两大类,但实际上这两类并非完全正交,很多地方可以相互转化,还有一些变种的算法既有聚类功能又有降维功能,一些新出现的和尚在开发创造中的无监督学习算法正在打破聚类和降维的类别划分。另外因时间原因,可能有个别小错误,如有发现还望指出。
一.聚类(clustering)
1.k-均值聚类(k-means)
这是机器学习领域除了线性回归最简单的算法了。该算法用来对n维空间内的点根据欧式距离远近程度进行分类。
INPUT:
K(number of clusters)
Training set{x1,x2,x3,....xn} (xibelongsto R^n)
OUTPUT:
K个聚类中心
算法工作原理摘要:
自己手写的python实现K—means:
#簇数为k
#数据空间维度为n
#训练集元素数为m
defK_means_demo(k,n,m):
clusters=np.random.randint(0,40,size=[k,n]) #随机生成聚类中心
tr_set=np.random.randint(0,40,size=[m,n]) #因为是模拟,所以自己随机生成的数据集for iter in range(0,5):
clu_asist=np.zeros(shape=[k,n],dtype=int)for i in range(0,m): #遍历训练集内每个样本
min=9999999owner=0for j in range(0,k): #遍历所有聚心找到最近的聚心owner
dis=0for p inrange(0,n):
abso=tr_set[i][p] -clusters[j][p]
dis+=abso*abso #dis为第i个元素和第j个聚心的欧式距离的平方
if dis-min <0:
min=dis
owner=jfor p in range(0,n): #渐进更新均值
clu_asist[owner][p]+=(tr_set[i][p]-clu_asist[owner][p])//(p+1)
clusters=clu_asist
return clusters
在上面的代码中我手动设定了迭代更新次数为5,因为我做的demo规模比较小,迭代几次便收敛了,而在实际使用中一般用( 迭代次数 || EarlyStop )作为迭代终止条件。
动画演示:
通读本算法,可以发现k-means对聚心初始值非常敏感,如果初始情况不好会震荡的。这里可以采取一些措施预判聚心大致要在哪个位置,然后直接将其初始化。
另外,关于收敛的判断,可以采取多种方法。比如使用代价函数
,或者F-Measure和信息熵方法。
K-means优缺点分析:
- 优点:算法简单易实现;
- 缺点:需要用户事先指定类簇个数;聚类结果对初始类簇中心的选取较为敏感;容易陷入局部最优;只能发现球形类簇。
2.层次聚类(Hierarchical Clustering)
顾名思义,层次聚类就是一层一层地进行聚类。既可以由下向上对小的类别进行聚合(凝聚法),也可以由上向下对大的类别进行分割(分裂法)。在应用中,使用较多的是凝聚法。
INPUT:training_set D,聚类数目或者某个条件(一般是样本距离的阈值)
OUTPUT:聚类结果
凝聚法:
跟竞赛中经常出现的并查集问题略相似,凝聚法指的是先将每个样本当做一个类簇,然后依据某种规则合并这些初始的类簇,直到达到某种条件或者减少到设定的簇数。
在算法迭代中每次均选取类簇距离最小的两个类簇进行合并。关于类簇距离的计算表示方法主要有以下几种:
(1)取两个类中距离最小的两个样本的距离作为两个集合的距离
(2)取两个类中距离最大的两个样本的距离作为两个集合的距离
(3)计算两个集合中每两两点的距离并取平均值,这种方法要略费时
(4)比(3)轻松一些,取这些两两点距的中位数
(5)求每个集合中心点,然后以中心点代表集合来计算集合距离
(6)......
迭代会在簇数减少到设定数量时结束,当然,如果设定了阈值f,那么当存在两个距离小于f的集合时则会继续迭代直到不存在这样的两个集合。
分裂法:
首先将所有样本归类到
如果觉得《机器学习处理信号分离_机器学习无监督学习算法总结》对你有帮助,请点赞、收藏,并留下你的观点哦!