K均值(K-means)是一种常用的聚类算法,用于将数据集划分为K个不同的组(簇),使得每个数据点属于与其最近的均值点所代表的簇。
K均值算法的基本思想是通过迭代优化,将数据点分配到K个簇中,并调整簇的均值(中心)以最小化簇内数据点与对应中心点之间的距离。
![](https://i-blog.csdnimg.cn/blog_migrate/ef2c774c531cccfa292c7052d8da82ad.png)
K均值算法的步骤如下
①初始化:随机选择K个初始中心点(可以是数据集中的任意数据点)作为各个簇的中心。
②分配数据点:对于每个数据点,计算其与各个中心点的距离,并将其分配到距离最近的簇中。
③更新中心点:对于每个簇,计算该簇所有数据点的均值,更新该簇的中心点。
④重复步骤②和步骤③:直到满足停止条件(如中心点不再发生变化或达到最大迭代次数)。
K均值算法的目标是最小化所有数据点与其所属簇中心点之间的距离之和(即簇内的总方差)。这意味着每个簇的中心点应该尽可能代表该簇内的数据点,同时不同簇之间的中心点应该尽可能远离彼此。
K均值算法的优点包括简单易实现、计算效率高,适用于大规模数据集。然而,K均值算法也有一些缺点,例如对K值的选择敏感、对初始中心点的选择敏感,还有可能收敛到局部最优解等。在实际应用中,K均值算法常用于聚类分析、图像分割、异常检测等领域。需要注意的是,K均值算法对于非凸形状的簇效果可能不佳,因此在某些情况下可能需要其他更复杂的聚类算法来处理数据。
以UCI常用数据集Aggregation.mat为例进行展示。
Aggregation数据集具有两个特征,7种类别。matlab代码实现如下:
N = 7; % 设定聚类数量
[m,n] = size(data);
pattern = zeros(m,n+1); % n+1列用于标记当前点所分配到的类索引号
center = zeros(N,n); % 初始化聚类中心
pattern(:, 1:n) = data(:,:);
for x=1:N
center(x,:) = data(randi(788,1), :); % 第一次随机产生聚类中心坐标
end
while 1
distance = zeros(1,N);
num = zeros(1,N); % 记录各个类中包含元素个数
new_center=zeros(N,n); % 保存新得到的聚类中心
for x=1:m
for y=1:N
distance(y) = norm(data(x,:)-center(y,:)); % 计算点到每个类的距离
end
[~, temp] = min(distance); % 获取当前点到几个类的最小距离
pattern(x, n+1) = temp; % 标记x位置的点分配到对应的类中
end
k = 0;
% 将同一个类中的点坐标相加,计算新的中心坐标
for y=1:N
for x=1:m
if pattern(x, n+1) == y
new_center(y,:) = new_center(y,:)+pattern(x, 1:n);
num(y) = num(y)+1;
end
end
% 计算得到新的聚类中心点
new_center(y,:) = new_center(y,:)/num(y);
if norm(new_center(y,:)-center(y,:))<0.1
% 是否接受当前新产生的聚类中心点
k=k+1;
end
end
if k==N
break;
else
center = new_center;
end
end
[m, n]=size(pattern);
对结果可视化结果如下:
代码更简洁!且分类效果更好!