当 `skbio 的 pcoa` 不是时,为啥 `sklearn.manifold.MDS` 是随机的?
Posted
技术标签:
【中文标题】当 `skbio 的 pcoa` 不是时,为啥 `sklearn.manifold.MDS` 是随机的?【英文标题】:Why is `sklearn.manifold.MDS` random when `skbio's pcoa` is not?当 `skbio 的 pcoa` 不是时,为什么 `sklearn.manifold.MDS` 是随机的? 【发布时间】:2016-08-11 20:46:10 【问题描述】:我试图弄清楚如何使用各种距离指标来实现 Principal Coordinate Analysis
。我偶然发现了skbio
和sklearn
的实现。 我不明白为什么sklearn
的实现每次都不同,而skbio
是一样的? Multidimensional Scaling
特别是Principal Coordinate Analysis
是否存在一定程度的随机性?我看到所有的集群都非常相似,但为什么它们不同?我是否正确执行此操作?
使用Scikit-bio
(即Skbio
)运行Principal Coordinate Analysis
总是给出相同的结果:
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)
现在使用sklearn
的Multidimensional Scaling
:
from sklearn.manifold import MDS
fig, ax=plt.subplots(ncols=5, figsize=(12,3))
for rs in range(5):
M = MDS(n_components=2, metric=True, random_state=rs, dissimilarity='precomputed')
A = M.fit(Ar_dist).embedding_
ax[rs].scatter(A[:,0],A[:,1], c=[0:"b", 1:"g", 2:"r"[t] for t in Se_targets])
【问题讨论】:
MDS 术语相当混乱,请参阅here 以找到对差异的良好描述。 【参考方案1】: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_state
。 random_state
似乎用于初始化迭代最小化过程(scikit-learn 文档说random_state
用于“初始化中心”[3] 虽然我不知道这到底是什么意思)。每个random_state
可能会产生略微不同的任意旋转嵌入[4]。
参考:[1]、[2]、[3]、[4]
【讨论】:
【参考方案2】:MDS 是一种概率算法,有一个参数random_state
可以用来固定随机种子,如果你想每次都得到相同的结果,你可以传递这个。另一方面,PCA 是一种确定性算法,如果您使用sklearn.decomposition.PCA
,则每次都应该得到相同的结果。
【讨论】:
您好,谢谢您的回答。每当我查找PCoA
(主坐标分析而不是主成分分析)时,链接都会将我发送到MDS
。为什么一个实现不是基于random_state
?以上是关于当 `skbio 的 pcoa` 不是时,为啥 `sklearn.manifold.MDS` 是随机的?的主要内容,如果未能解决你的问题,请参考以下文章