我试图弄清楚如何使用各种距离指标实施Principal Coordinate Analysis
。我偶然发现了skbio
和sklearn
的实现。 我不明白为什么sklearn
的实现在skbio
相同时每次都有所不同? {{1}是否存在一定程度的随机性特别是Multidimensional Scaling
?我看到所有的集群都非常相似,但为什么它们不同?我是否正确实施了这个?
使用Principal Coordinate Analysis
(即Principal Coordinate Analysis
)运行Scikit-bio
始终会得到相同的结果:
Skbio
现在使用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
答案 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_state
。 random_state
似乎用于初始化迭代最小化过程(scikit-learn文档说random_state
用于“初始化中心”[3]虽然我不知道究竟是什么意思) 。每个random_state
可以产生稍微不同的嵌入,任意旋转[4]。
答案 1 :(得分:1)
MDS是一种概率算法,您可以使用参数random_state
来修复随机种子,如果您希望每次都获得相同的结果,则可以传递此参数。另一方面,PCA是一种确定性算法,如果使用sklearn.decomposition.PCA
,每次都应得到相同的结果。