0

私はまだPythonの初心者です。ベクトルとベクトル間の正規化された差を含むアルゴリズムを実装しようとしています。方程式は次のように与えられます。

Sr = 1 - ( || r1 - r2|| / || r1 + r2|| )

A given example gives r1 and r2 as shown below. 

r1 = {1 2 3 4 5 6 0 3 3 0 0 0 1 1}
r2 = {4 0 3 0 0 0 1 2 3 5 6 7 8 9}

Sr = 0.2023

式の内訳は次のようになります。

r1-r2 is the subtracting the item1 in r1 to the item1 in r2, subtracting the item2 in r1 to item2 in r2,..., until item-n in r1 and r2.

Let's say M is the total sum of (r1-r2)
M = sum(r1-r2) = sum[(1-4) + (2-0) +...+(1-9)]

||r1 - r2|| = math.sqrt(x)(math.(M, 2))

基本的に、他のすべての数学関連関数を実行できますが、2 つのリスト インデックスからインデックスごとに数値を加算/減算する必要がある M を計算する効率的な方法を見つけるのに問題があります。どんな提案も素晴らしいでしょう。ありがとう!

4

6 に答える 6

0

数学の問題の一部を行うにsumは、次のことができます。

sum(map(operator.__sub__, r1, r2))

r1これにより、要素 orとの間で減算が実行されr2、結果のリストが合計されます。

于 2013-04-10T04:49:32.290 に答える
0

numpyあなたの人生を簡素化することができます:

>>> import numpy as np
>>> r1 = np.array([1, 2, 3, 4, 5, 6, 0, 3, 3, 0, 0, 0, 1, 1])
>>> r2 = np.array([4, 0, 3, 0, 0, 0, 1, 2, 3, 5, 6, 7, 8, 9])
>>> 1 - np.linalg.norm(r1-r2) / np.linalg.norm(r1+r2)
0.20227596478253429

あなたの質問は、どの基準が必要かを明確に述べていません。しかし、答えは正しいようです。つまり、通常の 2 ノルムが必要です。こちらもご覧くださいnumpy.linalg.norm

于 2013-04-10T04:57:14.793 に答える
0

答えてくれたすべての人に感謝します。皆さんに投票できるなら、投票します。Reinier Torenbeek の回答を選択することにしました。これは、この方程式に対してやりたいことをすべて 1 つの単純な関数で行うためです。

これが、この部分の方程式を使用した方法です。

def wordOrderSim(list1, list2):
    r1 = np.array(list1)
    r2 = np.array(list2)
    Sr = 1 - np.linalg.norm(r1-r2) / np.linalg.norm(r1+r2)
    return Sr

r1 = [1, 2, 3 ,4 ,5 ,6 ,0 ,3 ,3 ,0 ,0 ,0 ,1 ,1]
r2 = [4 ,0 ,3 ,0 ,0 ,0 ,1 ,2 ,3 ,5, 6 ,7 ,8 ,9]

print wordOrderSim(r1, r2)

Serdalis、Sushant Gupta、Sheng、Paulo Scardine の回答に感謝しますすべてを加算する前の元の数値。申し訳ありませんが、適切な数学記号がないと説明するのが難しいです。

r1-r2 = [-3, 2, 0, 4, 5, 6, -1, 1, 0, -5, -6, -7, -7, -8]
sum(r1-r2) = [(-3^2) + (2^2) + (0^2) + (4^2) + (5^2) + (6^2) + (-1^2) + (1^2) + (0^2) + (-5^2 + (-6^2) + (-7^2) + (-7^2) + (-8^2)]
于 2013-04-10T05:24:29.213 に答える