ankane / libmf
针对PHP的大规模稀疏矩阵分解
v0.2.0
2024-06-03 02:59 UTC
Requires
- php: >= 8.1
- ext-ffi: >= 8.1
Requires (Dev)
- phpunit/phpunit: ^10
README
LIBMF - 大规模稀疏矩阵分解 - 针对PHP
查看Disco以获取更高级的协同过滤
安装
运行
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