PythonでMDSをしたい

次元縮約する際に、PCAが有名ですが、パラメトリックという前提が辛かったり、各データが類似度/距離/共起などしか取得できないことがあります。

その際でも使えるのがMDSです。

使い方

sklearnの基本的な形のままです。
比率尺度でないときはmetric=Falseにします。
また、既に距離行列の形の場合、dissimilarity=precomputedにします。

from sklearn.manifold import MDS

mds = MDS(
    n_components=2,
    metric=True,
    dissimilarity='euclidean'
)
X = mds.fit_transform()

▼距離行列を作る場合 esu-ko.hatenablog.com

使ってみる

ワインデータでやってみます。

from sklearn.datasets import load_wine

wine = load_wine()
mds = MDS(n_components=2,metric=True,dissimilarity='euclidean')
X = mds.fit_transform(wine.data)

import matplotlib.pyplot as plt

plt.scatter(X[:,0],X[:,1])

f:id:esu-ko:20200905212143p:plain

tsneと同じような形になりました

esu-ko.hatenablog.com

特徴量の相関行列を使ってみる

相関行列をつくってそれを渡します。

mds2 = MDS(n_components=2,metric=False,dissimilarity='precomputed')

#スピアマン順位相関係数
# corr(method = "spearman")
# ケンドール順位相関係数
# data.crr(method = "kendall") 

X2 = mds2.fit_transform(pd.DataFrame(wine.data).corr())

可視化は、ラベルをつけやすいaltairを使ってみます。

import pandas as pd
import altair as alt


source = pd.DataFrame({
    'x': X2[:,0],
    'y': X2[:,1],
    'label': wine.feature_names
})

points = alt.Chart(source).mark_point().encode(
    x='x:Q',
    y='y:Q'
)

text = points.mark_text(
    align='left',
    baseline='middle',
    dx=7
).encode(
    text='label'
)

points + text

f:id:esu-ko:20200905212542p:plain