findClosestCentroids.m:
K_temp = zeros(K, 1);
for i = 1:size(idx, 1) %遍历所有样本
for j = 1:K %遍历所有K值
K_temp(j) = sum(( X(i,:) - centroids(j,:) ).^2);
end
mini = min(K_temp); %找出最小值
%idx(i) = find( K_temp == mini ); %最小的的索引
[value,idx(i)] = min(K_temp,[],1);
end
for i = 1:K
all_k = 0;
count = sum(idx(:) == i); %分配到centroids(i)中的X的元素总数
temp_meet = find(idx==i); %找出分配到centroids(i)中的所有X的行索引 (1*p)
for j = 1:numel(temp_meet)
all_k = all_k + X(temp_meet(j), :); %(1*n)
end
centroids(i, :) = all_k / count;
end
%另一种解法,代码更简洁
%for i = 1:K
% %X' * (idx == i) ——>使X中不是对应i的其他无关行置0,从而使挑出的X(i)行对应相加,最后变为(1*2)
% centroids(i,:) = (X' * (idx == i)) / sum(idx == i);
%end
rand_idx = randperm(size(X, 1));
centroids = X(rand_idx(1:K), :);
sigma = (X'*X)./m; %协方差矩阵
[U, S, V] = svd(sigma); %奇异值分解
U_reduce = U(:, 1:K); %(n*k)
for i = 1:size(X, 1)
x = X(i, :); %(1*n)
Z(i, :) = x * U_reduce; %(1*k)
end
% Z————>(n*k) U————>(n*n)
for i = 1:size(Z, 1)
X_rec(i, :) = Z(i, :) * U(:, 1:K)'; %(1*n)
end