tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

多次元尺度構成法(MDS)メモ

  • 多次元尺度構成法は複数の要素の間で距離(あるいは距離に類似したもの)が計算できる時、それを用いてデータの数より低い次元を指定して、その次元にデータを配置する手法。

    • 距離に類似したもの、と書いたのは、順序などの非定量データを利用する非計量的MDSと呼ばれる手法も存在するため(以下では考慮しない)
  • 距離行列$S$が与えられる

  • $\mathbf{K} = -\dfrac{1}{2}({\bf I}-\dfrac{1}{n}{\bf 11}')S({\bf I}-\dfrac{1}{n}{\bf 11}')$として行列$K$を計算する
    • $\mathbf{H} = \mathbf{I} - \dfrac{1}{n}\mathbf{1}\mathbf{1}^T$はヤング・ハウスホルダー変換と呼ばれ、データ点の重心を原点に移動する
  • $\mathbf{K}$を固有値分解($\mathbf{K}\mathbf{V} = \mathbf{V}\mathbf{\Lambda}$)する
  • $\mathbf{X} = \mathrm{sqrt}(\mathbf{\Lambda})\mathbf{V}^T$
    • ここで固有値は大きい順(寄与が大きい順)に並べておく
  • $\mathbf{\Lambda}$の一部を取り出して$\mathbf{X}$を近似する

ちょっと試してみる

from sklearn.manifold import MDS
from sklearn.manifold import TSNE
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer

M = load_breast_cancer()
data = M.data
target = M.target # 0,1のラベルらしい
print(data.shape) #(569, 30)

mds = MDS(n_components=2, dissimilarity='precomputed') # 距離行列を使う
tsne = TSNE(n_components=2)

dist_mat = np.array([
    [np.dot(data[i,:], data[j,:]) for j in range(data.shape[0])]
    for i in range(data.shape[0])])

X = mds.fit_transform(dist_mat)
Y = tsne.fit_transform(data)

plt.scatter(X[:, 0], X[:, 1], col=target)
plt.show()

plt.scatter(Y[:, 0], Y[:, 1], col=target)
plt.show()

MDS

tSNE

この結果が良いのか悪いのかの判定すら付かないのでちょっと記述統計の練習をした方が良いようである。