PHP では推奨アルゴリズムを使用できないのでしょうか?
#php は推奨アルゴリズムを使用できませんか?
レコメンデーション アルゴリズムは非常に古く、機械学習が登場する前からニーズとアプリケーションがありました。
協調フィルタリング (協調フィルタリング) は、オンライン コラボレーションやオフライン フィルタリングなど、最も古典的なタイプの推奨アルゴリズムです。いわゆるオンラインコラボレーションは、オンラインのデータからユーザーが好みそうなアイテムを見つけることであり、オフラインフィルタリングは、推奨値が低いデータや、ユーザーが高いにもかかわらず購入したデータなど、推奨に値しないデータをフィルタリングすることです。推奨値です。
以下では、PHP MySQL を使用して単純な協調フィルタリング アルゴリズムを実装する方法を紹介します。
協調フィルタリング推奨アルゴリズムを実装するには、まずアルゴリズムの中核となる考え方とプロセスを理解する必要があります。このアルゴリズムの核となる考え方は次のように要約できます。a と b が同じ一連のアイテムを好む場合 (ここでは b を隣人と呼びましょう)、a は b が好む他のアイテムを好む可能性があります。アルゴリズムの実装プロセスは次のように簡単に要約できます: 1. a がどの近傍を持っているかを決定します 2. 近傍を使用して、a が好むアイテムの種類を予測します 3. a が好む可能性のあるアイテムを a に推奨します。
アルゴリズムの中心となる式は次のとおりです:
1. コサイン類似度 (近傍の検索):
2. 予測式(どのようなアイテムが好きかを予測します):
これら 2 つの式だけから、これら 2 つの式に従って計算するだけで、大きな A が必要であることがわかります。実行されるループと判定の回数、およびソートアルゴリズムの選択と使用に関するソートの問題も含まれますが、ここではクイックソートを選択します。
最初にテーブルを作成します:
DROP TABLE IF EXISTS `tb_xttj`; CREATE TABLE `tb_xttj` ( `name` varchar(255) NOT NULL, `a` int(255) default NULL, `b` int(255) default NULL, `c` int(255) default NULL, `d` int(255) default NULL, `e` int(255) default NULL, `f` int(255) default NULL, `g` int(255) default NULL, `h` int(255) default NULL, PRIMARY KEY (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; INSERT INTO `tb_xttj` VALUES ('John', '4', '4', '5', '4', '3', '2', '1', null); INSERT INTO `tb_xttj` VALUES ('Mary', '3', '4', '4', '2', '5', '4', '3', null); INSERT INTO `tb_xttj` VALUES ('Lucy', '2', '3', null, '3', null, '3', '4', '5'); INSERT INTO `tb_xttj` VALUES ('Tom', '3', '4', '5', null, '1', '3', '5', '4'); INSERT INTO `tb_xttj` VALUES ('Bill', '3', '2', '1', '5', '3', '2', '1', '1'); INSERT INTO `tb_xttj` VALUES ('Leo', '3', '4', '5', '2', '4', null, null, null);
ここでは、f、g、h のどれを推奨できるかを確認するために、最後の行の Leo のみを推奨します。彼に。
php mysql を使用します。フローチャートは次のとおりです。
データベースに接続し、それを 2 次元配列として保存するコードは次のとおりです。
header("Content-Type:text/html;charset=utf-8"); mysql_connect("localhost","root","admin"); mysql_select_db("geodatabase"); mysql_query("set names 'utf8'"); $sql = "SELECT * FROM tb_xttj"; $result = mysql_query($sql); $array = array(); while($row=mysql_fetch_array($result)) { $array[]=$row;//$array[][]是一个二维数组 }
質問 1: このステップはテーブル クエリ全体と見なすことができます。この種のクエリはタブーです。このような小規模なデモンストレーション システムでは問題ありませんが、大きなデータ システムでは非効率です。
Leo などの Cos 値を見つけるコードは次のとおりです:
/* * 以下示例只求Leo的推荐,如此给变量命名我也是醉了;初次理解算法,先不考虑效率和逻辑的问题,主要把过程做出来 */ $cos = array(); $cos[0] = 0; $fm1 = 0; //开始计算cos //计算分母1,分母1是第一个公式里面 “*”号左边的内容,分母二是右边的内容 for($i=1;$i<9;$i++){ if($array[5][$i] != null){//$array[5]代表Leo $fm1 += $array[5][$i] * $array[5][$i]; } } $fm1 = sqrt($fm1); for($i=0;$i<5;$i++){ $fz = 0; $fm2 = 0; echo "Cos(".$array[5][0].",".$array[$i][0].")="; for($j=1;$j<9;$j++){ //计算分子 if($array[5][$j] != null && $array[$i][$j] != null){ $fz += $array[5][$j] * $array[$i][$j]; } //计算分母2 if($array[$i][$j] != null){ $fm2 += $array[$i][$j] * $array[$i][$j]; } } $fm2 = sqrt($fm2); $cos[$i] = $fz/$fm1/$fm2; echo $cos[$i]."<br/>"; }
このステップで得られる結果:
適切な Cos 値の並べ替えについての質問が表示されます。クイック ソート コードは次のとおりです。
//对计算结果进行排序,凑合用快排吧先 function quicksort($str){ if(count($str)<=1) return $str;//如果个数不大于一,直接返回 $key=$str[0];//取一个值,稍后用来比较; $left_arr=array(); $right_arr=array(); for($i=1;$i<count($str);$i++){//比$key大的放在右边,小的放在左边; if($str[$i]>=$key) $left_arr[]=$str[$i]; else $right_arr[]=$str[$i]; } $left_arr=quicksort($left_arr);//进行递归; $right_arr=quicksort($right_arr); return array_merge($left_arr,array($key),$right_arr);//将左中右的值合并成一个数组; } $neighbour = array();//$neighbour只是对cos值进行排序并存储 $neighbour = quicksort($cos);
ここの $neighbour 配列には、大きいものから小さいものへと並べ替えられた Cos 値のみが格納され、人々。この問題はまだ解決する必要があります。
Cos 値が最も高い 3 人をレオの隣人として選択します:
//$neighbour_set 存储最近邻的人和cos值 $neighbour_set = array(); for($i=0;$i<3;$i++){ for($j=0;$j<5;$j++){ if($neighbour[$i] == $cos[$j]){ $neighbour_set[$i][0] = $j; $neighbour_set[$i][1] = $cos[$j]; $neighbour_set[$i][2] = $array[$j][6];//邻居对f的评分 $neighbour_set[$i][3] = $array[$j][7];//邻居对g的评分 $neighbour_set[$i][4] = $array[$j][8];//邻居对h的评分 } } } print_r($neighbour_set); echo "<p><br/>";
このステップの結果:
これは 2 です-次元配列。配列の最初のレベルの添字は 0、1、2 で、3 人を表します。第 2 レベルの添字 0 は、データ テーブル内の近隣者の順序を表します。たとえば、Jhon はテーブル内の 0 番目の人です。添字 1 は、レオと近隣者の Cos 値を表します。添字 2、3、4 は、 、 h 評価はそれぞれ隣接ペア f と g を表します。
予測を開始し、次のように Predict コードを計算します。
レオの f、g、h の予測値をそれぞれ計算します。ここで問題となるのは、f、g、h のスコアが空の近傍がある場合にどう対処するかということです。たとえば、ジョンとメアリーの h に対する評価は空です。直感的に if を使って判断し、空であればこの一連の計算をスキップしようと考えましたが、これが合理的かどうかは検討の余地があります。以下のコードはこのif判定を書いていません。
//计算Leo对f的评分 $p_arr = array(); $pfz_f = 0; $pfm_f = 0; for($i=0;$i<3;$i++){ $pfz_f += $neighbour_set[$i][1] * $neighbour_set[$i][2]; $pfm_f += $neighbour_set[$i][1]; } $p_arr[0][0] = 6; $p_arr[0][1] = $pfz_f/sqrt($pfm_f); if($p_arr[0][1]>3){ echo "推荐f"; } //计算Leo对g的评分 $pfz_g = 0; $pfm_g = 0; for($i=0;$i<3;$i++){ $pfz_g += $neighbour_set[$i][1] * $neighbour_set[$i][3]; $pfm_g += $neighbour_set[$i][1]; $p_arr[1][0] = 7; $p_arr[1][1] = $pfz_g/sqrt($pfm_g); } if($p_arr[0][1]>3){ echo "推荐g"; } //计算Leo对h的评分 $pfz_h = 0; $pfm_h = 0; for($i=0;$i<3;$i++){ $pfz_h += $neighbour_set[$i][1] * $neighbour_set[$i][4]; $pfm_h += $neighbour_set[$i][1]; $p_arr[2][0] = 8; $p_arr[2][1] = $pfz_h/sqrt($pfm_h); } print_r($p_arr); if($p_arr[0][1]>3){ echo "推荐h"; } $p_arr是对Leo的推荐数组,其内容类似如下;
Array ( [0] => Array ( [0] => 6 [1] => 4.2314002228795 ) [1] => Array ( [0] => 7 [1] => 2.6511380196197 ) [2] => Array ( [0] => 8 [1] => 0.45287424581774 ) )
f は 6 列目、予測値は 4.23、g は 7 列目、予測値は 2.65...
終了 f、g、h 処理方法は 2 つありますPredict 値の後: 1 つは、Predict 値が 3 を超えるアイテムを Leo に推奨すること、もう 1 つは Predict 値を大きいものから小さいものに並べ替え、Predict 値が大きい上位 2 つのアイテムを Leo に推奨することです。このコードは書かれていません。
上記の例からも分かるように、推奨アルゴリズムの実装はループや判定、配列のマージなどが必要で非常に面倒です。適切に処理しないと、システムに負担がかかります。実際の処理ではまだ次の問題があります:
1. 上記の例では、Leo のみを推奨しており、Leo が項目 f、g、h を評価していないことがすでにわかっています。実際のシステムに導入した場合、推奨を行う必要があるユーザーごとに、どの項目が評価されていないのかを調べる必要があり、これもオーバーヘッドの一部となります。
2. テーブル全体のクエリを実行する必要はなく、実際のシステムではいくつかの標準値を設定できます。例: テーブル内の Leo と他の人々の間の Cos 値を見つけます。値が 0.80 より大きい場合、彼らは隣人である可能性があることを意味します。このようにして、10 個の近傍が見つかったら、テーブル全体のクエリを回避するために Cos 値の計算を停止します。この方法は、おすすめアイテムに対しても応用でき、例えば 10 アイテムだけをおすすめし、おすすめした後は Predict 値の計算をやめるなど、さまざまな用途に活用できます。
3. システムを使っていると項目も変化します、今日はfgh、明日はxyzかもしれません、項目が変わるとデータテーブルを動的に変更する必要があります。
4. コンテンツベースの推奨を適切に導入して、推奨アルゴリズムを改善できます。
5. 推奨される精度の問題 異なる標準値を設定すると精度に影響します。
PHP 関連の知識の詳細については、PHP 中国語 Web サイト をご覧ください。
以上がPHP では推奨アルゴリズムを使用できないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7
