引入
作为练手,不妨用matlab实现K-means
要解决的问题:n个D维数据进行聚类(无监督),找到合适的簇心。
这里仅考虑最简单的情况,数据维度D=2,预先知道簇心数目K(K=4)
理论步骤
关键步骤:
(1)根据K个簇心(clusters,下标从1到K),确定每个样本数据Di(D为所有数据整体,Di为某个数据,i=1...n)所属簇,即欧氏距离最近的那个。
簇心编号:
c_i = arg min_{j} {D_i - clusters_j}, 即使得欧氏距离最近的那个j
(2) 更新簇心:所属簇编号c_i相同的样本数据D_i的元素们,用他们均值来替代原有簇心(D维向量均值)
代码
% my_kmeans
% By Chris, zchrissirhcz@gmail.com
% 2016年9月30日 19:13:43
% 簇心数目k
K = 4;
% 准备数据,假设是2维的,80条数据,从data.txt中读取
%data = zeros(100, 2);
load 'data.txt'; % 直接存储到data变量中
x = data(:,1);
y = data(:,2);
% 绘制数据,2维散点图
% x,y: 要绘制的数据点 20:散点大小相同,均为20 'blue':散点颜色为蓝色
s = scatter(x, y, 20, 'blue');
title('原始数据:蓝圈;初始簇心:红点');
% 初始化簇心
sample_num = size(data, 1); % 样本数量
sample_dimension = size(data, 2); % 每个样本特征维度
% 暂且手动指定簇心初始位置
clusters = zeros(K, sample_dimension);
clusters(1,:) = [-3,1];
clusters(2,:) = [2,4];
clusters(3,:) = [-1,-0.5];
clusters(4,:) = [2,-3];
hold on; % 在上次绘图(散点图)基础上,准备下次绘图
% 绘制初始簇心
scatter(clusters(:,1), clusters(:,2), 'red', 'filled'); % 实心圆点,表示簇心初始位置
c = zeros(sample_num, 1); % 每个样本所属簇的编号
PRECISION = 0.0001;
iter = 100; % 假定最多迭代100次
for i=1:iter
% 遍历所有样本数据,确定所属簇。公式1
for j=1:sample_num
%t = arrayfun(