多次元尺度法(Multidimensional Scaling; MDS)

2018/6/7

山手線の駅間の所要時間の例

品川 目黒 渋谷 原宿 新宿 高田馬場 池袋 巣鴨 田端 日暮里 上野 秋葉原 東京 新橋
品川 0 7 12 14 18 22 25 28 24 21 17 14 10 7
目黒 7 0 5 7 11 15 18 23 31 28 24 21 17 14
渋谷 12 5 0 2 6 10 13 18 22 25 29 26 22 19
原宿 14 7 2 0 4 8 11 16 20 23 27 28 24 21
新宿 18 11 6 4 0 4 7 12 16 19 23 26 28 25
高田馬場 22 15 10 8 4 0 3 8 12 15 19 22 26 29
池袋 25 18 13 11 7 3 0 5 9 12 16 19 23 26
巣鴨 28 23 18 16 12 8 5 0 4 7 11 14 18 21
田端 24 31 22 20 16 12 9 4 0 3 7 10 14 17
日暮里 21 28 25 23 19 15 12 7 3 0 4 7 11 14
上野 17 24 29 27 23 19 16 11 7 4 0 3 7 10
秋葉原 14 21 26 28 26 22 19 14 10 7 3 0 4 7
東京 10 17 22 24 28 26 23 18 14 11 7 4 0 3
新橋 7 14 19 21 25 29 26 21 17 14 10 7 3 0

多次元尺度法のPython3サンプルコード

# -*- coding:utf-8 -*-

import pandas
import sklearn.manifold as mfd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

if __name__ == '__main__':
    csv_filename = './yamateutf8.csv'
    png_filename = './yamateutf8.png'

    #data = pandas.read_csv(csv_filename, header=1)
    #data = pandas.read_csv(csv_filename)
    data = pandas.read_csv(csv_filename, usecols=range(1,15))

    print(data.T)

    D = data.as_matrix()

    mds = mfd.MDS(n_components=2, n_init=1, max_iter=100)
    X = mds.fit_transform(D)

    plt.scatter(X[:,0], X[:,1])
    for no,text in enumerate(list(data.columns)):
        plt.annotate(text, (X[no,0], X[no,1]))
    plt.savefig(png_filename)

変換ベクトル

山手線