次元縮約する際に、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])
tsneと同じような形になりました
特徴量の相関行列を使ってみる
相関行列をつくってそれを渡します。
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