为什么`sklearn.manifold.MDS`是随机的,当`skbio的pcoa`不是?

时间:2016-08-11 20:46:10

标签: machine-learning scikit-learn linear-algebra multi-dimensional-scaling skbio

我试图弄清楚如何使用各种距离指标实施Principal Coordinate Analysis。我偶然发现了skbiosklearn的实现。 我不明白为什么sklearn的实现在skbio相同时每次都有所不同? {{1}是否存在一定程度的随机性特别是Multidimensional Scaling?我看到所有的集群都非常相似,但为什么它们不同?我是否正确实施了这个?

使用Principal Coordinate Analysis(即Principal Coordinate Analysis)运行Scikit-bio始终会得到相同的结果:

Skbio

enter image description here

现在使用import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn import decomposition import seaborn as sns; sns.set_style("whitegrid", {'axes.grid' : False}) import skbio from scipy.spatial import distance %matplotlib inline np.random.seed(0) # Iris dataset DF_data = pd.DataFrame(load_iris().data, index = ["iris_%d" % i for i in range(load_iris().data.shape[0])], columns = load_iris().feature_names) n,m = DF_data.shape # print(n,m) # 150 4 Se_targets = pd.Series(load_iris().target, index = ["iris_%d" % i for i in range(load_iris().data.shape[0])], name = "Species") # Scaling mean = 0, var = 1 DF_standard = pd.DataFrame(StandardScaler().fit_transform(DF_data), index = DF_data.index, columns = DF_data.columns) # Distance Matrix Ar_dist = distance.squareform(distance.pdist(DF_data, metric="braycurtis")) # (n x n) distance measure DM_dist = skbio.stats.distance.DistanceMatrix(Ar_dist, ids=DF_standard.index) PCoA = skbio.stats.ordination.pcoa(DM_dist) ' s sklearn

Multidimensional Scaling

enter image description here

2 个答案:

答案 0 :(得分:5)

scikit-bio的PCoA(skbio.stats.ordination.pcoa)和scikit-learn的MDS(sklearn.manifold.MDS)使用完全不同的算法来转换数据。 scikit-bio直接解决了对称的特征值问题,scikit-learn使用了迭代最小化过程[1]。

scikit-bio的PCoA是确定性的,尽管可以根据在[2]上执行的系统接收变换坐标的不同(任意)旋转。默认情况下,scikit-learn的MDS是随机的,除非使用固定的random_staterandom_state似乎用于初始化迭代最小化过程(scikit-learn文档说random_state用于“初始化中心”[3]虽然我不知道究竟是什么意思) 。每个random_state可以产生稍微不同的嵌入,任意旋转[4]。

参考文献:[1][2][3][4]

答案 1 :(得分:1)

MDS是一种概率算法,您可以使用参数random_state来修复随机种子,如果您希望每次都获得相同的结果,则可以传递此参数。另一方面,PCA是一种确定性算法,如果使用sklearn.decomposition.PCA,每次都应得到相同的结果。