聚类分析
聚类分析
聚类不知道类别
K-means聚类算法
流程图:
优缺点分析
K-means++算法
操作
系统(层次)聚类
距离计算
注意
会生成聚类谱系图,以此判断选择几类
详细操作见下博客
SPSS操作(四):系统聚类分析_聚类分析spss操作-CSDN博客
DBSCAN 算法
基本概念
代码
1 | clc; |
当然,让我逐行解释这段MATLAB代码:
- clc; clear; close all;
clc
:清除命令窗口。clear
:清除工作区中的所有变量。close all
:关闭所有打开的图形窗口。- load mydata;
- 从名为 'mydata' 的文件中加载数据到工作区。这里的假设是 'mydata' 包含一个表示数据点的变量
X
。- epsilon=0.5; MinPts=10;
- 定义DBSCAN算法的参数,
epsilon
是邻域半径,MinPts
是邻域内最小数据点数。- IDX=DBSCAN(X,epsilon,MinPts);
- 调用DBSCAN函数,对数据
X
进行密度聚类,返回聚类结果IDX
。- function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)
- 定义DBSCAN算法的主函数,接受输入参数
X
、epsilon
和MinPts
。- C=0;
- 初始化聚类簇数为0。
- n=size(X,1); IDX=zeros(n,1);
- 获取数据点数量
n
,初始化聚类标签IDX
全部为0,表示所有点都是噪音点。- D=pdist2(X,X);
- 计算数据点之间的距离矩阵
D
。- visited=false(n,1); isnoise=false(n,1);
- 初始化用于标记是否访问过的向量
visited
和标记是否为噪音点的向量isnoise
。- for i=1:n
- 开始对每个数据点进行迭代。
- if ~visited(i)
- 如果当前点未被访问过,则执行以下操作。
- visited(i)=true; Neighbors=RegionQuery(i);
- 将当前点标记为已访问,然后找到与当前点在邻域内的点集合
Neighbors
。- if numel(Neighbors)<MinPts
- 如果邻域内点的数量小于
MinPts
,则将当前点标记为噪音点。- else
- 否则,执行以下聚类操作。
- C=C+1; ExpandCluster(i,Neighbors,C);
- 增加聚类簇数,并进行扩展聚类操作。
- function ExpandCluster(i,Neighbors,C)
- 定义扩展聚类的子函数,给定当前点、邻域内点集合和当前簇数。
- IDX(i)=C;
- 将当前点标记为属于当前簇。
- while true
- 进入循环,不断扩展聚类。
- j = Neighbors(k);
- 取出邻域内的第 k 个点。
- if ~visited(j)
- 如果该点未被访问过,则执行以下操作。
- visited(j)=true; Neighbors2=RegionQuery(j);
- 将该点标记为已访问,然后找到与该点在邻域内的点集合
Neighbors2
。- if numel(Neighbors2)>=MinPts
- 如果新邻域内的点数量大于等于
MinPts
,则将新邻域内的点添加到原邻域中。- Neighbors=[Neighbors Neighbors2];
- 将新邻域内的点添加到原邻域中。
- end
- 结束新邻域内点的处理。
- if IDX(j)==0
- 如果该点尚未被分配到任何簇,则将其分配到当前簇。
- IDX(j)=C;
- 将该点标记为属于当前簇。
- k = k + 1; if k > numel(Neighbors) break; end
- 处理邻域内的下一个点,直到邻域内的所有点都被处理完。
- function Neighbors=RegionQuery(i)
- 定义邻域查询的子函数,给定当前点的索引
i
,返回在邻域内的点的索引集合。- Neighbors=find(D(i,:)<=epsilon);
- 根据距离矩阵,找到与当前点距离在
epsilon
以内的点。- end
- 结束邻域查询子函数。
- end
- 结束主函数。
这样,整个代码就实现了DBSCAN聚类算法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论