元理系院生の新入社員がPythonとJavaで色々頑張るブログ

プログラミングや機械学習について調べた事を書いていきます

pythonでプログラミングを行う時によく使うlambda式

はじめに

研究で実験システムを構築する際に良く利用するlambda式を備忘録も兼ねて記します。

どんなlambda式?

ユークリッド距離

ユークリッド距離とはピタゴラスの公式によって得られる二点間の距離の事であり、距離を測る対象の点をそれぞれa,bとし、次元を下付きの添字(n=1...N)とした時、以下の式 d で与えられられます。
 d(a,b)=\sqrt{(a_{1}-b_{1})^2+(a_{2}-b_{2})^2+\ldots+(a_{N}-b_{N})^2}


この式をlambda式に置き換えると次のようになります。

dist = lambda item1_, item2_: math.sqrt(sum([(item_[0]-item_[1])**2 for item_ in list(zip(item1_, item2_))]))

このlambda式のitem1_, item2_にそれぞれ同じ次元のベクトルを渡すと、ベクトル間のユークリッド距離を返します。

使用例

xy平面上のa = [1, 2], b = [0, 0]の距離を求める時は、次のように使用します。

a = [1, 2]
b = [0, 0]
dist = lambda item1_, item2_: math.sqrt(sum([(item_[0]-item_[1])**2 for item_ in list(zip(item1_, item2_))]))
print(dist(a, b))

リストの次元数を数える

リストの次元数を数え上げるlambda式です。次に記述した多次元リストの要素同士の演算で使用します。

count = lambda item, cnt=1: count(item=item[0], cnt=cnt+1) if type(item[0]) is type(list()) else cnt
使用例

3次元ベクトル a = [[[1,2,3,4],[1,2,3,4]], [[0,0],[0,0]], [[0,0],[1,1]]]の次元数を数えるときは、次のようにします。

a = [[[1,2,3,4],[1,2,3,4]], [[0,0],[0,0]], [[0,0],[1,1]]]
count = lambda item, cnt=1: count(item=item[0], cnt=cnt+1) if type(item[0]) is type(list()) else cnt
print(count(a))

多次元リストの要素同士の加算

N次元ベクトルの各要素を要素ごとに加算するlambda式です。
2次元ベクトル a = [[1,2,3], [1,2,3]], b = [[10,10,10], [10,10,10]]に適応すると、[[11,12,13],[11,12,13]]となります。

multi_list_add = lambda item1, item2: [(lambda item1_, item2_: [sum(i) for i in zip(item1_, item2_)])(val1, val2) for val1, val2 in zip(item1, item2)] if count(item1) == 2 else [multi_list_add(val1, val2) for val1, val2 in zip(item1, item2)]
使用例

2次元ベクトル a = [[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]], b = [[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]]に適応すると次のようになります。

a = [[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]]
b = [[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]]
multi_list_add = lambda item1, item2: [(lambda item1_, item2_: [sum(i) for i in zip(item1_, item2_)])(val1, val2) for val1, val2 in zip(item1, item2)] if count(item1) == 2 else [multi_list_add(val1, val2) for val1, val2 in zip(item1, item2)]
print(multi_list_add(a, b))

多次元リストの要素同士の乗算

今度は乗算です。使い方は先程の加算と同様です。

multi_list_div = lambda item, div_value: [(lambda item_, div_value_: [val_/div_value_ for val_ in item_])(val, div_value) for val in item] if count(item) == 2 else [multi_list_div(val, div_value) for val in item]

これらのlambda式はクラスタリングアルゴリズムであるk-means法を一般化したプログラムをコーディングを行った際に使用したものです。
記していた思ったのですが、非常にニッチな機能ですね。