我正在使用scikit-learn方法MDS对某些数据执行降维。我想检查压力值以获取减少量的质量。我原本期望介于0到1之间。但是,我得到的值不在此范围内。这是一个最小的示例:

%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()

在我的测试中,它打印了以下内容:



并产生此图像:

python - 压力属性-sklearn.manifold.MDS/Python-LMLPHP

如何在不知道最大值的情况下分析该值?或者如何规范化它,使其在0到1之间?

谢谢你。

最佳答案

这是因为当前scikit-learn的实现会在您期望Stress-1(σ1)的同时计算并返回原始的Stress值(σr)。

前者不是很有用(它的高值不一定表示不合适),更好的传达可靠性的方法是计算一个标准应力,例如。根据Kruskal(1964,p.3)得出的Stress-1大致具有以下解释:值0表示完美契合,值0.025表示完美契合,值0.025表示良好,0.05表示良好,0.1表示一般,而0.2表示差。

我刚刚实现了Stress-1和sent PR的计算。同时,可以使用version from this branch,当normalize参数设置为True(默认为False)时,使用Stress-1并返回而不是原始的Stress。

有关更多信息,请参阅。 Kruskal(1964,第8-9页)或Borg and Groenen(2005,第41-43页)。

关于python - 压力属性-sklearn.manifold.MDS/Python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36428205/

10-12 17:35