kmeans聚类算法matlab手写
时间: 2023-08-30 19:11:14 浏览: 95
Java-美妆神域_3rm1m18i_221-wx.zip
以下是k-means聚类算法的matlab手写代码。代码中包含了算法的详细注释。
```matlab
function [cluster_idx, centroids, SSE] = kmeans(X, K, max_iters)
% K-Means聚类算法的手写实现
% 输入参数:X - 数据集,每一行为一个样本
% K - 类别数
% max_iters - 最大迭代次数
% 输出参数:cluster_idx - 每个样本所属的类别
% centroids - 类别中心
% SSE - 每次迭代后的误差平方和
% 获取数据集样本数和维度
[m, n] = size(X);
% 初始化类别中心
centroids = X(randperm(m, K), :);
% 初始化误差平方和
SSE = zeros(max_iters, 1);
% 迭代K-Means算法
for i = 1:max_iters
% 计算每个样本所属的类别
cluster_idx = zeros(m, 1);
for j = 1:m
dist = sum((centroids - X(j, :)).^2, 2);
[~, idx] = min(dist);
cluster_idx(j) = idx;
end
% 计算每个类别的中心
for k = 1:K
centroids(k, :) = mean(X(cluster_idx == k, :), 1);
end
% 计算误差平方和
SSE(i) = 0;
for j = 1:m
SSE(i) = SSE(i) + sum((X(j, :) - centroids(cluster_idx(j), :)).^2);
end
% 判断是否收敛
if i > 1 && abs(SSE(i) - SSE(i-1)) < 1e-5
break;
end
end
end
```
使用示例:
```matlab
% 生成随机数据集
X = randn(100, 2);
% 调用kmeans函数进行聚类
K = 3;
max_iters = 100;
[cluster_idx, centroids, SSE] = kmeans(X, K, max_iters);
% 可视化聚类结果
figure;
gscatter(X(:,1), X(:,2), cluster_idx);
hold on;
plot(centroids(:,1), centroids(:,2), 'kx', 'MarkerSize', 10, 'LineWidth', 2);
title('K-Means Clustering');
xlabel('Feature 1');
ylabel('Feature 2');
```
阅读全文