ankane/libmf

针对PHP的大规模稀疏矩阵分解

v0.2.0 2024-06-03 02:59 UTC

This package is auto-updated.

Last update: 2024-09-09 08:43:03 UTC


README

LIBMF - 大规模稀疏矩阵分解 - 针对PHP

查看Disco以获取更高级的协同过滤

Build Status

安装

运行

composer require ankane/libmf

将脚本添加到composer.json中以便下载共享库

    "scripts": {
        "post-install-cmd": "Libmf\\Vendor::check",
        "post-update-cmd": "Libmf\\Vendor::check"
    }

然后运行

composer install

入门

将数据准备好为rowIndex, columnIndex, value格式

$data = new Libmf\Matrix();
$data->push(0, 0, 5.0);
$data->push(0, 2, 3.5);
$data->push(1, 1, 4.0);

创建一个模型

$model = new Libmf\Model();
$model->fit($data);

进行预测

$model->predict($rowIndex, $columnIndex);

获取潜在因子(这些近似于训练矩阵)

$model->p();
$model->q();

获取偏置(训练矩阵中所有元素的平均值)

$model->bias();

将模型保存到文件

$model->save('model.txt');

从文件加载模型

$model = Libmf\Model::load('model.txt');

传递验证集

$model->fit($data, $validSet);

交叉验证

执行交叉验证

$model->cv($data);

指定折数

$model->cv($data, 5);

参数

传递参数 - 以下为默认值

use Libmf\Loss;

new Libmf\Model(
    loss: Loss::RealL2,     // loss function
    factors: 8,             // number of latent factors
    threads: 12,            // number of threads used
    bins: 25,               // number of bins
    iterations: 20,         // number of iterations
    lambdaP1: 0,            // coefficient of L1-norm regularization on P
    lambdaP2: 0.1,          // coefficient of L2-norm regularization on P
    lambdaQ1: 0,            // coefficient of L1-norm regularization on Q
    lambdaQ2: 0.1,          // coefficient of L2-norm regularization on Q
    learningRate: 0.1,      // learning rate
    alpha: 1,               // importance of negative entries
    c: 0.0001,              // desired value of negative entries
    nmf: false,             // perform non-negative MF (NMF)
    quiet: false            // no outputs to stdout
);

损失函数

对于实值矩阵分解

  • Loss::RealL2 - 平方误差(L2范数)
  • Loss::RealL1 - 绝对误差(L1范数)
  • Loss::RealKL - 广义KL散度

对于二值矩阵分解

  • Loss::BinaryLog - 对数误差
  • Loss::BinaryL2 - 平方铰链损失
  • Loss::BinaryL1 - 铰链损失

对于一类矩阵分解

  • Loss::OneClassRow - 行导向的成对对数损失
  • Loss::OneClassCol - 列导向的成对对数损失
  • Loss::OneClassL2 - 平方误差(L2范数)

度量

计算RMSE(针对实值MF)

$model->rmse($data);

计算MAE(针对实值MF)

$model->mae($data);

计算广义KL散度(针对非负实值MF)

$model->gkl($data);

计算对数损失(针对二值MF)

$model->logloss($data);

计算准确率(针对二值MF)

$model->accuracy($data);

计算MPR(针对一类MF)

$model->mpr($data, $transpose);

计算AUC(针对一类MF)

$model->auc($data, $transpose);

示例

下载MovieLens 100K数据集并使用

$trainSet = new Libmf\Matrix();
$validSet = new Libmf\Matrix();

if (($handle = fopen('u.data', 'r')) !== false) {
    $i = 0;
    while (($row = fgetcsv($handle, separator: "\t")) !== false) {
        $data = $i < 80000 ? $trainSet : $validSet;
        $data->push($row[0], $row[1], $row[2]);
        $i++;
    }
    fclose($handle);
}

$model = new Libmf\Model(factors: 20);
$model->fit($trainSet, $validSet);

echo $model->rmse($validSet), "\n";

资源

历史

查看变更日志

贡献

鼓励每个人帮助改进这个项目。以下是一些你可以帮助的方式

开始开发

git clone https://github.com/ankane/libmf-php.git
cd libmf-php
composer install
composer test