|
本帖最后由 meatball1982 于 2018-10-19 18:33 编辑
QL的问题,觉得挺有意思,记录一下。
01.已知空间中的散点,求相互距离matrix(一个对称,对应线为0的矩阵)。
02.已知相互距离matrix,如何求散点在哪。
01.是1-1的map.
02则不是,比如把空间中的一堆点P 平移得到P_shift, or旋转得到P_rot,其相互距离是不变的,但点的位置就变了。不变是是P当中各个点的相互位置。所以在聚类或是只是观察点集合中各个点的相互关系时,是可以通过相互距离matrix来判断的,实际上,在许多cluster 的算法当中,只要相互距离matrix就可以了。
01,是通过pdist函数实现的。n个点,得到(n-1)*(n-2)/2个数。再整成对称的方阵。
02.则是通过一个叫mdscale函数实现的。
随机生成了三个group的数据。原始点和随机点的空间位置不一样,但通过rot和shfit,可以知道,两组数,长得一样。
- clear all
- clc
- clf
- %% outline %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % points 2 distance matrix
- % distance matrix 2 points
- %% main %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % random seed
- rng(2)
- % number points --------------------------------------
- n_p = 30;
- % gen random points, [30 2]
- % group 1 -------------------------
- p1=10*rand(n_p/3,2);
- % group 2 -------------------------
- p2=10*rand(n_p/3,2) +15;
- % group 3 -------------------------
- p3=10*rand(n_p/3,2);
- p3(:,1)=p3(:,1)+20;
- p=[p1;p2;p3];
- % Distance matrix ----------------
- dis=pdist(p);
- Dis_mat=squareform(dis);
- % generate new points from Distance matrix
- p_new = mdscale(Dis_mat, 2, 'criterion','metricstress');
- % sbp_width=0.8;
- % sbp_heig=0.85;
- % n_row = 2;
- % n_col = 2;
- % [out_pos]=fun_mm_subplot_pos(n_row,n_col,sbp_width,sbp_heig);
- % h=figure(1)
- % set(h, 'Position', [100, 100, 600, 600]);
-
- % plot random points -------------------------------
- subplot(2,2,1)
- % ax=axes('position',out_pos(1,:));
- hold on
- plot(p(1:10,1),p(1:10,2),'ro','markerfacecolor','r','markersize',3);
- plot(p(11:20,1),p(11:20,2),'go','markerfacecolor','g','markersize',2);
- plot(p(21:30,1),p(21:30,2),'bo','markerfacecolor','b','markersize',3);
- hold on
- for i =1 :n_p
- text(p(i,1)-2,p(i,2),mat2str(i),'fontsize',6)
- end
- axis equal
- axis([min(p(:,1))-5, max(p(:,1))+5,...
- min(p(:,2))-5, max(p(:,2))+5]);
- box on
- title('random points')
- % plot Distance matrix -----------------------------
- subplot(2,2,2)
- ax=axes('position',out_pos(2,:));
- surf(Dis_mat,'edgecolor','none')
- view(0,90)
- axis tight
- axis equal
- colormap(jet)
- % plot new points -----------------------------------
- subplot(2,2,3)
- % ax=axes('position',out_pos(3,:));
- hold on
- plot(p_new(1:10,1),p_new(1:10,2),'ro','markerfacecolor','r','markersize',3);
- plot(p_new(11:20,1),p_new(11:20,2),'go','markerfacecolor','g','markersize',2);
- plot(p_new(21:30,1),p_new(21:30,2),'bo','markerfacecolor','b','markersize',3);
- hold on
- for i =1 :n_p
- text(p_new(i,1)-2,p_new(i,2),mat2str(i),'fontsize',6)
- end
- axis equal
- axis([min(p_new(:,1))-5, max(p_new(:,1))+5,...
- min(p_new(:,2))-5, max(p_new(:,2))+5]);
- box on
- % save figure
- h=gcf;
- fi_na='../file_imgs/fig_p2m__m2p'
- fun_work_li_035_myfig_out(h,fi_na,3);
- %% logs
- % mod : 18-Oct-2018 21:54:52
- % mod by : mm
- % contact me : meatball1982@163.com
- %
复制代码
|
|