应力属性——sklearn.manifold.MDS/Python
我正在使用scikit学习方法对一些数据进行降维。我想检查应力值,以获得减少的质量。我期望在0-1之间。但是,我得到的值超出了这个范围。下面是一个简单的例子:应力属性——sklearn.manifold.MDS/Python,python,machine-learning,scikit-learn,stress-testing,mds,Python,Machine Learning,Scikit Learn,Stress Testing,Mds,我正在使用scikit学习方法对一些数据进行降维。我想检查应力值,以获得减少的质量。我期望在0-1之间。但是,我得到的值超出了这个范围。下面是一个简单的例子: %matplotlib inline from sklearn.preprocessing import normalize from sklearn import manifold from matplotlib import pyplot as plt from matplotlib.lines import Line2D imp
%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()
%matplotlib内联
从sklearn.preprocessing导入规范化
从sklearn导入流形
从matplotlib导入pyplot作为plt
从matplotlib.lines导入Line2D
进口numpy
定义相似性度量(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]))
点=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))
返回点/(mag1*mag2)
plt.图(figsize=(15,15))
delta=numpy.zero((100100))
data_x=numpy.random.randint(01000,(100100))
data_y=numpy.random.randint(01000,(100100))
对于范围(100)内的j:
对于范围(100)内的k:
如果j这是因为当前scikit learn的实现在您预期应力-1(σ1)时计算并返回原始应力值(σr)
前者的信息量不大(其高值不一定表示不匹配),而传递可靠性的更好方法是计算标准应力,例如,根据Kruskal(1964年,第3页)的解释,应力-1或多或少有以下解释:值0表示完全匹配,0.025优秀,0.05良好,0.1一般,0.2差
我刚刚计算了应力-1和。同时,可以使用,当normalize参数设置为True(默认为False)时,使用并返回Stress-1而不是原始应力
欲了解更多信息,请参阅Kruskal(1964年,第8-9页)或Borg and Groenen(2005年,第41-43页)。在寻找Kruskal压力的同时,我发现了Ricco Rakotomalala。它包含一个代码示例,似乎可以计算正确的Kruskal应力:
import pandas
import numpy
from sklearn import manifold
from sklearn.metrics import euclidean_distances
## Input data format (file.csv) : dissimilarity matrix
# ; A ; B ; C ; D ; E
# A ; 0 ; 0.9 ; 0.8 ; 0.5 ; 0.8
# B ; 0.9 ; 0 ; 0.7 ; 0 ; 1
# C ; 0.8 ; 0.7 ; 0 ; 0.2 ; 0.4
# D ; 0.5 ; 0 ; 0.2 ; 0 ; 0.8
# E ; 0.8 ; 1 ; 0.4 ; 0.8 ; 0
## Load data
data = pandas.read_table("file.csv", ";", header=0, index_col=0)
## MDS
mds = manifold.MDS(n_components=2, random_state=1, dissimilarity="precomputed")
mds.fit(data)
# Coordinates of points in the plan (n_components=2)
points = mds.embedding_
## sklearn Stress
print("sklearn stress :")
print(mds.stress_)
print("")
## Manual calculus of sklearn stress
DE = euclidean_distances(points)
stress = 0.5 * numpy.sum((DE - data.values)**2)
print("Manual calculus of sklearn stress :")
print(stress)
print("")
## Kruskal's stress (or stress formula 1)
stress1 = numpy.sqrt(stress / (0.5 * numpy.sum(data.values**2)))
print("Kruskal's Stress :")
print("[Poor > 0.2 > Fair > 0.1 > Good > 0.05 > Excellent > 0.025 > Perfect > 0.0]")
print(stress1)
print("")
我也有同样的问题,你找到答案了吗?这里还指出,它应该介于0和1之间。是的,我解决了这个问题。就我所记得的,这种方法的“压力”函数并没有标准化。必须包含分母()才能使其介于0和1之间。谢谢。这很有帮助