首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么‘`skbio's pcoa`不是随机的呢?

为什么‘`skbio's pcoa`不是随机的呢?
EN

Stack Overflow用户
提问于 2016-08-11 20:46:10
回答 2查看 2.2K关注 0票数 6

我试图找出如何用不同的距离度量来实现Principal Coordinate Analysis。我偶然发现了skbiosklearn的实现。我不明白为什么每次sklearn**'s实现都是不同的,而** skbio 是一样的?Multidimensional Scaling,特别是Principal Coordinate Analysis有一定程度的随机性吗?我看到所有的集群都非常相似,但它们为什么不同?我是否正确地实现了这一点?

使用Principal Coordinate Analysis运行Scikit-bio (即Skbio)总是得到相同的结果:

代码语言:javascript
复制
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)

现在有了sklearnMultidimensional Scaling

代码语言:javascript
复制
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])

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-12 16:54:48

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

scikit-bio的PCoA是确定性的,尽管可以根据它在2上执行的系统接收变换坐标的不同(任意)旋转,除非使用固定的random_state,否则它的MDS在默认情况下是随机的。random_state似乎用于初始化迭代最小化过程(scikit学习文档称random_state用于“初始化中心”3,尽管我不知道这到底意味着什么)。每个random_state都可能产生与任意旋转4略有不同的嵌入。

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

票数 6
EN

Stack Overflow用户

发布于 2016-08-11 23:02:00

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38905833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档