100行7列点云数据,前三列分别为X,Y,Z,有10个点簇,利用模糊c均值聚类算法计算隶属度,对点云重新聚类 ,最后画出三维聚类结果。
% 读入数据
load data.mat % 假设点云数据已经存储在data.mat文件中
data = normalize(data(:,1:3)); % 取前三列数据,并归一化处理
% 初始化参数
k = 10; % 聚类数目
m = 2; % 模糊因子
epsilon = 1e-10; % 防止距离为0时出现除数为0的情况
U = rand(100,k); % 初始化隶属度矩阵
U = bsxfun(@rdivide,U,sum(U,2)); % 保证每一行的和为1
C = datasample(data,k,'Replace',false); % 随机选择k个点作为聚类中心向量
% 迭代计算
TOL = 1e-6; % 设定停止条件
maxiter = 100; % 设定最大迭代次数
for iter = 1:maxiter
% 计算距离
D = pdist2(data,C).^2 + epsilon; % 采用欧氏距离并添加小正数防止除数为0
% 更新隶属度矩阵U
U_old = U;
U = bsxfun(@power,1./D,1/(m-1));
U = bsxfun(@rdivide,U,sum(U,2));
% 更新聚类中心向量C
C_old = C;
C = (U.^m)'*data;
C = bsxfun(@rdivide,C,sum(U.^m)',2);
% 判断是否达到停止条件
if norm(C-C_old,'fro')/norm(C_old,'fro') < TOL
break;
end
end
% 根据隶属度重新聚类
[~, idx] = max(U, [], 2);
% 可视化结果
figure;
for i = 1:k
scatter3(X(idx == i, 1), X(idx == i, 2), X(idx == i, 3), '.');
hold on;
end
grid on;
xlabel('X'); ylabel('Y'); zlabel('Z');
title('Fuzzy C-means Clustering Result');