2015-06-09 103 views
0

我正在尋找一種解決方案,可以根據其中一些矩陣之間的估計距離矩陣輸出一組二維點。 問題是,這些點之間的距離不準確(近似值),並且所有對組合都沒有值。從距離矩陣散射2D座標

我正在尋找任何類型的解決方案,創建近似的座標,至多尊重提供的距離。

+0

http://www.math.le.ac.uk/people/ag153/homepage/KmeansKmedoids/Kmeans_Kmedoids.html – Mikhail

回答

0

您可以使用t-SNE,該算法可以根據元素的距離將潛在的高維數據嵌入到低維數據中。

您必須決定如何處理遺漏的距離,是否將它們設置爲高值或平均距離或其他。由於t-SNE將只保留本地鄰域,因此遠處簇的關係可能不太準確,但是您必須查看它是否對您的應用程序不利。


更新:例如,對於T-SNE

如果您下載從鏈接網站的香草MATLAB實現,把路徑上的文件夾,下面的自包含的例子應該運行。

%% Generate some random data 
mu = [1 2]; 
Sigma = [1 0; 0 1]; 
R = chol(Sigma); 
z1 = repmat(mu,100,1) + randn(100,2)*R; 
mu = [5 1.5]; 
z2 = repmat(mu,100,1) + randn(100,2)*R; 
mu = [3.5 6.5]; 
z3 = repmat(mu,100,1) + randn(100,2)*R; 

%% Plot random data 
figure(1); 
clf 
subplot(3, 1, 1) 
scatter(z1(:,1), z1(:,2)) 
hold on 
scatter(z2(:,1), z2(:,2)) 
scatter(z3(:,1), z3(:,2)) 
title('Original data') 

%% Generate pw distance matrix and plot it 
all_z = [z1; z2; z3]; 
% generate pw distance matrix 
pwd = squareform(pdist(all_z)); 

subplot(3, 1, 2) 
imagesc(pwd) 
title('Distance matrix') 

%% Perform tSNE 
no_dims = 2; 
perplexity = 150; 
yd = tsne_d(pwd, [], no_dims, perplexity); 
%% Plot results 
subplot(3, 1, 3) 
scatter(yd(1:100, 1), yd(1:100, 2)) 
hold on 
scatter(yd((1:100) + 100, 1), yd((1:100) + 100, 2)) 
scatter(yd((1:100) + 200, 1), yd((1:100) + 200, 2)) 
title('tSNE embedding') 

消毒的距離矩陣後(即分配失蹤者一定的價值),你會在%% Perform tSNE開始。 perplexity是一個參數,它應該近似匹配您在羣集中預期的點數。在我的例子中,我選擇了150個,因爲我還想考慮周圍的點。原文對算法的功能做了很好的描述。

+0

謝謝。你介意解釋如何以這種方式使用它?這對我來說有點難,因爲我沒有數學背景,也從來沒有使用過這個庫。將不勝感激。 – PedroN

+0

非常感謝。我仍然有幾個問題,如果你不介意的話: 1.'pwd'是否應該是零對角線的距離矩陣? 2.'yd'應該是一個矩陣,其中距離矩陣的最終點的x-y座標是?例如,如果我只有3個點和距離3 * 3的距離矩陣,那麼困惑度應該是3? – PedroN

+0

1.是2.是3.這取決於您的數據。我假設你的觀點有一些結構,即你在看不同的羣體,或者有一個連續變量。如果你有兩組20分,那麼困惑= 25可能是一個不錯的選擇。你可以玩這個參數。此外,由於算法使用隨機起點進行底層優化,因此每次都會得到不同的結果,並且您可以選擇最好的結果。 – zeeMonkeez