プロが教える店舗&オフィスのセキュリティ対策術

プログラムのアルゴリズムについて教えてください。
アマゾン等のECサイトでは「この商品を見た人は、この商品も見ています」「この商品を買った人は、この商品も買っています」等の機能がついています。こういった機能はどう実現しているのでしょうか。

単純に考えれば、2次元配列(例えば$kanrenとか)を作り、商品名や商品IDを添え字にして
$kanren["shohin_a"]["shohin_b"]++
として関連度をカウントし、カウント数上位から表示する方法を思いつきます。

しかし、仮に商品が1万点とかあったとしたら、相当なメモリ使用量になります。データベースは詳しくないので分かりませんが、1万×1万個のデータを扱うのは負担は大きそうだなと思います。

またカウントアップのタイミングも難しく感じます。直前に見た(買った)商品だけでカウントアップするのでは関連度を出すのに不十分な気がしますし、かと言って過去10商品(過去10ページ)とかを記憶してカウントアップする場合、上手くやらないと2重・3重にカウントアップしてしまいそうです。

色々なサイトに実装されているので、何か上手なアルゴリズムがあるのだろうと思います。
そちらを教えていただければ。サイトのURL等や、書籍の名前でも構いません。
一応、使用言語はPHPを考えています。ですので、もしライブラリ等あるのであれば、そちらを紹介いただくのでも構いません。

ちなみに、当方のスキルですが、趣味プログラマとして30年ほどの経歴はあります。言語もBASIC、C、C++、Javascript、Perl、Pascal などの経験があります。オブジェクト指向プログラミングも分かります。あくまで自分の趣味の域ですので、何かフリーソフトを公開したり等の経験はないレベルですが、アルゴリズムの説明は概ね理解できると思います。また、データベースの利用経験は全くありませんのでSQLなどは分かりませんが、一般的な意味でのデータ管理の範囲ならば普通に理解できると思います。

よろしくお願いします。

A 回答 (5件)

クラスター分析をしていると思いますよ。


http://www.albert2005.co.jp/technology/mining/cl …

計算はDWHによるバッチ処理でしょうね。
広告なんでリアルタイムに変更する必要はありませんから
マシンリソースについても
amazonだったら1万台以上の分散処理していると思われます
    • good
    • 0
この回答へのお礼

クラスター分析ですか。
ざっと読んでみましたが、面白いです。
何かのパラメータで対象をマッピングして、その距離を比較することによって、クラスターを形成…ってところでしょうか。
で、「ユーザーをパラメータにして商品をマッピングしてクラスター化し、対象商品と同じクラスター内の商品を表示する」か「商品をパラメータにしてユーザーをマッピングしてクラスター化し、対象ユーザーと同クラスターのユーザーの好みの商品を適当に表示する」みたいな感じなのですね。

計算タイミングも、確かに「広告なんでリアルタイムに変更する必要はありません」に尽きますね。あくまで便利機能と割り切れば、分散処理まで使わずとも、例えば7000件のデータを1000件ずつに分けて1週間かけて計算しても良いのでしょうし(1週間の間のデータの動きで、計算日によって結果に不整合が出るが、便利機能と割り切る)。

何となく、方向性が見えてきた気がします。ありがとうございます。

お礼日時:2016/11/21 13:02

>データベースの利用経験は全くありませんのでSQLなどは分かりません



とりあえずデータベース(RDB)なしでは作れないので、
RDBの基礎を学習することをお勧めします
RDBであればさほど負荷が高い処理ではないと思います
    • good
    • 0
この回答へのお礼

そうですね。ありがとうございます。

お礼日時:2016/11/21 13:03

RDBが必須であるとは思いますけどね



それこそ所詮広告なんでトランザクション管理は重要でないです。
KVSなんかで処理を軽くしてもよいです。
    • good
    • 0
この回答へのお礼

30年前、それこそBASICやPASCALなんて連想配列すら使えない環境で、データ管理を全部自前でやらなきゃいけない状況からのスタートなので、(体系だった知識ではないですが)RDB的な思考やデータ設計はできるんですけれども。
ただそれ故に、SQL使ういわゆる「データベース」を勉強するモチベーションがわかないんですよね(苦笑)。

今やせっかく簡単にデータを自在に高速で堅牢に扱える環境が(タダで)使えるのだから、車輪の再発明みたいなことしてちゃダメだろと分かりつつ、ブラックボックス的なの嫌だなとか、勉強する時間と自力実装する時間とどっちが短いかなとか、ついつい考えてしまいます。

お礼日時:2016/11/22 01:51

No3です


間違えた
×RDBが必須であるとは思いますけどね
○RDBが必須であるとは思いませんけどね

どちらにしても、すべての技術を理解するには人生は短すぎると思います
    • good
    • 0
この回答へのお礼

どの技術を理解するかの選択は難しいですね。
SQLなどは、覚えるコスト(手間)も大きい一方で、十分覚える価値があるものだけに…

お礼日時:2016/11/25 12:59

私もその昔PC-6001で打ち込みDTMやってました


カセットテープに保存したデータのロード時間が
打ち込んだ音楽より長いという懐かしい時代をすごしました
PCとは何をやるにも高価につき大変な時代でした

閑話休題、それを考えるといまやPCは安く、アプリはほぼタダという恵まれた時代です。
データベースも基本無料でそうとう高レベルの処理が可能になりましたので
やらない手はないと思いますよ。
    • good
    • 0
この回答へのお礼

古プログラマーの方なら分かってもらえると思いますが、昔はどんな処理でも自分でゴリゴリと書いていて、それがまた楽しかっただけに、ついつい車輪の再発明に走ってしまう誘惑が…(笑)

お礼日時:2016/11/25 13:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!