常见的简单的无监督学习算法总结

匿名 (未验证) 提交于 2019-12-03 00:13:02

一.聚类(clustering)

1.k-均值聚类(k-means)

  这是机器学习领域除了线性回归最简单的算法了。该算法用来对n维空间内的点根据欧式距离远近程度进行分类。

  INPUT:

    K(number of clusters)

  OUTPUT:

    K个聚类中心

  算法工作原理摘要:

  

#簇数为k#数据空间维度为n#训练集元素数为mdef K_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=9999999                 owner=0                 for j in range(0,k): #遍历所有聚心找到最近的聚心owner                     dis=0                     for p in range(0,n):                         abso =tr_set[i][p] - clusters[j][p]                         dis+=abso*abso  #dis为第i个元素和第j个聚心的欧式距离的平方                     if dis-min < 0:                         min=dis                         owner=j                 for 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 )作为迭代终止条件。

更新情况:(assume n=2,k=4,m=15)

(虽然我的demo不太显著,可毕竟是亲手做的QAQ)

通读本算法,可以发现k-means对聚心初始值非常敏感,如果初始情况不好会震荡的。这里可以采取一些措施预判聚心大致要在哪个位置,然后直接将其初始化。

另外,关于收敛的判断,可以采取多种方法。比如使用代价函数

,或者F-Measure和信息熵方法。

K-means优缺点分析:

只能发现球形类簇。

2.层次聚类(Hierarchical Clustering)

  顾名思义,层次聚类就是一层一层地进行聚类。既可以由下向上对小的类别进行聚合(凝聚法),也可以由上向下对大的类别进行分割(分裂法)。在应用中,使用较多的是凝聚法。

  INPUT:training_set D,聚类数目或者某个条件(一般是样本距离的阈值)

  OUTPUT:聚类结果

  凝聚法:

  跟竞赛中经常出现的并查集问题略相似,凝聚法指的是先将每个样本当做一个类簇,然后依据某种规则合并这些初始的类簇,直到达到某种条件或者减少到设定的簇数。

  在算法迭代中每次均选取类簇距离最小的两个类簇进行合并。关于类簇距离的计算表示方法主要有以下几种:

  (1)取两个类中距离最小的两个样本的距离作为两个集合的距离

  (2)取两个类中距离最大的两个样本的距离作为两个集合的距离

  (3)计算两个集合中每两两点的距离并取平均值,这种方法要略费时

  (4)比(3)轻松一些,取这些两两点距的中位数

  (5)求每个集合中心点,然后以中心点代表集合来计算集合距离

  (6)......

  迭代会在簇数减少到设定数量时结束,当然,如果设定了阈值f,那么当存在两个距离小于f的集合时则会继续迭代直到不存在这样的两个集合。

  分裂法:

  首先将所有样本归类到一个簇,然后依据某种规则逐渐分裂,直到达到某种条件或者增加到设定的簇数。

  (手写再拍照真不容易QAQ)

  

  (1)K-means时间复杂度为O(N),而层次聚类时间复杂度为O(N^2),所以分层聚类不能很好地处理大批量数据,而k-means可以。

  (2)K-means不允许嘈杂数据,而层次聚类可以直接使用嘈杂数据集进行聚类

  (3)当聚类形状为超球形(如2D圆形,3D球形)时,k-means聚类效果更好。

3.基于密度聚类Mean Shift

4.基于密度聚类DBSCAN

5.高斯混合模型(GMM)与EM

6.基于图论聚类

二.降维(demensionality reduction)

1.主成分分析(PCA)

2.独立成分分析(ICA)

3奇异值分解(SVD)

4.t-SNE

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!