コーディングに役立つ! アルゴリズムの基本

第10回 レコメンデーションとエディットグラフ

山下 寛人
オイシックス株式会社

2009/5/1

協調フィルタリングの実装(全ソースコード)

- PR -
レコメンデーションのソースコード(全部)
<html>
<head>
<script type="text/javascript">
<!--

function getStringById(id) {
    var element = document.getElementById(id);
    var str = element.value;
    if (str == undefined) {
        str = element.innerHTML;
    }
    return (str == undefined) ? "" : str;
}

Array.prototype.contains = function(value) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == value) { return true; }
    }
    return false;
}

var shouhin = [
    "にんじん", "じゃがいも", "だいこん",
    "たまご", "牛乳", "チーズ",
    "砂糖", "塩", "酢", "しょうゆ", "味噌"
];


var data =  [
    [0,2,3,5,9],
    [1,2,9,10],
    [0,4,5,8],
    [1,3,4,7],
    [1,0,4,5,8],
    [1,6,7,9],
    [3,5],
    [3,4,7],
    [1,2,7],
    [4,5,9,10],
    [2,6,9],
    [3,4,5],
    [1,7,10]
];

window.onload = function() {
    var table_html = '<table class="buy_table">';
    table_html += "<tr>";
    for (var i = 0; i < shouhin.length; i++) {
        table_html += "<th>" + shouhin[i] + "</th>";
    }
    table_html += "</tr>";
    for (var i = 0; i < data.length; i++) {
        table_html += "<tr>";
        var shouhin_id = data[i];
        for (var j = 0; j < shouhin.length; j++) {
            var buy = (shouhin_id.contains(j) ? "○" : " ");
            table_html += "<td>" + buy + "</td>";
        }
        table_html += "</tr>";
    }
    table_html += "</table>";
    document.getElementById('buy_table').innerHTML = table_html;

    var shouhin_select = document.getElementById('shouhin_select');
    for (var i = 0; i < shouhin.length; i++) {
        var option = new Option(shouhin[i])
        shouhin_select.options[i] = option;
    }

}


function execRecommendation() {
    var shouhin_select = document.getElementById('shouhin_select');
    var shouhin_select_id = shouhin_select.selectedIndex;

    var relation = new Array(shouhin.length);
    for (var i = 0; i<relation.length; i++) {
        relation[i] = 0;
    }

    for (var i = 0; i < data.length; i++) {
        var shouhin_id = data[i];
        if (!shouhin_id.contains(shouhin_select_id)) { continue; }
        for (var j = 0; j < shouhin_id.length; j++) {
            if (shouhin_select_id == shouhin_id[j]) { continue; }
            relation[shouhin_id[j]]++;
        }
    }

    var max_shouhin_id = 0;
    var max_value = 0;
    for (var i = 0; i < relation.length; i++) {
        if (max_value < relation[i]) { 
            max_shouhin_id = i;
            max_value = relation[i];
        }
    }

    var recommend = document.getElementById('recommend');
    recommend.innerHTML = "おすすめ:" + shouhin[max_shouhin_id];
}

//-->
</script>
<style type="text/css">
<!--
table.buy_table th { border:#000000 1px solid; text-align:center}
table.buy_table td { border:#000000 1px solid; text-align:center}
//>
</style>

</head>

<body>
    購入履歴
    <div id="buy_table"></div>
    <select id="shouhin_select"></select>
    <input value="購入" type="button" onClick="execRecommendation()"></input><br><br>
    <div id="recommend"></div>

</body>
</html>
Index
レコメンデーションとエディットグラフ
  Page1
実際のアプリケーションで使われるアルゴリズム
レコメンデーション
協調フィルタリングの実装
  Page2
文書比較のアルゴリズム
エディットグラフ
エディットグラフの実装(前半)
  Page3
エディットグラフの実装(後半)
より効率的なエディットグラフ
  Page4
O(ND)アルゴリズムの実装
連載の終わりに
Appendix
協調フィルタリングの実装(全ソースコード)

コーディングに役立つ! アルゴリズムの基本

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91

TechTargetジャパン

Coding Edge フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH