码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-10-04 09:16:15      阅读:792      评论:0      收藏:0      [点我收藏+]

标签:依据   demo   行合并   函数   das   除了   alt   局部最优   数据   

一.聚类(clustering)

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

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

  INPUT:

    K(number of clusters)

    Training set{x1,x2,x3,....xn} (xi belongs to R^n)

  OUTPUT:

    K个聚类中心

  算法工作原理摘要:

  技术图片

   自己手写的python实现K—means:

#簇数为k
#数据空间维度为n
#训练集元素数为m
def
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)

  技术图片

 层次聚类和K-means作比较:

  (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

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

标签:依据   demo   行合并   函数   das   除了   alt   局部最优   数据   

原文地址:https://www.cnblogs.com/dynmi/p/11619698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!