无监督学习——聚类
无监督学习——聚类
Kmeans聚类
背景:
在机器学习的训练中,不是所有情况下训练数据都是由标注的,有时候数据存在无法标注或者标注代价高的情况。
这就需要我们在数据没有分类的情况下找到训练数据的方法。
思想:当我们拿到一堆没有被标注的训练数据x,假设这对数据自然存在k类。那我么认为这k类数据在空间上存在k个中心点。
所以,对每个数据计算和这些中心点的距离,和那个中心点最近,就属于哪一类。(鸡生蛋蛋生鸡问题)
- 随机初始化C1,C2,...,Ck个中心点
- 对每个xi计算找到最近的中心点。根据新的k组数据集,计算更新10个中心点。
- 直到中心点不再变化为止
优化:
- 对初始点敏感,初始点如果选的不好,分类结果可能差异很大。人工选取初始点时要分析数据。
- 内聚程度是衡量聚类效果的一个非常重要的指标。inner,内聚越高,越接近真实的分类情况。
- 因此通产多训练几次模型选择内聚最小的。
- 容易被异常点所影响
- 噪声点会影响中心点的判断,所以需要在训练前识别出异常数据,并清除掉。
- 某些场景缺乏物理意义,如性别等
- 数值问题。数值归一化可以有效的提升分类器性能
- 超参数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
这是一个企业中经常会用到的工具。
背景:要在亿万级别的数据中找到离某个点最近的点。
方法:二分查找
根据没有免费午餐定理:
这样做:
牺牲了:
- 空间,换取事件。
- 牺牲了准确性,只能在一个分支下面查找,而最近的点有可能不在同一个分支上。
使用annoy时,如何提升准确性:
- 数据量足够大使用annoy
- 选择查找范围的时候纳入相邻分支
- 多建树,取并集查找
DBscan
先说一下这种方法的好处:
- 类别数不需要自己设定,自动找类别数
- 可以处理套圈分布的情况
- 可以识别出一些噪声点并排除
思想:定义两个参数 ε 和minNUM
- ε 以某个点为圆心,ε 为半径
- minNUM:以某个点为圆心,ε 为半径画出⚪之后,如果圈出的点的个数>minnNUM,就称这点为核心点。
- 找到所有核心点,选择一个点作为初始点
- 核心点圈出的核心圈中每个外围点再次以ε 为半径,往外扩张,直到不在纳入新的的点为止。这一类分完。
- 从没有被纳入的点中再次寻找初 所有核心点。重复step1.
- 直到分类完成。
-
缺点:
- 运算量很大且不能分布式
- 参数非常难调
- 特别容易顾此失彼
- 不是特别智能。
posted on 2021-06-07 13:17 life‘s_a_struggle 阅读(175) 评论(0) 编辑 收藏 举报