Skip to content

Instantly share code, notes, and snippets.

@Ryokuchaneko
Ryokuchaneko / phpで学ぶ集合知プログラミング2.2
Last active December 19, 2015 16:28
まずはデータ・セットの作成
$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, 'The Night Listener'=> 3.0,
'You, Me and Dupree'=> 3.5),
'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,
'The Night Listener'=> 4.5, 'Superman Returns'=> 4.0,
@Ryokuchaneko
Ryokuchaneko / PHPで学ぶ集合知プログラミング2.3
Last active December 19, 2015 16:28
二人の評価者のユークリッド距離によるスコアを算出するsim_distanceとピアソン相関によるスコアを算出するsim_peasonを定義 リストの中から最も好みの似ている評価者を選び出すtopMatchesを定義
function sim_distance($person1, $person2){
$si = array();
foreach ($person1 as $k => $v) {
if (array_key_exists($k, $person2)) {
$si[$k] = 1;
}
}
if (count($si) == 0) {
return 0;
}
@Ryokuchaneko
Ryokuchaneko / PHPで学ぶ集合知プログラミング2.4
Last active December 19, 2015 16:28
評価者に重み付けを行い(自身とどの程度好みが似ているか) その重みづけスコアと書く評価者の評価点を掛けあわせて映画のタイトルごとにスコアを算出する もっともスコアの高い映画が、対象とするユーザーにオススメの映画となる
function getRecommendations($array, $person, $type) {
$totals = array();
$simSums = array();
$rankings = array();
foreach ($array as $other => $v) {
if ($other == $person ){
continue;
} elseif($type == 'pearson') {
$simulate = sim_pearson($array[$person], $array[$other]);
if($simulate <= 0) {
@Ryokuchaneko
Ryokuchaneko / PHPで学ぶ集合知プログラミング2.5
Last active December 19, 2015 16:29
今まで用いてきた評価者ごとの映画の評価配列を映画ごとの評価配列に変換する 以前に定義したtopMatches関数を使って、似た属性をもつ映画をランキング形式で表示できる。また、映画が誰に見られるべきかをgetRecommendationsを使って表示することができる
function transformPrefs($critics) {
$result = array();
foreach ($critics as $key => $person) {
foreach ($person as $item => $value) {
if(!isset($result[$item])){
$resutl[$item] = array();
}
$result[$item][$key] = $value;
}
}
@Ryokuchaneko
Ryokuchaneko / PHPで学ぶ集合知プログラミング2.7
Created July 12, 2013 16:54
transformPrefsでスコアのディクショナリをアイテムごとのディクショナリに変換して アイテムごとにループを回して各アイテムに似ているアイテムをランキングでとってくる 各ユーザーの評価で映画のタイトルのスコアに重みづけをしてアイテムベースでユーザーにオススメをする
function calculateSimilarItems($critics, $n) {
$result = array();
$itemPrefs = transformPrefs($critics);
$c = 0;
foreach($itemPrefs as $item => $v) {
$c++;
if( $c%100 == 0){
echo sprintf("%d / %d", $c, count($itemPrefs));
}
$scores = topMatches($itemPrefs, $item, $n, 'distance');
@Ryokuchaneko
Ryokuchaneko / PHPで学ぶ集合知プログラミング2.8
Created July 14, 2013 00:11
MovieLensのデータ・セットを使って商品の推薦を行います。 まず、loadMovieLens関数でMovieLensのデータをロードします。そして、getRecommendations関数を使ってユーザーベースの推薦を行い、calculateSimilarItems関数を使ってアイテム間の相関を計算し、getRecommendedItems関数でアイテムベースの推薦を行います。
function loadMovieLens($path) {
$movies = array();
$fp = fopen($path . "/u.item", "r");
while($line = fgets($fp)){
$line_explode = explode("|", $line);
$movies[$line_explode[0]] = $line_explode[1];
}
fclose($fp);
$prefs = array();
$fp = fopen($path . "/u.data", "r");
$people = array(array('Symour', 'BOS'), array('Franny', 'DAL'), array('Zooey', 'CAK'), array('Walt', 'MIA'), array('Buddy', 'ORD'), array('Les', 'OMA'));
$destination = 'LGA';
$flights = array();
$fp = fopen("schedule.txt", "r");
while($line = fgets($fp)) {
$line = rtrim($line);
$explode_line = explode(",",$line);
$origin = $explode_line[0];
$dest = $explode_line[1];
$depart = $explode_line[2];
@Ryokuchaneko
Ryokuchaneko / PHPで学ぶ集合知プログラミング5.2
Created July 14, 2013 04:21
誰がどの便でLGAにやってくるかを$sで表現する。各数字はその日の何便目に乗るか。そして、Seymourの行き・帰り・Frannyの行き・帰り・・・の順に並んでいる。この数列から各人の旅程の情報を出力する関数を定義する(printschedule)
$s = array(1,4,3,2,7,3,6,3,2,4,5,3);
function printschedule($r, $people, $flights, $destination) {
$d = count($r)/2;
for($i = 0; $i < $d; $i++){
$name = $people[$i][0];
$origin = $people[$i][1];
$out = $flights[$origin][$destination][$r[($i*2)]];
$ret = $flights[$destination][$origin][$r[($i*2+1)]];
echo sprintf("%10s%10s %5s-%5s $%3s %5s-%5s $%3s" . PHP_EOL, $name, $origin, $out[0], $out[1], $out[2], $ret[0], $ret[1], $ret[2]);
@Ryokuchaneko
Ryokuchaneko / PHPで学ぶ集合知プログラミング5.3
Created July 14, 2013 04:24
コスト関数の定義。運賃総額と空港での待ち時間、レンタカーの追加料金を含めたコストを旅程ごとに算出する関数を定義する。
function schedulecost($sol, $origin, $people, $flights, $destination) {
$totalprice = 0;
$latestarrival = 0;
$earliestdep = 24*60;
$d = count($sol)/2;
for ($i = 0; $i < $d; $i++) {
$origin = $people[$i][1];
$outbound = $flights[$origin][$destination][$sol[$i*2]];
$returnf = $flights[$destination][$origin][$sol[$i*2+1]];
@Ryokuchaneko
Ryokuchaneko / PHPで学ぶ集合知プログラミング5.4
Created July 15, 2013 13:05
ランダムサーチによる最小コストの旅程を求める関数。コスト関数を入れ替えれば旅程以外の問題でも最小、最大をランダムサーチによって求めることができる。
function randomoptimize($domain, $origin, $people, $flights, $destination) {
$best = 999999999;
$bestr = 'null';
for($i = 0; $i < 10000; $i++) {
$r = array();
for($s = 0; $s < count($domain); $s++) {
$r[] = rand($domain[$s][0], $domain[$s][1]);
}
$cost = schedulecost($r, $origin, $people, $flights, $destination);