異なる2次元ヒストグラム間での最適輸送距離を計算してみた。
import numpy as np import itertools import ot from matplotlib import pyplot as plt n = 100 bins_ = 10 range_ = ([0,1],[0,1]) d_TF = True # input 2-dim. histogram-1 r = np.random.rand(n,2).T f_,x_,y_ = np.histogram2d(r[0],r[1],bins=bins_,range=range_,density=d_TF) plt.hist2d(r[0],r[1],bins=bins_,range=range_,density=d_TF) plt.show() a = f_.reshape(bins_*bins_) # input 2-dim. histogram converted into 1-dim. array. # input 2-dim. histogram-2 r = np.random.rand(n,2).T f_,x_,y_ = np.histogram2d(r[0],r[1],bins=bins_,range=range_,density=d_TF) plt.hist2d(r[0],r[1],bins=bins_,range=range_,density=d_TF) plt.show() b = f_.reshape(bins_*bins_) # input 2-dim. histogram converted into 1-dim. array. # input cost matrix (distance between each coordinate) v_ = itertools.product(x_[:-1],y_[:-1]) v = np.array(list(v_)) c_ = v[np.newaxis]-v[:,np.newaxis] c = np.linalg.norm(c_,axis=2) P = ot.emd(a,b,c) # optimal transfer matrix OT = ot.emd2(a,b,c) # optimal transfer distance print(OT)
二次元ヒストグラムを一次元配列に変換(行列の要素を一行に並べ直した)し、コスト行列を各座標間の距離で定義。
座標行列はitertools.productでx,yの直積で表現。
三次元以上の空間にも容易に拡張できると思われる。