K-means算法的matlab代码
时间: 2024-07-28 13:00:42 浏览: 51
K-means算法是一种常用的无监督机器学习方法,用于数据聚类。在MATLAB中,你可以使用内置的`kmeans`函数来实现这个过程。以下是一个简单的例子:
```matlab
% 导入数据(这里假设数据存储在一个名为data的矩阵中)
data = load('your_data_file.mat'); % 请替换为实际文件路径
% 设置聚类数量K
K = 3; % 假设我们想要将数据分为3类
% 初始化聚类中心(可以选择随机或指定位置)
initialCentroids = randperm(size(data, 1), K); % 随机选择K个点作为初始中心
% 运行K-means
[idx, centroids] = kmeans(data, K, 'InitialCenters', initialCentroids);
% idx是每个数据点所属的簇标签,centroids是最终的聚类中心
```
这里,`kmeans`函数的参数解释:
- `data`: 输入的数据集。
- `K`: 要划分的簇的数量。
- `'InitialCenters'`: 设置初始聚类中心。这里用`randperm`随机选取。
运行完上述代码后,`idx`就是数据点分配给各个簇的标签,`centroids`则是最终聚类中心的位置。
相关问题
K-means算法matlab代码
以下是一个简单的K-means算法的MATLAB实现代码:
```matlab
function [centroids, idx] = kMeans(X, K, max_iters)
% X是数据矩阵,每行代表一个数据点
% K是聚类中心数
% max_iters是最大迭代次数
[m, n] = size(X);
% 初始化聚类中心
centroids = X(randperm(m, K), :);
% 初始化idx
idx = zeros(m, 1);
for i = 1:max_iters
% 计算每个样本点到聚类中心的距离
dists = pdist2(X, centroids);
% 分配每个样本点到最近的聚类中心
[~, idx] = min(dists, [], 2);
% 更新聚类中心
for j = 1:K
centroids(j, :) = mean(X(idx == j, :), 1);
end
end
end
```
这个函数接受三个输入参数:数据矩阵X、聚类中心数K和最大迭代次数max_iters。它返回两个输出参数:聚类中心centroids和每个数据点所属的聚类idx。
在这个实现中,我们使用pdist2函数计算每个数据点到每个聚类中心的距离,然后使用min函数找到每个数据点所属的最近的聚类中心。最后,我们使用mean函数更新每个聚类中心的位置。
你可以使用以下代码来测试这个函数:
```matlab
% 生成一些随机数据
X = [randn(100,2)*0.75+ones(100,2);
randn(100,2)*0.5-ones(100,2)];
% 运行K-means算法
K = 2;
max_iters = 10;
[centroids, idx] = kMeans(X, K, max_iters);
% 绘制聚类结果
figure;
plot(X(idx==1,1), X(idx==1,2), 'r.', 'MarkerSize', 12);
hold on;
plot(X(idx==2,1), X(idx==2,2), 'b.', 'MarkerSize', 12);
plot(centroids(:,1), centroids(:,2), 'kx', 'MarkerSize', 15, 'LineWidth', 3);
hold off;
legend('Cluster 1', 'Cluster 2', 'Centroids');
```
这个代码会生成100个点,其中一半分布在以(1,1)为中心的正态分布中,另一半分布在以(-1,-1)为中心的正态分布中。然后,我们使用K-means算法将这些点聚为两类,并绘制聚类结果。
密度参数·改进k-means算法matlab代码
以下是一个使用密度参数改进的k-means算法的MATLAB代码:
```
function [IDX, C] = kmeans_density(X, k, rho)
% kmeans_density: 密度参数改进的k-means算法
% 输入:
% X: n*d的数据矩阵,n为样本数,d为特征维数
% k: 聚类数
% rho: 密度参数
% 输出:
% IDX: n*1的向量,表示每个样本所属的簇
% C: k*d的矩阵,表示每个簇的中心
% 使用样例:
% [IDX, C] = kmeans_density(X, 3, 0.5);
[n, d] = size(X);
IDX = zeros(n, 1);
C = X(1:k, :);
while true
preIDX = IDX;
% 计算每个样本到各个中心的距离
D = pdist2(X, C);
% 计算每个样本到最近中心的距离
[minD, minIdx] = min(D, [], 2);
% 根据密度参数rho选择簇心
for i = 1:k
idx = find(minIdx == i);
if numel(idx) > rho * n
C(i, :) = mean(X(idx, :));
end
end
IDX = minIdx;
% 判断是否收敛
if isequal(IDX, preIDX)
break;
end
end
```
其中,密度参数rho表示每个簇中所包含的样本数与总样本数的比例,如果大于rho的簇才会被更新中心点。
阅读全文