Kmeans算法总结

1. 定义

Kmeans算法的过程较为简单

1、从D中随机取k个元素,作为k个簇的各自的中心。

2、分别计算剩下的元素到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇。

3、根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数。

 4、将D中全部元素按照新的中心重新聚类。

5、重复第4步,直到聚类结果不再变化。

6、将结果输出。

2.相异度

聚类算法中,我们将相似的元素聚成一类,让类与类之间的元素尽量不同,而聚成一类的元素尽量相似。这个度量相似的指标,就是相异度。虽然相异度可以理解为距离,但是相异度的计算方式有很多。注意相异度和相似度是一对相反的概念

L_{p}距离:

设n维特征空间中x_{i}x_{j}x=(x^{1},x^{2},...,x^{n})^{T},x_{i},x_{j}L_{p}距离定义为(p>=1):

L_{p}(x_{i},x_{j})=(\sum_{l=1}^{n}\mid x_{i}^l - x_{j}^l\mid^p )^\frac{1}{p}

当p=1时,距离是曼哈顿距离(元素对应维度的绝对值之差求和)

当p=2时,距离是欧氏距离,也就是我们经常用到的距离公式

当p为无穷大的时候,距离是切比雪夫距离,定义为max|x_{i}^l-x_{j}^l|

向量

当特征是具有方向的向量的时候,比如词向量,词分布到向量空间中的时候,两个含义相反的词向量可能也是相反的,此时用Lp距离欧氏距离不合适,向量的相似度比较可以用余弦相似度来比较

one-hot特征

当特征空间是one-hot形式的时候,用上述距离也不合适,可以用元素相同序位不同值属性的比例来标识其相异度

例如:a={0,1,1,0}  b={0,0,0,1},两个元素只在第一维上取值相同,相异度是3/4=0.75

有时候我们更关心那些取值为1的特征,比如用户购买预测的时候,两个用户没有买的商品会有很多相同的,但我们更关心用户买了相同的东西才是相似的,衡量方法为:取值不同的同位属性数/(单个元素的属性位数-同取0的位数),即分母此时不是全体特征数量,而是全体特征中去除掉那些和另一个比较的时候同时为0的个数。叫做非对称二元相异度,因为元素不同分母可能会变化。

上面是二元特征的情形,当一个特征是多元的,比如颜色的属性有很多,这种离散多元特征在机器学习中通常被处理成one-hot编码,所以度量方法和上面一样。

3. k值的选取——肘部法则

k值是一个超参数,选取方法有很多,除了根据先验知识确定以外,比较重要的方法有肘部法则:

- 计算指标:SSE(sum of the squared errors,误差平方和)

SSE=\sum_{I=1}^{k}\sum_{p\epsilon C_{i}}|p-m_{i}|^2

其中,Ci是第i个簇,m是簇的质心,即簇中元素的和的平均,p是Ci中的元素

我们从K=2的时候开始依次增大k值,此时k值比最优k值要小。随着聚类数k的增大,样本划分的趋势是更加精细,每个簇的聚合程度会快速提高,SSE的下降幅度很大。

当k到达真实聚类数时,再增加k的时候就像在已经聚好的簇内再画出簇来,必定SSE的下降幅度会骤减,最后趋于平缓。这个图的形状像一个手肘,而下降速度骤降的地方就是肘部,也就是最优k点

4. 问题 

离群点检测

kmeans的一个应用是离群点检测,如果我们能确定能获得纯净数据(没有离群点),先训练模型,确定簇和簇心,再用数据去验证,如果该点距簇心的距离大于模型该簇心的最大距离,那么该点就是离群点。

归一化

如果有一维数据量纲太大,那么在算欧式距离的时候这一维就占了主导地位,归一化后量纲统一。但是归一化有可能会改变簇的分布

但是有的距离度量没有量纲影响,比如余弦相似度

分布式处理大数据

用MapReduce处理大数据,将数据分成n份分布处理,初始化簇心并广播到每一个mapper上计算数据属于哪一个簇心,再reduce计算簇心并更新

参考

https://www.cnblogs.com/data-miner/p/6288229.html

https://blog.csdn.net/u013713010/article/details/44905203

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 针对心脏病数据集实现kmeans算法: 首先需要导入数据集并对其进行预处理,包括数据清洗、特征选择等操作。然后,对数据进行标准化处理,使得各个特征的值在同一量级上,这样可以避免某些特征对聚类结果的影响过大。接着,使用KMeans算法对数据进行聚类,并使用标签数据对聚类效果进行评价。 具体实现过程如下: ```python import numpy as np import pandas as pd from sklearn.cluster import KMeans from sklearn.metrics import accuracy_score # 导入数据集 data = pd.read_csv('heart.csv') # 数据预处理 # ... # 数据标准化 data = (data - data.mean()) / data.std() # KMeans聚类 k = 2 kmeans = KMeans(n_clusters=k, random_state=0).fit(data) # 聚类效果评价 labels = kmeans.labels_ acc = accuracy_score(data['target'], labels) print('Accuracy: %.2f' % acc) ``` 2. 对KMeans算法进行并行化执行以提高算法效率: 在KMeans算法中,主要的计算复杂度在于计算每个数据点到聚类中心的距离。因此,可以采用并行化的方法来加速这一计算过程。常用的并行化方法包括: - 使用多线程或多进程:可以将数据分成多个部分,分别在不同的线程或进程中计算,然后将结果合并。 - 使用GPU加速:GPU具有大量的计算核心,可以同时计算多个数据点与聚类中心之间的距离,从而提高计算效率。 3. 实验中遇到的问题及解决办法、心得、体会: 在实现KMeans算法时,遇到了一些问题,例如如何选择合适的聚类数k、如何评价聚类效果等。针对这些问题,可以通过调试代码、查阅资料等方式来解决。此外,在实验中还需要注意数据预处理、特征选择等问题,这些都会对聚类结果产生影响。因此,需要仔细分析数据集的特点,选择合适的方法进行处理。最后,实验的结果有助于理解KMeans算法的原理和应用场景,并掌握数据处理、算法实现等相关技能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值