KNN 与KMEANS算法

KNN算法

k近邻(KNN)是一种基本分类与回归方法

其思路如下:
给一个训练数据集和一个新的实例,在训练数据集中找出与这个新实例最近的k 个训练实例,然后统计最近的k 个训练实例中所属类别计数最多的那个类,就是新实例的类。

它的特点是完全跟着数据走,没有数学模型可言。

其流程如下所示:
1、计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);
2、对上面所有的距离值进行排序;
3、选前k 个最小距离的样本;
4、根据这k 个样本的标签进行投票,得到最后的分类类别;

三要素
k值的选择
距离的度量(常见的距离度量有欧式距离,马氏距离等)
分类决策规则 (多数表决规则)

k值的选择
k值越小表明模型越复杂,更加容易过拟合 但是k值越大,模型越简单,如果k=N的时候就表明无论什么点都是训练集中类别最多的那个类
所以一般k会取一个较小的值,然后用过交叉验证来确定
这里所谓的交叉验证就是将样本划分一部分出来为预测样本,比如95%训练,5%预测,然后k分别取1,2,3,4,5之类的,进行预测,计算最后的分类误差,选择误差最小的k

分类决策规则
找到最近的k个实例之后,可以计算平均值作为预测值,也可以给这k个实例加上一个权重再求平均值,这个权重与度量距离成反比(越近权重越大)

KNN的特殊情况是k =1的情况,称为最近邻算法。对输入的实例点(特征向量)x ,最近邻法将训练数据集中与x 最近邻点的类作为其类别。
(1)一般k 会取一个较小的值,然后用过交叉验证来确定;
(2)距离度量:一般是欧式距离(二范数),或者曼哈顿距离(一范数)
(3)回归问题:取K个最近样本的平均,或者使用加权平均。

优点
(1)思想简单,理论成熟,既可以用来做分类也可以用来做回归;
(2)可用于非线性分类;
(3)训练时间复杂度为O(n);
(4)准确度高,对数据没有假设,对outlier不敏感。

缺点
(1)计算量大;
(2)样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
(3)需要大量的内存;

需要考虑问题
(1)KNN的计算成本很高;
(2)所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移;
(3)在进行KNN前预处理数据,例如去除异常值,噪音等。

KD树是一个二叉树,表示对K维空间的一个划分,可以进行快速检索(那KNN计算的时候不需要对全样本进行距离的计算了)。
KD树更加适用于实例数量远大于空间维度的KNN搜索,如果实例的空间维度与实例个数差不多时,它的效率基于等于线性扫描。

KMEANS算法

基本流程如下:
随机初始化k个中心点;
计算所有样本点到中心点的距离;
比较每个样本到k个中心点的距离,并将样本分类到距离最近的中心点所在的类别中;
k个类别组成的样本点重新计算中心点;
重复2-4,直到中心点变化小于阈值或不再变化。
其中,k表示预设的类别个数;两点间距离常用欧氏距离和余弦距离。

K-means++
解决K-Means算法对初始簇心比较敏感的问题
K-Means++算法和K-Means算法的区别主要在于初始的K个中心点的选择方面,K-Means算法使用随机给定的方式,K-Means++算法采用下列步骤给定K个初始质点:

从数据集中任选一个节点作为第一个聚类中心;
对数据集中的每个点x,计算x到所有已有聚类中心点的距离和D(X),基于D(X)采用线性概率选择出下一个聚类中心点(距离较远的一个点成为新增的一个聚类中心点而不是最远的一个点是由于最远点可能为异常点,这里的选取规则是计算出M个距离团较远的点,然后随机选择出一点);
重复步骤2直到找到k个聚类中心点。

kmeans++:初始随机点选择尽可能远,避免陷入局部解。方法是n+1个中心点选择时,对于离前n个点选择到的概率更大

