毫米雷达点云 dbscan聚类算法
聚类的目的
聚类的目的是将一组数据点划分为具有相似特征或属性的组或簇。通过聚类分析,我们可以识别出数据中的内在模式、结构和关联关系,从而获得对数据的更深入理解。
具体来说,聚类的目的可以分为以下三部分:
-
发现数据的内在结构:
聚类可以将数据分成簇,这些簇可能表示数据的不同模式、集群或分布。通过将相似的数据点放在同一簇中,我们可以揭示数据的内在结构和组织方式。 -
数据预处理
通过将数据分成不同的簇,可以减少数据的复杂性和噪声,提取关键特征,并简化后续的数据分析任务。(比如形状特征) -
异常点剔除
聚类算法可以帮助我们识别和排除异常点或噪声数据。这些异常点可能是数据中的异常值、离群点或错误数据,对于准确的分析和建模是有害的。
聚类算法分类
现有的聚类算法可以大致分为三种,分别是
- 原型聚类(prototype-based clustering)
- -层次聚类 (hierarchical clustering)
- 密度聚类 (density-based clustering)
原型聚类
该类算法的主要思想为根据给定的划分集合个数 k,将所有数据对象分配到k个集合中,每个集合中各个数据对象到本身集合中心点相似度最高相对于其他集合中心对象。 该算法主要通过迭代的方式得到最优的聚类中心点和各个聚类集合,主要适用于球状簇的发现。 常用的划分聚类算法 k-means、 clarans、 clara、pam 等。 在数据挖掘领域被广泛应用,但是这些算法都要求在聚类之前就确定输出的簇的数量。对于汽车雷达来说,也就是要求在聚类之前就确定目标的数量,这显然是无法做到的,因为汽车雷达无法确定当前的目标数量是多少。
层次聚类
层次聚类尝试在不同层次对数据集进行划分,从而形成树形的聚类结构。层次聚类可以采用“自下而上”的聚类策略,也可以采用“自上而下”的聚类策略。agnes 方 法 (agglomerative nesting)是一种常用的“自下而上”的层次聚类算法。然而这种算法面临和原型聚类相同的问 题,也需要在聚类之前确定输出的簇的数量,因此也无法直接应用到汽车雷达上,因此就只剩下了密度聚类。
密度聚类
密度聚类(density-based clustering)没有其它两种聚类的限制,不需要事先确定簇的数量。密度聚类假设簇的 结构能通过目标点分布的紧密程度来确定。在密度聚类中,簇被认为是数据空间中目标点密集的区域,在簇之间出 现的低密度的目标点被认为是噪声. 这些簇可以有任意的形状,并且簇内的目标点也可以任意分布,这一点和汽车 雷达上的检测目标特性十分接近。汽车雷达对应同一个目标的检测点之间距离接近,并且这些点的密度分布是一定 的(这个密度分布和物体的反射特性相关)。因为具备以上这些特性,密度聚类更加适合于汽车雷达的应用,dbscan 算法(density-based spatial clustering of applications with noise)是一种常用的密度聚类算法。
dbscan聚类算法原理
相关定义
dbscan是基于一组邻域来描述样本集的紧密程度的,参数(ϵ, minpts)用来描述邻域的样本分布紧密程度。其中,ϵ描述了某一样本的邻域距离阈值,minpts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。
给出算法中用到的定义:
● ϵ领域:对于
x
j
∈
d
x_j \in d
xj∈d,其ϵ-邻域包含样本集d中与xj的距离不大于ϵ的子样本集,即
n
ϵ
(
x
j
)
=
{
x
i
∈
d
∣
d
i
s
t
a
n
c
e
(
x
i
,
x
j
)
≤
ϵ
}
n_{\epsilon}(x_j) = \{x_i \in d | distance(x_i,x_j) \leq \epsilon\}
nϵ(xj)={xi∈d∣distance(xi,xj)≤ϵ},这个子样本集的个数记为
∣
n
ϵ
(
x
j
)
∣
|n_{\epsilon}(x_j)|
∣nϵ(xj)∣。
● 核心对象(核心点):对于任一样本 x j ∈ d x_j \in d xj∈d,如果其ϵ-邻域对应的 ∣ n ϵ ( x j ) ∣ |n_{\epsilon}(x_j)| ∣nϵ(xj)∣至少包含minpts个样本,即如果 ∣ n ϵ ( x j ) ∣ ≥ m i n p t s |n_{\epsilon}(x_j)| \geq minpts ∣nϵ(xj)∣≥minpts,则 x j x_j xj是一个核心对象。
● 边界点:如果 ∣ n ϵ ( x j ) ∣ < m i n p t s |n_{\epsilon}(x_j)| < minpts ∣nϵ(xj)∣<minpts,则 x j x_j xj是一个边界点。
● 噪声点:既不是核心点也不是边界点的点
● 密度直达(directly density-reachable):如果 x i x_i xi位于 x j x_j xj的ϵ-邻域中,且 x j x_j xj是核心对象,那么称 x i x_i xi由 x j x_j xj密度直达。
● 密度可达(density-reachable):对于 x i x_i xi和 x j x_j xj,如果存在样本样本序列 p 1 , p 2 , . . . , p t p_1, p_2,...,p_t p1,p2,...,pt,满足 p 1 = x i , p t = x j p_1 = x_i, p_t = x_j p1=xi,pt=xj 且 p t + 1 p_{t+1} pt+1由 p t p_{t} pt密度直达,则称 x j x_j xj由 x i x_i xi密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本 p 1 , p 2 , . . . , p t − 1 p_1, p_2,...,p_{t-1} p1,p2,...,pt−1均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出。
● 密度相连(density-connected):对于
x
i
x_i
xi和
x
j
x_j
xj,如果存在核心对象样本
x
k
x_k
xk,使
x
i
x_i
xi和
x
j
x_j
xj均由
x
k
x_k
xk密度可达,则称
x
i
x_i
xi和
x
j
x_j
xj密度相连,密度相连关系是满足对称性的。
算法流程以及伪代码
开始:
- 初始化所有数据点的聚类标签为未分类(unclassified)
- 初始化聚类编号为0
- 遍历每个数据点:
- 如果该数据点已经分类,则跳过
- 标记该数据点为已访问
- 找到该数据点的邻域点集合
- 如果邻域点数量小于最小邻域点数量(minpts):
- 标记该数据点为噪声点
- 否则:
- 创建一个新的聚类
- 将该数据点及其邻域点加入聚类
- 扩展聚类:
- 对于邻域点集合中的每个点:
- 如果该点未访问:
- 标记该点为已访问
- 找到该点的邻域点集合
- 如果邻域点数量大于等于最小邻域点数量(minpts):
- 将该点的邻域点集合加入当前聚类的邻域点集合
- 如果该点未分类:
- 将该点加入当前聚类
结束
- 将该点加入当前聚类
- 如果该点未访问:
- 对于邻域点集合中的每个点:
伪代码:
(1) 首先将数据集d中的所有对象标记为未处理状态
(2) for(数据集d中每个对象p) do
(3) if (p已经归入某个簇或标记为噪声) then
(4) continue;
(5) else
(6) 检查对象p的eps邻域 neps(p) ;
(7) if (neps(p)包含的对象数小于minpts) then
(8) 标记对象p为边界点或噪声点;
(9) else
(10) 标记对象p为核心点,并建立新簇c, 并将p邻域内所有点加入c
(11) for (neps(p)中所有尚未被处理的对象q) do
(12) 检查其eps邻域neps(q),若neps(q)包含至少minpts个对象,
则将neps(q)中未归入任何一个簇的对象加入c;
(13) end for
(14) end if
(15) end if
(16) end for
算法流程图:
(还没画,画完就补上)
dbscan算法优缺点
dbscan参数选择
聚类衡量指标
dbscan算法仿真
dbscan代码
原始的dbscan算法参考链接:聚类方法:dbscan算法研究(2)–matlab代码实现
x1 =[5.1,3.5,1.4,0.2;
4.9,3.0,1.4,0.2;
4.7,3.2,1.3,0.2;
4.6,3.1,1.5,0.2;
5.1,3.7,1.5,0.4;
4.6,3.6,1.0,0.2;
5.1,3.3,1.7,0.5;
5.0,3.6,1.4,0.2;
5.4,3.9,1.7,0.4;
4.6,3.4,1.4,0.3;
5.0,3.4,1.5,0.2;
4.4,2.9,1.4,0.2;
4.9,3.1,1.5,0.1;
5.4,3.7,1.5,0.2;
4.8,3.4,1.6,0.2;
4.8,3.0,1.4,0.1;
4.3,3.0,1.1,0.1;
5.8,4.0,1.2,0.2;
5.7,4.4,1.5,0.4;
5.4,3.9,1.3,0.4;
5.1,3.5,1.4,0.3;
5.7,3.8,1.7,0.3;
5.1,3.8,1.5,0.3;
5.4,3.4,1.7,0.2;
6.4,3.2,4.5,1.5;
6.9,3.1,4.9,1.5;
5.5,2.3,4.0,1.3;
6.5,2.8,4.6,1.5;
5.7,2.8,4.5,1.3;
6.3,3.3,4.7,1.6;
4.9,2.4,3.3,1.0;
4.9,2.4,3.3,1.0;
6.6,2.9,4.6,1.3;
5.2,2.7,3.9,1.4;
5.0,2.0,3.5,1.0;
5.9,3.0,4.2,1.5;
6.0,2.2,4.0,1.0];
x=x1(:,3:4);
epsilon= 0.15 ;
minpts= 3 ;
idx1=dbscan(x,epsilon,minpts);
%% plot results
figure;
plotclusterinresult(x, idx1);
title(['dbscan clustering (\epsilon = ' num2str(epsilon) ', minpts = ' num2str(minpts) ')']);
set(gcf,'position',[30 -10 500 500]);
epsilon= 0.25 ;
minpts= 3 ;
idx2=dbscan(x,epsilon,minpts);
%% plot results
figure;
plotclusterinresult(x, idx2);
title(['dbscan clustering (\epsilon = ' num2str(epsilon) ', minpts = ' num2str(minpts) ')']);
set(gcf,'position',[530 -10 500 500]);
epsilon= 0.5 ;
minpts= 3 ;
idx3=dbscan(x,epsilon,minpts);
%% plot results
figure;
plotclusterinresult(x, idx3);
title(['dbscan clustering (\epsilon = ' num2str(epsilon) ', minpts = ' num2str(minpts) ')']);
set(gcf,'position',[30 380 500 500]);
function [idx, isnoise]=dbscan(x,epsilon,minpts)
c=0;
n=size(x,1);
idx=zeros(n,1);
d=pdist2(x,x);
visited=false(n,1);
isnoise=false(n,1);
for i=1:n
if ~visited(i)
visited(i)=true;
neighbors=regionquery(i);
if numel(neighbors)<minpts
% x(i,:) is noise
isnoise(i)=true;
else
c=c+1;
expandcluster(i,neighbors,c);
end
end
end
function expandcluster(i,neighbors,c)
idx(i)=c;
k = 1;
while true
j = neighbors(k);
if ~visited(j)
visited(j)=true;
neighbors2=regionquery(j);
if numel(neighbors2)>=minpts
neighbors=[neighbors neighbors2]; %#ok
end
end
if idx(j)==0
idx(j)=c;
end
k = k + 1;
if k > numel(neighbors)
break;
end
end
end
function neighbors=regionquery(i)
neighbors=find(d(i,:)<=epsilon);
end
end
function plotclusterinresult(x, idx)
k=max(idx);
colors=hsv(k);
legends = {};
for i=0:k
xi=x(idx==i,:);
if i~=0
style = 'x';
markersize = 8;
color = colors(i,:);
legends{end+1} = ['cluster #' num2str(i)];
else
style = 'o';
markersize = 6;
color = [0 0 0];
if ~isempty(xi)
legends{end+1} = 'noise';
end
end
if ~isempty(xi)
plot(xi(:,1),xi(:,2),style,'markersize',markersize,'color',color);
end
hold on;
end
hold off;
axis equal;
grid on;
legend(legends);
legend('location', 'northeastoutside');
end
运行结果图:
dbscan算法对毫米波雷达点云数据进行聚类
(慢慢补全 2023年5月28日19点59分)
发表评论