2016-04-05 27 views
4

Bazı verilerde boyut küçültme gerçekleştirmek için scikit-öğrenme yöntemini MDS kullanıyorum. Redüksiyonun kalitesine erişmek için stres değerini kontrol etmek istiyorum. 0 - 1 arasında bir şey bekliyordum. Ancak, bu aralığın dışında değerler aldım. İşte minimal örnek:Stress özniteliği - 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() 

Ki, benim testinde aşağıdaki baskılı:

263,412196461

Ve bu resim üretti:

enter image description here

nasıl bu değeri analiz edebilir miyim Maksimum değeri bilmek? Ya da normalleştirmek için, 0 ile 1 arasında var mı?

Teşekkür ederiz.

+0

Aynı problemim var, cevabı buldunuz mu? Burada ayrıca 0 ile 1 arasında olması gerektiği belirtilmektedir. Http://www.analytictech.com/borgatti/mds.htm – student

+0

Merhaba, @student. Evet, bunu çözdüm. Hatırladığım kadarıyla, bu yöntemin "stres" fonksiyonu normalleştirilmiyor. 0 ile 1 arasında yer almak için paydayı (https://en.wikipedia.org/wiki/Multidimensional_scaling) eklemelisiniz. – pceccon

cevap

1

Mevcut en scikit-öğrenme çünkü uygulama hesaplar ve size (σ) Stres-1 bekliyoruz ederken ham Stres değerini (σ r) döndürür. İlke çok bilgilendirici değildir (yüksek değeri mutlaka uyumsuzluk anlamına gelmez) ve güvenilirliğin daha iyi bir yolu normlu bir stresi hesaplamaktır, örn. Kruskal'a göre (1964, s. 3) Stress-1'in aşağı yukarı şu yorumu vardır: 0 değeri mükemmel uyum gösterir, 0.025 mükemmel, 0.05 iyi, 0.1 adil ve 0.2 fakirdir.

Sadece Stress-1 ve sent PR hesaplamaları gerçekleştirdim. Bu arada bir Gerilme-1 kullanılmış ve parametre Gerçek (varsayılan olarak Yanlış) olarak ayarlanmıştır normalleştirmek zaman yerine çiğ Stres döndürülür version from this branch kullanabilirsiniz.

Daha fazla bilgi için bkz. Kruskal (1964, s. 8-9) veya Borg ve Groenen (2005, s. 41-43).