Workerman を使用して協調フィルタリングに基づく映画推奨システムを実装する方法

PHPz
リリース: 2023-11-07 15:39:16
オリジナル
970 人が閲覧しました

Workerman を使用して協調フィルタリングに基づく映画推奨システムを実装する方法

インターネット技術の継続的な発展に伴い、ますます多くの Web サイトやアプリケーションがユーザー エクスペリエンスとパーソナライズされた推奨事項に重点を置き始めています。レコメンデーション システムはその中で非常に重要な部分であり、ユーザーの過去の行動や好みに基づいて、ユーザーの興味に最も適したコンテンツを推奨します。この記事では、Workerman フレームワークを使用して、協調フィルタリングに基づく映画推奨システムを実装する方法を紹介します。

1. 協調フィルタリング アルゴリズム

協調フィルタリングは、レコメンデーション システムで最も一般的に使用されるアルゴリズムの 1 つで、未知のアイテムに対するユーザーの評価、またはユーザーの履歴に基づいてユーザーがこれを好むかどうかを予測します。行動や好みのこと。協調フィルタリング アルゴリズムの基本的な考え方は、ユーザー間の類似点とアイテム間の類似点を発見することです。このうち、ユーザー間の類似性はユーザーの過去の評価の類似性を計算することで実現でき、アイテム間の類似性は異なるアイテムに対する異なるユーザーの評価を計算することで実現できます。

2. Workerman フレームワークの紹介

Workerman は、純粋に PHP で開発された高性能ネットワーク通信フレームワークであり、非同期ノンブロッキング IO モデルを採用しており、高い同時実行性、高い処理能力を備えています。パフォーマンスと低エネルギー消費を備え、多数の同時実行の長時間接続を処理でき、分散インスタント メッセージング、オンライン ゲーム、モノのインターネット、その他のシナリオの実装に使用できます。

3. Workerman を使用して協調フィルタリングに基づく映画推薦システムを実装する

  1. データの準備

まず、映画の評価データを準備する必要があります。セット、データ セットには、ユーザー ID、ムービー ID、およびムービーに対するユーザーの評価が含まれます。データ セットは MovieLens Web サイトからダウンロードできます。たとえば、ml-100k.zip パッケージをダウンロードします。解凍後、100,000 件の評価レコードが含まれる u.data ファイルを取得できます。データ セットの形式は次のとおりです。

UserID | MovieID | Rating | Timestamp
---------------------------------------
   196  |    242  |      3 | 881250949
   186  |    302  |      3 | 891717742
   196  |    377  |      1 | 878887116
...
ログイン後にコピー
  1. ユーザー評価モデルの確立

映画評価データ セットに従って、ユーザー評価モデルを確立できます。すべての映画のユーザー ID 評価に基づいてユーザーをクエリできます。以下は、ユーザー評価モデルの簡単な例です。

class UserModel
{
    public static function getRatings($userId)
    {
        $ratings = array();
        $file = fopen('u.data', 'r');
        while (($line = fgets($file)) !== false) {
            $data = explode("    ", trim($line));
            if ($userId == $data[0]) {
                $ratings[$data[1]] = $data[2]; // 记录该用户对该电影的评分
            }
        }
        fclose($file);
        return $ratings;
    }
}
ログイン後にコピー
  1. 協調フィルタリング モデルの確立

確立されたユーザー評価モデルに従って、協調フィルタリングを確立できます。このモデルは、ユーザーの過去の評価に基づいて、未知の映画に対するユーザーの評価を予測できます。以下は、簡単な協調フィルタリング モデルの例です。

class CFModel
{
    public static function predictRating($userId, $movieId)
    {
        $simUsers = array(); // 相似用户ID列表
        $simValues = array(); // 相似值列表
        $ratings1 = UserModel::getRatings($userId);
        if (empty($ratings1)) {
            return 0;
        }
        $file = fopen('u.data', 'r');
        while (($line = fgets($file)) !== false) {
            $data = explode("    ", trim($line));
            if ($userId != $data[0] && $movieId == $data[1]) { // 如果不是当前用户且电影相同
                $ratings2 = UserModel::getRatings($data[0]);
                if (!empty($ratings2)) { // 如果相似用户有评分记录
                    $sim = self::similarity($ratings1, $ratings2); // 计算相似度
                    if ($sim > 0) { // 如果相似度大于0
                        $simUsers[] = $data[0];
                        $simValues[] = $sim;
                    }
                }
            }
        }
        fclose($file);
        if (empty($simUsers)) {
            return 0;
        }
        arsort($simValues); // 按相似度从高到低排序
        $simUsers = array_slice($simUsers, 0, 10); // 取相似度最高的10个用户
        $simValues = array_slice($simValues, 0, 10); // 取相似度最高的10个用户的相似度值
        $sum = 0;
        $weight = 0;
        foreach ($simUsers as $k => $simUser) {
            $rating = UserModel::getRatings($simUser)[$movieId]; // 获取相似用户对该电影的评分
            $sum += $simValues[$k] * $rating; // 计算评分总和
            $weight += $simValues[$k]; // 计算权重总和
        }
        return round($sum / $weight); // 计算平均评分
    }

    public static function similarity($ratings1, $ratings2)
    {
        $commonKeys = array_keys(array_intersect_key($ratings1, $ratings2));
        if (empty($commonKeys)) {
            return 0;
        }
        $diff1 = $diff2 = 0;
        foreach ($commonKeys as $key) {
            $diff1 += ($ratings1[$key] - $ratings2[$key]) ** 2;
            $diff2 += ($ratings1[$key] - $ratings2[$key]) ** 2;
        }
        return $diff1 / sqrt($diff2);
    }
}
ログイン後にコピー
  1. レコメンデーション システム サービスの確立

上記の協調フィルタリング モデルに基づいて、次のようなレコメンデーション システム サービスを構築できます。 can ユーザー ID と映画 ID をパラメータとして受け取り、映画に対するユーザーの予測評価を返します。以下は、簡単なレコメンデーション システム サービスの例です。

use WorkermanProtocolsHttpRequest;
use WorkermanProtocolsHttpResponse;
use WorkermanWorker;

require_once __DIR__ . '/vendor/autoload.php';

$http_worker = new Worker("http://0.0.0.0:8888");

$http_worker->onMessage = function(Request $request, Response $response) {
    $userId = $request->get('userId');
    $movieId = $request->get('movieId');
    $rating = CFModel::predictRating($userId, $movieId);
    $response->header('Content-Type', 'application/json');
    $response->end(json_encode(array('rating' => $rating)));
};

Worker::runAll();
ログイン後にコピー
  1. レコメンデーション システム サービスのテスト

最後に、HTTP リクエストを送信して、レコメンデーション システム サービスをテストできます。例:

http://localhost:8888?userId=1&movieId=1
ログイン後にコピー

このリクエストは、映画に対するユーザーの予測評価を含む JSON 形式の応答を返します。

IV. 概要

この記事では、Workerman フレームワークを使用して、協調フィルタリングに基づく映画推奨システムを実装する方法を紹介します。このシステムは、ユーザーの履歴に基づいて、未知の映画に対するユーザーの評価を予測できます。行動と好み。コード例は単純な実装にすぎませんが、実際のアプリケーションでは、データ サイズ、アルゴリズムの最適化、モデルのトレーニングなど、多くの要素を考慮する必要があります。この記事が読者のレコメンデーション システムの理解と実装に役立つことを願っています。

以上がWorkerman を使用して協調フィルタリングに基づく映画推奨システムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!