nano_exit

基礎的なことこそ、簡単な例が必要だと思うのです。

2次元ヒストグラムにおける最適輸送距離

異なる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の直積で表現。

三次元以上の空間にも容易に拡張できると思われる。