What is a good way to create an item-item similarity matrix for a recommendation engine where items aren’t actually rated by users, but rather “used”, “clicked”, “bought” or “played” by users? (Quora和訳)

http://www.quora.com/What-is-a-good-way-to-create-an-item-item-similarity-matrix-for-a-recommendation-engine-where-items-arent-actually-rated-by-users-but-rather-used-clicked-bought-or-played-by-users

What is a good way to create an item-item similarity matrix for a recommendation engine where items aren’t actually rated by users, but rather “used”, “clicked”, “bought” or “played” by users?

ユーザーによる評価ではなく、ユーザーによって”クリック”、”使用”、”購入”、”プレイ”されたアイテムの場合で、
レコメンデーションエンジンのためのアイテムxアイテムの類似度行列を作成するための良い方法は何ですか?

 

 

This has to do with Collaborative Filtering. Looks like many algorithms assume users have given ratings for the items. I think there are countless scenarios where users do not “rate” an item on some scale, but their behavior provides a “rating” which is just as valuable. I’m looking to figure out how to calculate similarity between items in this scenario.

協調フィルタリング関連の話です。
多くのアルゴリズムは、ユーザーが項目の評価を与えていると仮定しています。
私はユーザの行動で実際に”評価”をしない無数のシナリオがあると考えます。
しかしユーザの行動は、実は価値のある”評価”をしています。
私はこのシナリオで項目間の類似度を計算する方法知りたいと思ってます。

 

 

回答1

 I’ve been using the Jaccard Coefficient, and specifically, the Tanimoto Coefficient, both described at http://en.wikipedia.org/wiki/Jaccard_index to calculate item-item similarity. They are both measures of overlap.

The formula is

AB / ( A + B – AB)

Where AB is the number of times both items were rated(bought) together, A is the number of times item A was bought, and B is the number of times item B was bought.

How I calculate this, in a map-reduce friendly way:
For each user, generate all of the (itemA, itemB) pairs for all of the items bought, and then keep track of the number of occurrences of each item-item pair.

The hard part is determining AB for each item-item pair. Once you have that figured out, calculating the Tanimoto coefficient is easy(refer to formula).

Consider this simplified example:
Customer A bought items 1, 2, and 3
Customer B bought items 2, 3, 4, and 6
Customer C bought items 1, 2 and 5

Items 1 and 2 would be considered most similar because they were bought together most often, compared to the number of times they were individually bought, and and thus their Jaccard score is .66. The AB would be 2 while A(item 1) = 2 and B(item2) = 3.

The similarity between items 3 and 6 would be 1 / (2 + 1 – 1), or .50 since they were bought together only once.

How you get the number of times (itemA/itemB) were bought together is up to you, my approach involved using python streaming so that I can run it on a hadoop cluster. I was inspired by Peter Skomoroch ‘s excellent article on similarity calculations using python streaming, found at

http://aws.amazon.com/articles/2294

I’m currently computing item-item similarity on about 10k items using over 3.5 million ‘purchase’ records, and it runs in only a few minutes. When you generate the (item,item) pairs for each item in a user’s history, you will generate a LOT of data but then you can reduce this when you sum the counts of occurrences.

A white-paper on this can be found at http://www.infosci.cornell.edu/weblab/papers/Bank2008.pdf

私はジャカール係数を使用しています、そしてまた谷本係数も関連します。それらのアイテム-アイテムの類似性を計算についてはwikipedia参照。

それらは両方ともオーバーラップの手段です。
その計算式は、
AB / ( A + B – AB)
ここでABは、AB同時に購入された回数、AはAがく購入された回数、BはBが購入された回数です。
私はこれを計算する方法として、MapReduceアルゴリズムに沿った方法として、

各ユーザーに対して、購入したアイテムのすべての「アイテム – アイテム」ペアを生成し、
その後、各「アイテム – アイテム」ペアの出現回数を追跡する。

難しい部分は、各アイテム-アイテムペアのABを決定することである
谷本係数を算出するのは簡単です。
以下のシンプルな例:
顧客Aは商品1,2,3を購入
顧客Bは商品2,3,4,6を購入
顧客Cは商品1,2,5を購入

 

