2

Ich versuche herauszufinden, wie mit verschiedenen Distanzmetriken zu implementieren. Ich stolperte über skbio und sklearn mit Implementierungen. Ich verstehe nicht, warum die Implementierung sklearn jedes Mal anders ist, während skbio das gleiche ist? Gibt es einen Grad der Zufälligkeit zu Multidimensional Scaling und insbesondere ? Ich sehe, dass alle Cluster sehr ähnlich sind, aber warum unterscheiden sie sich? Implementiere ich das richtig?Warum ist `sklearn.manifold.MDS` zufällig, wenn` skbio's pcoa` nicht ist?

Lauf Principal Coordinate Analysis mit Scikit-bio (d Skbio) immer die gleichen Ergebnisse erzielen lassen:

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

Jetzt mit 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

Die Terminologie MDS ist ziemlich verwirrend finden Sie [hier] (http://stats.stackexchange.com/a/14017) eine gute Beschreibung der Unterschiede zu finden . – jorgeca

Antwort

3

scikit-bios PCoA (skbio.stats.ordination.pcoa) und scikit-learns MDS (sklearn.manifold.MDS) verwenden völlig andere Algorithmen, um die Daten zu transformieren. scikit-bio löst direkt ein symmetrisches Eigenwertproblem und scikit-learn verwendet ein iteratives Minimierungsverfahren [1].

scikit-bios PCoA ist deterministisch, obwohl es möglich ist, verschiedene (willkürliche) Drehungen der transformierten Koordinaten abhängig von dem System zu erhalten, auf dem es ausgeführt wird [2]. scikit-learns MDS ist standardmäßig stochastisch, sofern nicht ein fester random_state verwendet wird. random_state scheint verwendet zu werden, um das iterative Minimierungsverfahren zu initialisieren (die scikit-learn Dokumente sagen, dass random_state verwendet wird, um die Zentren zu initialisieren [3], obwohl ich nicht genau weiß, was das bedeutet). Jede random_state kann leicht unterschiedliche Einbettungen mit beliebiger Rotation erzeugen [4].

Referenzen: [1], [2], [3], [4]

0

MDS ist ein probabalistischer Algorithmus, es gibt einen Parameter random_state, den Sie verwenden können, um die zufällige Saat zu beheben, Sie können diese übergeben, wenn Sie jedes Mal die gleichen Ergebnisse erhalten möchten. PCA auf der anderen Seite ist ein deterministischer Algorithmus, wenn Sie sklearn.decomposition.PCA verwenden, sollten Sie jedes Mal die gleichen Ergebnisse erhalten.

+0

Hey danke für die Antwort. Wann immer ich 'PCoA' (Hauptkoordinatenanalyse, nicht Hauptkomponentenanalyse) ansehe, senden die Links mich an 'MDS'. Warum basiert eine Implementierung nicht auf einem 'random_state'? –

Verwandte Themen