life‘s_a_struggle

导航

无监督学习——聚类

无监督学习——聚类

Kmeans聚类

背景

在机器学习的训练中,不是所有情况下训练数据都是由标注的,有时候数据存在无法标注或者标注代价高的情况。

这就需要我们在数据没有分类的情况下找到训练数据的方法。

思想:当我们拿到一堆没有被标注的训练数据x,假设这对数据自然存在k类。那我么认为这k类数据在空间上存在k个中心点。

所以,对每个数据计算和这些中心点的距离,和那个中心点最近,就属于哪一类。(鸡生蛋蛋生鸡问题)

  1. 随机初始化C1,C2,...,Ck个中心点
  2. 对每个xi计算找到最近的中心点。根据新的k组数据集,计算更新10个中心点。
  3. 直到中心点不再变化为止

优化

  1. 对初始点敏感,初始点如果选的不好,分类结果可能差异很大。人工选取初始点时要分析数据。
  2. 内聚程度是衡量聚类效果的一个非常重要的指标。inner,内聚越高,越接近真实的分类情况。
    •   因此通产多训练几次模型选择内聚最小的。
  3. 容易被异常点所影响
    •   噪声点会影响中心点的判断,所以需要在训练前识别出异常数据,并清除掉。
  4. 某些场景缺乏物理意义,如性别等
  5. 数值问题。数值归一化可以有效的提升分类器性能
  6. 超参数k的选择:k越趋近于实际分类数目,inner的收益就越小。
 1 from sklearn.datasets import make_blobs
 2 from sklearn.cluster import KMeans
 3 
 4 
 5 # X为样本特征,Y为样本簇类别,共1000个样本,每个样本2个特征,对应x和y轴,共4个簇,
 6 # 簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2]
 7 X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
 8                   cluster_std=[0.4, 0.2, 0.2, 0.2])
 9 model = KMeans(n_clusters=4)
10 model.fit(X)
11 y_pred = model.predict(X)
12 print(y_pred)

 

 kmeans+LR——by 阿里

训练数据是有标注的数据,但是训练的的时候先不用标签。先用kmeans聚类分成n个簇。然后每个簇用LR训练一个分类器。

分类的时候:线找到对应的簇,然后用这个簇的LR分类模型得到分类。

(这种情况)

 

 


 

ANNOY

这是一个企业中经常会用到的工具。

背景:要在亿万级别的数据中找到离某个点最近的点。

方法:二分查找

 

根据没有免费午餐定理:

这样做:

牺牲了:

  1. 空间,换取事件。
  2. 牺牲了准确性,只能在一个分支下面查找,而最近的点有可能不在同一个分支上。

使用annoy时,如何提升准确性:

  1. 数据量足够大使用annoy
  2. 选择查找范围的时候纳入相邻分支
  3. 多建树,取并集查找

 


 

DBscan

先说一下这种方法的好处:

  1. 类别数不需要自己设定,自动找类别数
  2. 可以处理套圈分布的情况
  3. 可以识别出一些噪声点并排除

思想:定义两个参数 ε 和minNUM

  • ε 以某个点为圆心,ε 为半径
  • minNUM:以某个点为圆心,ε 为半径画出⚪之后,如果圈出的点的个数>minnNUM,就称这点为核心点。
  1. 找到所有核心点,选择一个点作为初始点
  2. 核心点圈出的核心圈中每个外围点再次以ε 为半径,往外扩张,直到不在纳入新的的点为止。这一类分完。
  3. 从没有被纳入的点中再次寻找初 所有核心点。重复step1.
  4. 直到分类完成。
  5.  

     

缺点:

  1. 运算量很大且不能分布式
  2. 参数非常难调
  3. 特别容易顾此失彼
  4. 不是特别智能。

 

posted on 2021-06-07 13:17  life‘s_a_struggle  阅读(162)  评论(0编辑  收藏  举报