アイテム1と2は、彼らが購入した回数に対して、最も頻繁に一緒に購入されているため、最も類似していると見なす、
ジャカールスコアは0.66である。AB=2、A=2、B=3。(これを上記の計算式に当てはめる)
アイテム3と6は、一度だけ一緒に購入されており、ジャカールスコアは0.50。
どのようにアイテムペアの同時購入回数を計算するか、pythonによるhadoop streamingのアプローチがあります。
私は現在350万人以上”購入”レコードを使用して約10,000のアイテム対し、アイテム-アイテム類似度を計算しています。
そしてそれはわずか数分で実行されます。
あなたがユーザの購入履歴らアイテム-アイテムペアを生成するときに大量のデータを生成しますが、出現回数のカウントすることとで、それを集計します。

参考論文があります。http://www.infosci.cornell.edu/weblab/papers/Bank2008.pdf

回答2

Perform cohort analysis on how much these different events lead to each other. Then you’ll be able to normalize the “downstream” likelihood (i.e., conditional probability) of events in relation to each other. For example, if 1 “clicked” event has .03 probability of leading to a “bought” event, now you can normalize to find the expected value of 1000 “clicked” events, in terms of “bought” outcomes.

これらの異なる出来事がどれくらい互いヘ導くかについての同世代分析を行なってください。
その後、互いに関しての出来事の「下流の」可能性(つまり条件付き確率)を標準化することができるでしょう。
例えば、今、1つの「クリックされた」出来事が「買われた」出来事に結びつく.03の可能性を持っている場合、1000の「クリックされた」出来事の期待値を見つけるために「買われた」結果の点から標準化することができます。

 

回答3

I think you might be interested in looking at this paper:
H. Yu, Y. Koren, C. Volinsky. Collaborative Filtering for Implicit Feedback Datasets. IEEE International Conference on Data Mining 2008.

http://research.yahoo.com/pub/2433

It includes a very thorough discussion of how to deal with implicit data (like clicks, views, etc); where, unlike ratings, you (a) don’t have negative feedback, and (b) the feedback you obtain can be used to measure the confidence you have that someone likes something, rather than their preference.
They also give some detailed descriptions of algorithms for this kind of data, ranging from neighborhood to latent factor models.

 

私は、この論文を見ることに、あなたは興味を持っているかもしれないと思います:
http://research.yahoo.com/pub/2433

それは、暗黙のデータ(クリック、視界などのような)に対処する方法の非常に完全な議論を含んでいます;
格付けと異なり、あなたが(a)ネガティブ・フィードバックを持たず、(b)得るフィードバックは、ユーザの好みではなく、誰かが何かを好きであることを測定するために使用することができます。
さらに、近隣から潜在している因子モデルまで、この種のデータ用アルゴリズムのいくつかの詳細な記述もあります。

 

回答4

It’s entirely reasonable to map these behaviors to some scalar values — maybe a page view is “0.1″, a video play is “0.3″ and a favorite is “1.0″. Then you can apply any technique that operates on rating values. Picking the right values is up to your domain and your intuition, though you could also use machine learning techniques to figure optimum weights even!

いくつかのスカラー値にこれらの行動を割り当てることは完全に合理的です
おそらく、ページビューは「0.1」です。ビデオ・プレーは「0.3」です。また、お気に入りは「1.0」です。
その後、値の評価上で作動するあらゆる技術を適用することができます。

さらに、あなたは最適の重量を計算するために機械学習技術を使用することができましたが、正しい値を取ることはあなたの領域とあなたの直観 さえあります!

 

回答5

One way would be to have separate matrices for each type of action.
You could interpolate the results from each to get your final output. Obviously “bought” would have a much higher weight than “clicked”… Instead of interpolation you could also use something like a backoff model.

1つの方法は各タイプのアクション用の個別のマトリックスを持つことでしょう。
最終産出物を得るために、各々の結果を設定します。
「買われた」は、明らかに「クリックされた」よりはるかに高い重量を持つだろう…
書き入れの代わりに、さらにbackoffモデルのようなものを使用することができました。