二分-K均值:
为了得到k个簇,将所有点的集合分裂成两个簇,从这些簇中选一个目标函数产生的误差比较大的,分裂这个组产生2个一个继续分裂,如此下去,直到产生k个簇。

mini batch kmeans:每次只用一个子集做重入类并找到类心(提高训练速度)(batch size个样本怎么来的?一般是通过无放回的随机采样得到的。为了增加算法的准确性,我们一般会多跑几次Mini Batch K-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。)
ISODATA:对于难以确定k的时候,使用该方法。思路是当类下的样本小时,剔除;类下样本数量多时,拆分
kernel kmeans:kmeans用欧氏距离计算相似度,也可以使用kernel映射到高维空间再聚类

K-means对异常值是否敏感?为什么
K-means对异常值较为敏感,因为一个集合内的元素均值易受到一个极大值的影响。当存在异常值的情况下,均值所计算出来的中心位置很可能不能够反映真实的类别中心。

超参数k如何选择
根据业务,比如希望把用户分成高中低三种;
观察法,仅适用于低维度的数据;
手肘法和轮廓系数法手肘法和轮廓系数法
Gap StatisticGap Statistic

K-means算法的优缺点
优点:
算法简单,容易理解,在某些情况下聚类效果不错;
处理大数据集的时候,该算法可以保证较好的伸缩性——即稍作改进即可以处理大数据集;
当数据簇近似于高斯分布时,效果非常不错;
算法复杂度低——时间复杂度为O(nkt),其中n为样本数,k为类别数,t为迭代数。
缺点:
k值需要人为设定,不同的k值得到的结果不一样;
对初始的类别中心敏感,不同选取方法得到的结果不一样;
对异常值敏感;
一个样本只能归为一类,不适合做单样本多标签分类任务;
不适合太离散的分类、样本类别不平衡的分类、非凸形状的分类(凸形状是指同一类别样本分布的形状是凸的,即内部是凸集)。
如何改进这些缺点见这篇文章: K-Means算法原理、缺点及改进,遇到异常值怎么办?评估算法的指标有哪些?.

初始点选择方法?
初始的聚类中心之间相互距离尽可能远。
(1)kmeans++,随机选择一个,对每一个样本计算到他的距离,距离越大的被选中聚类中心的概率也就越大,重复。
(2)选用层次聚类进行出初始聚类,然后从k个类别中分别随机选取k个点。

kmeans不能处理哪种数据?
(1)非凸(non-convex)数据。可以用kernal k均值聚类解决。
(2)非数值型数据。Kmeans只能处理数值型数据。可以用k-modes。初始化k个聚类中心,计算样本之间相似性是根据两个样本之间所有属性,如属性不同则距离加1,相同则不加,所以距离越大,样本的不相关性越大。更新聚类中心,使用一个类中每个属性出现频率最大的那个属性值作为本类的聚类中心。
(3)噪声和离群值的数据。可以用kmedoids(根据中值而不是均值)。
(4)不规则形状(有些部分密度很大,有些很小),可以用密度聚类DBSCAN解决。

kmeans如何处理大数据,几十亿
并行计算。MapReduce,假设有H个Mapper,把数据集分为H个子集,分布到H个Mapper上,初始化聚类中心,并同时广播到H个Mapper上。

KMEANS-KNN区别

在这里插入图片描述

(1)KNN 和Kmean缺点
  都属于惰性学习机制,需要大量的计算距离过程,速度慢的可以(但是都有相应的优化方法)。
(2)KNN
  KNN不需要进行训练,只要对于一个陌生的点利用离其最近的K个点的标签判断其结果。KNN相当于多数表决,也就等价于经验最小化。而KNN的优化方式就是用Kd树来实现。
(3)Kmean
  要求自定义K个聚类中心,然后人为的初始化聚类中心,通过不断增加新点变换中心位置得到最终结果。Kmean的缺点可以用Kmean++方法进行一些解决(思想是使得初始聚类中心之间的距离最大化)

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值