td/idf の 2 つのベクトル間で従来のコサイン類似度を使用する場合、各項はベクトルの次元です。つまり、2 つの新しいベクトル A' と B' を形成し、これら 2 つの間の類似性を実行する必要があります。
これらのベクトルには各項の次元があり、65 個の項があります。
property 1: true and false
property 2: true and false
property 3: 0 through 50
property 4: 0 through 10
したがって、A' と B' は長さ 65 のベクトルになり、各要素は 0 または 1 になります。
A'(0) = 1 if A(0) = true, and 0 otherwise
A'(1) = 1 if A(0) = false, and 0 otherwise
etc.
明らかに、これは非効率的であることがわかります。td/idf でコサイン類似度を使用するために、実際に A' または B' を計算する必要はありません。それらを計算したふりをして、A と B で計算を実行できます。 A' と B' には正確に 4 つの 1 があるため、length(A') = length(B') = sqrt(4) であることに注意してください。
ただし、プロパティ 3 と 4 の類似性を考慮したい場合は、td/idf が最適ではない可能性があります。つまり、td/idf を使用すると、プロパティ 3 の値 40 はプロパティ 3 の値 41 とは異なり、ただし、41 は 12 よりも 40 から「離れている」とは見なされません。それらはすべて異なる用語です。
したがって、プロパティ 3 と 4 に距離を組み込む場合 (1 は 2 に非常に近く、50 は 2 から遠い)、距離メトリックを定義する必要があります。また、ブール値をプロパティ 3 および 4 よりも多くまたは少なく重み付けする場合は、別の距離メトリックも定義する必要があります。これらのことをしたい場合は、コサインを忘れて値を考え出してください。
次に例を示します。
distance = abs(A.property1 - B.property1) * 5 +
abs(A.property2 - B.property2) * 5 +
abs(A.property3 - B.property3) / 51 * 1 +
abs(A.property4 - B.property4) / 10 * 2
そして、類似度 = (すべての距離の最大値) - 距離;
または、必要に応じて、類似度 = 1 / 距離。
好きなように定義できます。類似度を 0 ~ 1 にする必要がある場合は、最大距離で割って正規化します。