2026/1/10 23:15:06
网站建设
项目流程
湛江人做寄生虫网站,友情链接的作用大不大,北沙滩网站建设公司,wordpress后台用的是DBSCAN聚类(Density-Based Spatial Clustering of Application with Noise)
设定距离阈值、最小相邻观测数进行聚类#xff0c;得到每个数据的聚类结果#xff0c;无聚类中心
案例提供了非常详细的备注#xff0c;智能化出2维3维聚类图#xff0c;自动根据聚类结果添加相应…DBSCAN聚类(Density-Based Spatial Clustering of Application with Noise) 设定距离阈值、最小相邻观测数进行聚类得到每个数据的聚类结果无聚类中心 案例提供了非常详细的备注智能化出2维3维聚类图自动根据聚类结果添加相应多种类的颜色 Matlab代码备注详细替换自己数据即可 温馨提示联系请考虑是否需要Example_61% 生成三簇三维数据可替换为自己的数据矩阵 mu [1 2 3; 4 5 6; 7 8 9]; % 各维度均值 sigma cat(3,[1 1 1],[0.5 0.5 0.5],[2 2 2]); % 协方差矩阵 data [mvnrnd(mu(1,:),sigma(:,:,1),200); mvnrnd(mu(2,:),sigma(:,:,2),150); mvnrnd(mu(3,:),sigma(:,:,3),100)];生成的点云在空间里呈现不同密度分布第三簇故意把协方差调大让数据更分散。接下来是核心的DBSCAN函数function [IDX, isNoise] DBSCAN(data, epsilon, minPts) [m,n] size(data); visited false(m,1); IDX zeros(m,1); cluster 1; for i 1:m if ~visited(i) visited(i) true; neighbors regionQuery(data,i,epsilon); if numel(neighbors) minPts IDX(i) -1; % 标记为噪声 isNoise(i) true; else expandCluster(i,neighbors,cluster,epsilon,minPts); cluster cluster 1; end end end % 子函数处理区域查询 function neighbors regionQuery(~,pointIdx,eps) distances sqrt(sum((data - data(pointIdx,:)).^2,2)); neighbors find(distances eps); end end这个实现有几个亮点1用regionQuery子函数封装距离计算方便维护2通过visited数组避免重复访问3噪声点直接标记为-1。不过要注意原数据量大的时候计算欧氏距离可能会慢可以考虑预先计算距离矩阵。可视化部分做得挺智能自动判断维度生成对应图形% 动态生成颜色映射支持任意数量簇 colors hsv(max(IDX)); colors [colors; 0.7 0.7 0.7]; % 噪声点用灰色 if size(data,2) 2 scatter(data(:,1), data(:,2), 36, colors(IDX,:), filled); else scatter3(data(:,1),data(:,2),data(:,3), 40, colors(IDX,:), filled); end这里用hsv色相环自动生成鲜艳颜色再用灰度表示噪声。三维可视化用scatter3直接处理颜色映射逻辑和二维保持一致。试跑结果可以看到三个主簇和边缘的噪声点第三簇因为初始设置协方差较大边界区域有些点可能被识别为噪声。实际使用时替换数据矩阵就行建议先做标准化处理data zscore(your_data); % 消除量纲影响 epsilon 0.5; % 根据数据分布调整 minPts 10; % 密度阈值遇到过参数调优的问题可以试试这个技巧画出k-距离曲线取第minPts近邻的距离排序拐点位置通常是比较合适的epsilon值。这个案例没实现但值得补充能帮助新手快速确定参数范围。最后输出结果中簇标签从1开始连续编号-1表示噪声。处理高维数据时虽然只能显示三维投影但聚类标签本身保留着完整信息可以导出做进一步分析。