(模式识别作业 ——matlab 实现样本点之间的各类距离 (非调用 pdist))
给定一个含3个样本的样本集合,编程实现计算其各点之间的各类距离
设三个样本点为 (1,0),(0,1),(1,1)。
%Sample points
X=[ 1 0; 0 1; 1 1];
[m,n]=size(X); %m为样本个数,n为维度
Manhattan distance(City Block Distance)
图中,红色为曼哈顿距离,绿色为欧氏距离,蓝色和黄色为等价的曼哈顿距离。用以标明两个点在标准坐标系上的绝对轴距总和。
二维中两点
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
(x_1,y_1),(x_2,y_2)
(x1,y1),(x2,y2)的欧氏距离
d
=
∣
x
1
−
x
2
∣
+
∣
y
1
−
y
2
∣
d=|x_1-x_2|+|y_1-y_2|
d=∣x1−x2∣+∣y1−y2∣
X=X';
B=perms(1:m);
B=B(:,1:2);
B=sort(B,2);
B=unique(B,'rows');
l=length(B);
a=zeros(2);
for i=1:l
R1=X(:,B(i,1));
R2=X(:,B(i,2));
a(:,i)=abs(R1-R2);
end
Dis=sum(a);
disp('Manhattan distance between any two points')
Dis
运行结果图片就不放了,大家可以复制运行。
Euclidean distance
从上图可以看出,欧氏距离就是两点的直线距离。
二维中两点
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
(x_1,y_1),(x_2,y_2)
(x1,y1),(x2,y2)的欧氏距离
d
=
(
x
1
−
x
2
)
2
+
(
y
1
−
y
2
)
2
d=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}
d=(x1−x2)2+(y1−y2)2
k=1;
Dis=zeros(1,3);
for i=1:N
for j=1:N
if i<j
dis1=sum((X(i,1:3)-X(j,1:3)).^2);
Dis(1,k)=sqrt(dis1); %也可以用matlab自带的dist函数来计算,使用方法自行百度
k=k+1;
end
end
end
disp('Euclidean distance between any two points')
Dis
Chebychev distance
国际象棋中,国王可以移动到相邻的8个方格中任意一个。那国王从格子 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)到 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)最少需要多少步?这个距离叫切比雪夫距离。
二维中两点
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
(x_1,y_1),(x_2,y_2)
(x1,y1),(x2,y2)的切比雪夫距离
d
=
m
a
x
(
∣
x
1
−
x
2
∣
,
∣
y
1
−
y
2
∣
)
d=max(|x_1-x_2|,|y_1-y_2|)
d=max(∣x1−x2∣,∣y1−y2∣)
代码和曼哈顿距离的类似。
X=X';
B=perms(1:m);
B=B(:,1:2);
B=sort(B,2);
B=unique(B,'rows');
l=length(B);
a=zeros(2);
for i=1:l
R1=X(:,B(i,1));
R2=X(:,B(i,2));
a(:,i)=abs(R1-R2);
end
Dis=max(a);
disp('Chebyshev distance between any two points')
Dis
Mahalanobis distance
马氏距离是一种距离的度量,可以看作是欧氏距离的一种修正,修正了欧氏距离中各个维度尺度不一致且相关的问题。
1.度量样本到样本分布间的距离
d
=
(
x
→
−
μ
→
)
T
S
−
1
(
x
→
−
μ
→
)
d=\sqrt{(\overrightarrow{x}-\overrightarrow{\mu})^TS^{-1}(\overrightarrow{x}-\overrightarrow{\mu})}
d=(x−μ)TS−1(x−μ)
其中
μ
→
\overrightarrow{\mu}
μ是样本分布的均值,S是样本分布的协方差矩阵。
2.度量一个分布下,两个样本之间的距离
d
=
(
x
→
−
y
→
)
T
S
−
1
(
x
→
−
y
→
)
d=\sqrt{(\overrightarrow{x}-\overrightarrow{y})^TS^{-1}(\overrightarrow{x}-\overrightarrow{y})}
d=(x−y)TS−1(x−y)
Dis=zeros(m);
Cov=cov(X);
for i=1:m
for j=1:m
Dis(i,j)=sqrt((X(i,:)-X(j,:))*inv(Cov)*(X(i,:)-X(j,:))');
end
end
disp('Mahalanobis distance between any two points')
Dis
其余距离
其余距离本文不展示,可以查阅别的资料。