理論推導可以參看圖像降維之MDS特徵抽取方法
樣例來自Multidimensional scaling
前言
MDS的理論推導已經有很多了,基本上來自周志華老師的西瓜書,但其中的細節還有許多不明白,因此希望通過matlab實例來理清所有脈絡。
需要解釋幾點
1、輸入數據
輸入數據是距離矩陣D,而不是原始的m個d維向量,說明有數據的信息量缺失,但它們的相對位置關係是明確的。實例中的距離矩陣如下:
也就是有4組數據,但它們的維度不知道,姑且認爲較大吧,我們的任務是找4組二維的數據,讓它們間的距離和上述距離相等。
2、計算Z的內積矩陣
通過兩者距離相等的關係,我們希望可以求出Z的內積矩陣的各個元素(這裏和西瓜書不一樣,因爲這裏的Z由行向量組成,每行表示一組數據),具體的公式有點複雜:
但幸運的是,這都是紙老虎,在matlab具體計算的時候,其實各部分很簡單,詳見後面matal代碼部分。
3、由內積矩陣獲得Z
因爲是是對稱陣,可以得到m個特徵值和特徵向量(這裏西瓜書寫的是原數據的維度d,應該是不對的),特徵向量從大到小排序:
所以。
爲了實現降維,我們提取前d’個特徵值和特徵向量,即:,。得到
matlab代碼
clear;clc;
%輸入的歐式距離對稱矩陣
D=[0 3.1416 0.7854 1.5708;3.1416 0 2.3562 1.5708;
0.7854 2.3562 0 2.3562;1.5708 1.5708 2.3562 0];
%距離平方對稱陣
D2=D.*D; %每個元素爲distt(ij)^2
%獲得B矩陣
distt2i=mean(D2); %對列求平均1*4矩陣
distt2j=mean(D2,2); %對行求平均4*1矩陣
dist2=mean(mean(D2)); %所有距離的平均1*1矩陣
%matlab可以自動展開成4*4矩陣並做加減計算
B=-1/2*(D2-distt2i-distt2j+dist2);
%B=VAV'
[V,A]=eig(B);
%翻轉特徵向量,從特徵值大到小排序
V=fliplr(V);A=wrev(diag(A));
%% 提取前兩個最大的特徵值,和特徵向量,計算Z,實現降維
Z=V(:,1:2)*diag(sqrt(A(1:2)))
結果如下:
Z剔除了部分信息後,內積矩陣與B是有差距的,但總體可以接受,最後再比較Z的4組樣本間的兩兩距離:
可以看出,整體效果還是很好的!
小結
- 內積矩陣B的維度是,m爲樣本數量,求取得特徵值和特徵向量也有m個,不是d個(原樣本的維度)。
- 降維是通過選取前d’個特徵值,和對應d’個特徵列向量,獲得。