2017-03-09 3 views
2

Kの最近隣について聞いたことがありますが、アイテムに属するカテゴリを見つけることができましたが、属性に基づいてアイテムのリストを返すアルゴリズムがあるかどうかは疑問でした。例えば類似の製品を属性別に検索する

結果は、前者結果はより多くの属性にマッチしているので、 "ヒル・トンプソン"

​​

代わりの

[director: "Hill Thompson", starring-actor: "Poop Jenkins", release-date: "Sept 1822"] 

を返すと「ウィルます映画

[director: "Hill Thompson", starring-actor: "Will Smith", release-date: "Dec 1776"] 

を与えられましたスミス "と呼ばれていたのに対し、前者はヒットトンプソンが1試合しかなかった。

コサイン類似性はこの問題を解決する良い方法でしょうか?

+0

類似性の定義方法は?一致したキー値の数だけで?どのようにネクタイは?主演男優賞:「ウィル・スミス」発売日:「1776年12月」の「監督:「レイ・トンプソン」」はあなたの前回の結果よりも優れていると考えられますか? – shole

+0

ああよい質問ですが、その場合、同じ数の属性を取得したら、両方とも返します –

+1

キーの間に重み/優先順位はありませんか? (例えば、ネクタイの場合、リリース日と一致するディレクターの重さにマッチする)これは値の類似性が重要でないことを意味しますか? (例えば、マッチした数が多い場合、監督:HiLL Thompsonは監督:idcwtfisthisと同じくらい悪いという意味ですか? – shole

答えて

2

コサイン類似性はこの問題を解決する良い方法でしょうか?

はい。良いでしょうが、TF-IDFで

最もよく使われる類似度はJaccard SimilarityCosine similarityです。 このシナリオでは、直接Jaccard Similarityを使用して、必要な結果を得ることができます。

セイ、

A = {director: "Hill Thompson", starring-actor: "Will Smith", release-date: "Dec 1776"} 
B = {director: "Hill Thompson", starring-actor: "Will Smith", release-date: "Jan 1996"} 
C = {director: "Hill Thompson", starring-actor: "Poop Jenkins", release-date: "Sept 1822"} 
D = {director: "Foo Bar", starring-actor: "Poop Jenkins", release-date: "Some date"} 

Jaccard Similarity
であろう:

J(A,B) = 2/4 = 0.5 
J(A,C) = 1/5 = 0.2 
J(C,D) = 1/5 = 0.2 

そしてJ(A,B) > J(A,C)としてK nearest neighbour方法を選ぶであろうB第次いでC。 このような場合、Jaccard similarityは直感をよく捕捉します。

は、 Cosine Similarityが優れている方法を示す1つの以上の属性を追加するには:

A = {place filmed : "A", director: "Hill Thompson", starring-actor: "Will Smith", release-date: "Dec 1776"} 
B = {place filmed : "A", director: "Hill Thompson", starring-actor: "Will Smith", release-date: "Jan 1996"} 
C = {place filmed : "A", director: "Hill Thompson", starring-actor: "Poop Jenkins", release-date: "Sept 1822"} 
D = {place filmed : "A", director: "Foo Bar", starring-actor: "Poop Jenkins", release-date: "Some date"} 


J(A,B) = 3/5 = 0.6 
J(A,C) = 2/6 = 0.33 
J(C,D) = 2/6 = 0.33 

お知らせ間違っ直感でJ(C,A) = J(C,D)

います。

なぜですか? 場所Aは映画を録画するのに一般的な場所のようです。ただ2つの映画が同じ場所に記録されているからといって、それらが似ていると結論づけることはできません。理想的にはそれはSim(C,D) > Sim(C,A)です。そのような場合は、Jaccard Similarityが直観を捕らえることができず、Cosine similarityTF-IDFである場合があります。

この場合、Cosine Similarityの問題は実装です。 Cosine similarityはベクター上で定義されています。データが数値でない場合は、ベクトルを作成することは困難です。

ベクトルを作成する1つの方法は、ベクトルbooleanです。

例えば、 ベクトルとして形成されることになる。

vector = [A,HillThompson,FooBar,WillSmith,Poop Jenkins,Dec 1776,Jan 1996, Sept 1822, Some date] 

ベクトルは次のようになります

A = {1,1,0,1,0,1,0,0,0} 
C = {1,1,0,0,1,0,0,1,0} 
D = {1,0,1,0,1,0,0,0,1} 

J(C,A) = 5/12 
J(C,D) = 5/12 

Jaccard Similarityはまだ間違った直感を捕捉すること。 TF-IDFが行われていない場合はCosine Similarityとなります。

今TF-IDFを計算する:

IDF(A)    = log(1 + 4/4) = 0.30 

IDF(HillThompson) = log(1 + 4/3) = 0.37 
IDF(FooBar)   = log(1 + 4/1) = 0.70 

IDF(WillSmith)  = log(1 + 4/2) = 0.48 
IDF(Poop Jenkins) = log(1 + 4/2) = 0.48 

IDF(Dec 1776)  = log(1 + 4/1) = 0.70 
IDF(Jan 1996)  = log(1 + 4/1) = 0.70 
IDF(Sept 1822)  = log(1 + 4/1) = 0.70 
IDF(Some date)  = log(1 + 4/1) = 0.70 

IF-IDFベクトルは、現在のようになります。したがって、TF-IDFCosine similarity

Cosine(A,C) = 0.01418/(0.2433 * 0.2433) = 0.2395 
Cosine(C,D) = 0.0200/(0.2492 * 0.2850) = 0.2816 

A = {0.30/4, 0.37/4, 0,  0.48/4, 0,  0.70/4, 0, 0,  0} 
C = {0.30/4, 0.37/4, 0,  0,  0.48/4, 0,  0, 0.70/4, 0} 
D = {0.30/4,  0, 0.70/4, 0,  0.48/4, 0,  0, 0,  0.70/4} 

A = {0.075, 0.0925, 0,  0.12, 0,  0.175, 0, 0,  0 } 
C = {0.075, 0.0925, 0,  0,  0.12, 0,  0, 0.175, 0 } 
D = {0.075, 0,  0.175, 0,  0.12, 0,  0, 0,  0.175 } 

|A| = 0.2433 
|C| = 0.2433 
|D| = 0.2850 

は、コサイン類似度を計算しますDがもっと似ているという直感を捉えるarはCからAまではCになります。こうして、それはJaccard similarity

よりも優れている私は、PC上ではなく科学的な電卓でそれらを行っているbecuase私は計算を示していることに注意してください。エラーの可能性があります。あなたが見つけた場合に備えて、それを修正してください。

関連する問題