在实际中往往会碰到这样的问题:有n个由多个指标(变量)反映的客体,但反映客体的指标个数是多少不清楚,甚至指标本身是什么也是模糊的,更谈不上直接测量或观察它,仅仅所能知道的是这n个客体之间的某种距离(不一定是通常的欧氏距离)或者某种相似性,我们希望仅由这种距离或者相似性给出的信息出发,在较低维的欧氏空间把这n个客体(作为几何点)的图形描绘出来,从而尽可能揭示这n个客体之间的真实结果关系,这就是多维标度法所要研究的问题。
例表1列出了通过测量得到的英国12个城市之间公路长度的数据。由于公路不是平直的,所以它们还不是城市之间的短距离,只可以看作是这些城市之间的近似距离,我们希望利用这些距离数据画一张平面地图,标出这12个城市的位置,使之尽量接近表中所给出的距离数据,从而反映它们的真实地理位置。
表1 英国12城市之间的公路距离(单位:英里)
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
2 |
244 |
0 |
|
|
|
|
|
|
|
|
|
|
3 |
218 |
350 |
0 |
|
|
|
|
|
|
|
|
|
4 |
284 |
77 |
369 |
0 |
|
|
|
|
|
|
|
|
5 |
197 |
164 |
347 |
242 |
0 |
|
|
|
|
|
|
|
6 |
312 |
444 |
94 |
463 |
441 |
0 |
|
|
|
|
|
|
7 |
215 |
221 |
150 |
236 |
279 |
245 |
0 |
|
|
|
|
|
8 |
469 |
583 |
251 |
598 |
598 |
169 |
380 |
0 |
|
|
|
|
9 |
166 |
242 |
116 |
257 |
269 |
210 |
55 |
349 |
0 |
|
|
|
10 |
212 |
53 |
298 |
72 |
170 |
392 |
168 |
531 |
190 |
0 |
|
|
11 |
253 |
325 |
57 |
340 |
359 |
143 |
117 |
264 |
91 |
273 |
0 |
|
12 |
270 |
168 |
284 |
164 |
277 |
378 |
143 |
514 |
173 |
111 |
256 |
0 |
MATLAB源代码:
clc, clear
d0=textread('d.txt'); %把原始数据保存在纯文本文件d.txt中
d=d0(:);
d=nonzeros(d); %按照一定的顺序提出矩阵D中的非零元素
d=d'; %注意,d必须为行向量或实对称矩阵
cities={'1.阿伯瑞斯吹','2.布莱顿','3.卡里斯尔','4.多佛','5.爱塞特',...
'6.格拉斯哥','7.赫尔','8.印威内斯','9.里兹','10.伦敦',...
'11.纽加塞耳','12.挪利其'} %构造细胞数组
[y,eigvals]=cmdscale(d) %求经典解
plot(y(:,1),y(:,2),'o') %画出点的坐标
text(y(:,1)+25,y(:,2),cities); %对点进行标注
求解结果如下图: