2

Я пытаюсь выяснить, как реализовать Principal Coordinate Analysis с различными метриками расстояния. Я наткнулся на оба skbio и sklearn с реализациями. Я не понимаю, почему реализация sklearn выполняется каждый раз, а skbio - это то же самое? Есть ли степень случайности до Multidimensional Scaling и, в частности, Principal Coordinate Analysis? Я вижу, что все кластеры очень похожи, но почему они разные? Правильно ли я это реализую?Почему «sklearn.manifold.MDS» случайный, когда «skcoio pcoa» нет?

Запуск 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) 

enter image description here

Теперь с sklearn «s 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]) 

enter image description here

+0

Терминология МДС является довольно запутанным, см [здесь] (http://stats.stackexchange.com/a/14017), чтобы найти хорошее описание различий , – jorgeca

ответ

3

PCAA scikit-bio (skbio.stats.ordination.pcoa) и MDS (sklearn.manifold.MDS) scikit-learn используют совершенно разные алгоритмы для преобразования данных. scikit-bio напрямую решает симметричную проблему с собственными значениями, а scikit-learn использует процедуру итерационной минимизации [1].

PCoA scikit-bio является детерминированным, хотя можно получить различные (произвольные) вращения преобразованных координат в зависимости от системы, выполненной на [2]. Сценарий scikit-learn по умолчанию является стохастическим по умолчанию, если не используется фиксированный random_state. random_state, по-видимому, используется для инициализации итеративной процедуры минимизации (в документах scikit-learn говорится, что random_state используется для «инициализации центров» [3], хотя я точно не знаю, что это означает). Каждый random_state может создавать несколько разные вложения с произвольным вращением [4].

Ссылки: [1], [2], [3], [4]

0

MDS - это вероятностный алгоритм, есть параметр random_state, который вы можете использовать для фиксации случайного семени, вы можете передать это, если хотите получать одинаковые результаты каждый раз. PCA, с другой стороны, является детерминированным алгоритмом, если вы используете sklearn.decomposition.PCA, вы должны получать одинаковые результаты каждый раз.

+0

Эй, спасибо за ответ. Всякий раз, когда я смотрю «PCoA» (основной анализ координат, а не основной анализ компонентов), ссылки отправляют меня на «MDS». Почему одна реализация не основана на «random_state»? –