K-means算法
来源:互联网 发布:oracle sql developer 编辑:程序博客网 时间:2024/06/15 13:36
(一)简介
1.K-means是最常见的聚类算法,属于无监督学习算法;
(二)算法核心
在聚类问题中,给我们的训练样本是,每个
; K-means算法是将样本聚类成k个簇(cluster),具体算法描述如下:
1.随机选取k个聚类质心点(cluster centroids)为。
2.重复下面过程直到收敛
{
对于每一个样例i,计算其应该属于的类
对于每一个类j,重新计算该类的质心
}
(三)算法分析
1.定义算法目标函数:
(1)kmeans的收敛就是要使得J达到最小,思路是依次固定c(样本类别)或者u(质点)交叉迭代优化;
(2)由于J函数是非凸函数,跟c,u的初始化有关,容易陷入局部最优;实践中可多次优化,取最小的J对应的u跟c作为结果;
2.kmeans的不足:(1)对初始值敏感,容易陷入局部最优;(2)对孤立点以及噪声数据敏感;(3)需要用户自己定义 k 的大小;
(四)算法改进
1.二分kmeans算法
(1)定义函数:表示一个cluster中每个样本到质点的平方差
(2)算法思想:因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于它们的质心,聚类效果就越好;所以我们就需要对误差平方和最大的簇进行再一次的划分,因为误差平方和越大,表示该簇聚类越不好,越有可能是多个簇被当成一个簇了,所以我们首先需要对这个簇进行划分;
(3)步骤:首先将所有点作为一个簇,然后将该簇一分为二;之后选择能最大程度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇;以此进行下去,直到簇的数目等于用户给定的数目k为止;
(4)优点:不受初始化问题的影响,因为这里不存在随机点的选取,且每一步都保证了误差最小
2.K中心算法
(1)将K均值算法中的取均值换成取中心点
(2)优点:不受孤立点数据以及噪声数据的影响
(五)算法实现
1.随机初始化K-means的字典Y(K个词,每个词N维);
2.假设某一个N维样本记为Xi,,每个词记为Yj,则Xi与Yj的欧式距离可以记为:
那么距离样本Xi最近的词Yj可以表示如下:
3.假设总共有m个样本,记为X(m行N列),那么可以用矩阵S来表示这些样本的聚类情况,S矩阵是一个m行K列的稀疏矩阵,若第i个样本距离第j个词最近,那么S(i,j)=1;
4.根据上述推导可以求出每个样本点与字典的距离,那么更新字典公式如下:
5.matlab代码如下:
m = 100;N = 10;K = 5;iterations = 10;X = rand(m,N);Y = rand(K,N);x2 = sum(X.^2,2);for itr = 1:iterations c2 = 0.5*sum(Y.^2,2); loss =0; [val,labels] = max(bsxfun(@minus,Y*X',c2)); loss = loss + sum(0.5*x2- val'); S = sparse(1:m,labels,1,m,K,m); summation = S'*X; counts = sum(S,1)'; Y = bsxfun(@rdivide, summation, counts); badIndex = logical(counts == 0); Y(badIndex, :) = 0;end
PS:聚类算法的类型
(1)基于划分的聚类:kmeans
(2)基于层次的聚类:自底向上(每个样本点初始化为一个簇),自上到下(所有样本点初始化为一个簇)
(3)基于图的聚类:每个连通分支为一个簇
(4)基于密度的聚类:DBSCAN
(5)基于模型的聚类:GMM+EM
- K-means算法补充:K-means++
- k-means算法
- K-MEANS算法
- K-MEANS算法
- K-means算法
- k-means算法
- K-Means 算法
- K-Means 算法
- 深入浅出K-Means算法
- 聚类:K-means算法
- K-Means 算法
- k-means 算法
- 深入浅出K-Means算法
- K-Means 算法
- 深入浅出K-means算法
- 深入浅出K-Means算法
- k means算法入门
- K-means算法
- Android之Looper-Handler机制
- C语言函数手册 分类用途
- Groovy学习第一篇:什么是Groovy?
- liunx下C语言进行增添查删处理数据库MySQL
- 终于实现了!!用RF遍历子节点
- K-means算法
- C语言使用技巧
- 吃饭长江不吃v甲壳虫,臭
- Android之Broadcast, BroadcastReceiver(广播)
- MySQL的函数
- Netty初探-netty服务端和客户端demo
- Code::Blocks缺少编译器的解决
- vim 使用及函数跳转
- QTableWidget表格初始化和数据填充