2016-04-05 5 views
4

私はscikit-learnメソッドMDSを使用して、一部のデータで次元削減を行っています。削減の質にアクセスするためのストレス値を確認したいと思います。私は0 - 1の間で何かを期待していた。しかし、私はこの範囲外の値を得た。ここでは、最小限の例です:応力属性 - sklearn.manifold.MDS/Python

私のテストでは、次のように印刷され、
%matplotlib inline 

from sklearn.preprocessing import normalize 
from sklearn import manifold 
from matplotlib import pyplot as plt 
from matplotlib.lines import Line2D 

import numpy 


def similarity_measure(vec1, vec2): 
    vec1_x = numpy.arctan2(vec1[1], vec1[0]) 
    vec2_x = numpy.arctan2(vec2[1], vec2[0]) 
    vec1_y = numpy.sqrt(numpy.sum(vec1[0] * vec1[0] + vec1[1] * vec1[1])) 
    vec2_y = numpy.sqrt(numpy.sum(vec2[0] * vec2[0] + vec2[1] * vec2[1])) 

    dot = numpy.sum(vec1_x * vec2_x + vec1_y * vec2_y) 
    mag1 = numpy.sqrt(numpy.sum(vec1_x * vec1_x + vec1_y * vec1_y)) 
    mag2 = numpy.sqrt(numpy.sum(vec2_x * vec2_x + vec2_y * vec2_y)) 
    return dot/(mag1 * mag2) 

plt.figure(figsize=(15, 15)) 

delta = numpy.zeros((100, 100)) 
data_x = numpy.random.randint(0, 100, (100, 100)) 
data_y = numpy.random.randint(0, 100, (100, 100)) 

for j in range(100): 
    for k in range(100): 
     if j <= k: 
      dist = similarity_measure((data_x[j].flatten(), data_y[j].flatten()), (data_x[k].flatten(), data_y[k].flatten())) 
      delta[j, k] = delta[k, j] = dist 

delta = 1-((delta+1)/2) 
delta /= numpy.max(delta) 

mds = manifold.MDS(n_components=2, max_iter=3000, eps=1e-9, random_state=0, 
       dissimilarity="precomputed", n_jobs=1) 
coords = mds.fit(delta).embedding_ 
print mds.stress_ 

plt.scatter(coords[:, 0], coords[:, 1], marker='x', s=50, edgecolor='None') 
plt.tight_layout() 

263.412196461

そして、このイメージを作成:

どう

enter image description here

この値を分析することはできますか?最大値を知っていますか?または、それを0から1の間に持つために正規化する方法は?

ありがとうございます。

+0

私は同じ問題を抱えていますが、答えを見つけましたか? 0から1の間でなければならないこともここに明記されています。http://www.analytictech.com/borgatti/mds.htm – student

+0

こんにちは、@スチューデント。はい、私はこれを解決しました。私が覚えている限り、このメソッドの "ストレス"機能は正規化されていません。 0と1の間にするには、分母(https://en.wikipedia.org/wiki/Multidimensional_scaling)を含める必要があります。 – pceccon

答えて

1

あなたは(σ)ストレス-1を期待している間に、現在のscikit-学ぶ実装は生の応力値(σ R)を計算して返すのでそれはあります。

前者はあまり有益ではありません(その高い値は、必ずしも不適切な適合を示しているとは限りません)。信頼性を伝えるより良い方法は、ノーマルストレスを計算することです。 Kruskal(1964、p.3)によると、ストレス1は多かれ少なかれ次のような解釈をしています。値0は完璧なフィット、0.025の優秀さ、0.05の良い、0.1の公平、0.2の劣悪さを示します。

Stress-1とsent PRの計算を実装しました。その間に一つはストレス-1が使用されversion from this branchを使用して、正規パラメータがデフォルトで FALSE)に設定されている場合代わりに生応力の戻りができます。

詳細については、cf. Kruskal(1964年、8-9頁)またはBorg and Groenen(2005年、41-43頁)。

関連する問題