2.3.2 ピアソン相関によるスコア

集合知プログラミング2章

概要

 閲覧数:1482  投稿日:2015-12-31  更新日:2016-01-02  

P1とP2のピアソン相関係数を返す

リンク先からの変更点
・'Michael Phillips' の 'The Night Listener' 評価を 3.0 から 4.0 へ変更


コード

$critics = array( 
  'Lisa Rose' => array( 
    'Lady in the Water' => 2.5,
    'Snakes on a Plane' => 3.5,
    'Just My Luck' => 3.0,
    'Superman Returns' => 3.5,
    'You, Me and Dupree' => 2.5,
    'The Night Listener' => 3.0,
  ),
  'Gene Seymour' => array( 
    'Lady in the Water' => 3.0,
    'Snakes on a Plane' => 3.5,
    'Just My Luck' => 1.5,
    'Superman Returns' => 5.0,
    'You, Me and Dupree' => 3.5,
    'The Night Listener' => 3.0,
  ),
  'Michael Phillips' => array( 
    'Lady in the Water' => 2.5,
    'Snakes on a Plane' => 3.0,
    'Superman Returns' => 3.5,
    'The Night Listener' => 4.0,
  ),
  'Claudia Puig' => array( 
    'Snakes on a Plane' => 3.5,
    'Just My Luck' => 3.0,
    'Superman Returns' => 4.0,
    'You, Me and Dupree' => 2.5,
    'The Night Listener' => 4.5,
  ),
  'Mick LaSalle' => array( 
    'Lady in the Water' => 3.0,
    'Snakes on a Plane' => 4.0,
    'Just My Luck' => 2.0,
    'Superman Returns' => 3.0,
    'You, Me and Dupree' => 2.0,
    'The Night Listener' => 3.0,
  ),
  'Jack Matthews' => array( 
    'Lady in the Water' => 3.0,
    'Snakes on a Plane' => 4.0,
    'Superman Returns' => 5.0,
    'You, Me and Dupree' => 3.5,
    'The Night Listener' => 3.0,
  ),
  'Toby' => array( 
    'Snakes on a Plane' => 4.5,
    'Superman Returns' => 4.0,
    'You, Me and Dupree' => 1.0,
  ),
);



//P1とP2のピアソン相関係数を返す。
function sim_pearson($prefs,$p1,$p2){

  //両者が互いに評価しているアイテムのリストを取得
  $si = array();
  foreach($prefs["$p1"] as $item => $val){
    if(isset($prefs["$p2"]["$item"])){
      $si["$item"] = 1;
    }
  }

  //要素の数を調べる。
  $n = count($si);

  //すべての嗜好,平方,積を合計する

  //嗜好の合計
  $sum1 = 0;
  $sum2 = 0;

  //平方の合計
  $sum1Sq = 0;
  $sum2Sq = 0;

  //積の合計
  $pSum = 0;

  foreach($si as $item => $val){
    $sum1 += $prefs["$p1"]["$item"];
    $sum2 += $prefs["$p2"]["$item"];
    $sum1Sq += pow($prefs["$p1"]["$item"],2);
    $sum2Sq += pow($prefs["$p2"]["$item"],2);
    $pSum += $prefs["$p1"]["$item"] * $prefs["$p2"]["$item"];
  }

  //ピアソンスコアを計算する
  $num = $pSum - ($sum1 * $sum2 / $n);
  $den = sqrt(($sum1Sq - pow($sum1,2) / $n) * ($sum2Sq - pow($sum2,2) / $n));

  if($den == 0){ return 0;}

  $r = $num / $den;
  return $r;
}


var_dump( sim_pearson($critics,'Lisa Rose','Gene Seymour') ); //float(0.39605901719067)
var_dump( sim_pearson($critics,'Lisa Rose','Lisa Rose') ); //float(1)
var_dump( sim_pearson($critics,'Lisa Rose','Toby') ); //float(0.99124070716193)




結果

float(0.39605901719067)
float(1)
float(0.99124070716193)



タグ


pow 





2.3.1 ユークリッド距離によるスコア

2.3.4 訳者をランキングする 



週間人気ページランキング / 5-24 → 5-30
順位 ページタイトル抜粋 アクセス数
1 配列キー内に「指定文字列が含まれるキー」と「その値」を抽出して、新しい配列を返す | 配列(型) 9
2 後ろから3文字削除 / 「18:00:00」→「18:00」 | 文字列(テキスト処理) 7
3 URLから、トップページ(index.html)判定 | ルーティング 4
3 null代入とunset()の違い | 変数 4
4 8桁の生年月日数字を分解 | 文字列(テキスト処理) 3
4 switch文判定 … 「in_array」「array_keys」 | 配列(型) 3
4 「指定文字」から「指定文字」までの文字列を削除 | マルチバイト文字列(テキスト処理) 3
4 平均値、分散、標準偏差を求める | 統計 3
4 対象文字列の内、「最初の指定文字列以前」と「それ以降の文字列」を取得する | 文字列(テキスト処理) 3
4 本日が「第何何曜日」の当日に該当するか、を判定 | 日付および時刻関連 3
5 多次元配列で特定キーが重複している箇所をランダムで1つだけ表示 | 多次元配列(型) 2
5 配列の空要素を削除 / array_diff()で空配列と比較し配列の差分を返す | 配列(型) 2
5 指定文字列より前を取得 | 文字列(テキスト処理) 2
5 PHPで最後の「指定区切り文字」より後ろを取得 | 配列(型) 2
5 range( ) を使用して日付期間を配列生成 | 日付および時刻関連 2
6 gethostbyaddr / IPアドレスからホスト名を取得 | ネットワーク 関数 1
6 配列要素を、文字列連結して表示 … 「array_map」×「無名関数」 | 配列(型) 1
6 配列要素を、文字列連結して表示(元配列を上書) … foreach文+implode | 配列(型) 1
6 preg_match_all | タグ毎エントリー一覧 1
6 配列の空要素を削除した後、添字を振り直す … array_diff() | 配列(型) 1
2025/5/31 1:02 更新