SlopeOne推荐算法实现(C++)

SlopeOne算法是一种简单的协同过滤方法,基于用户对物品评分的平均差值预测未知评分。通过计算共同评价物品的用户分数差,预测用户对新物品的评分。在movielens数据集上,朴素实现的SlopeOne算法在测试集上的RMSE达到0.96,与复杂的SVD算法表现相当,证明其有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SlopeOne算法是一个非常简单的协同过滤算法,主要思想如下:如果用户u对物品j打过分,现在要对物品i打分,那么只需要计算出在同时对物品i和j打分的这种人中,他们的分数之差平均是多少,那么我们就可以根据这个分数之差来计算用户u对物品i的打分了,当然,这样的物品j也有很多个,那有的物品和j共同打分的人少,有的物品和j共同打分的人多,那么显而易见,共同打分多的那个物品在评分时所占的比重应该大一些。

如上就是简单的SlopeOne算法的主要思想,用维基百科上的一张图来表示(一看就懂):


途中用户B要对物品J进行评分,那么这时候发现物品i被用户B打为2分,而同时发现用户A同时评价了物品i和物品j,且物品i比物品j少了0.5分,那么由此看来,用户B给物品j打得分应该就是比给物品i打的分高0.5分,故是2.5分。

由于思想是如此简单,故我们就来实践一把,当然这里就是最最朴素的实现,只是为了检测下算法效果如何。。。数据集还是如上篇博客一样,用的是movielens里面的小数据集,其中有1000用户对2000物品的评分,80%用来训练,20%用来测试。

具体代码如下:

#include <iostream>
#include <string>
#include <fstream>
#include <math.h>
using namespace std;
const int USERMAX = 1000;
const int ITEMMAX = 2000;
double rating[USERMAX][ITEMMAX];
int I[USERMAX][ITEMMAX];//indicate if the item is rated
double mean;

double predict(int u, int l)
{
	double total = 0;
	double totalCnt = 0;
	for (int i 
### 解决 `interp1d` 函数无法用 Numba 加速的问题 Numba 对于加速 Python 代码非常有效,但对于某些 SciPy 的内置函数如 `interp1d` 并不直接支持。为了实现插值计算并利用 Numba 提供的速度优势,可以考虑两种主要方法: #### 方法一:自定义线性插值算法 通过编写一个简单的线性插值函数,并使用 Numba 进行 JIT 编译来提高性能。 ```python import numpy as np from numba import njit @njit(fastmath=True) def linear_interpolation(x, xp, fp): """ 实现线性插值功能. 参数: x (float or array-like): 需要插值的位置. xp (array-like): 已知数据点的横坐标. fp (array-like): 已知数据点对应的纵坐标. 返回: float or ndarray: 插值得到的结果. """ result = np.zeros_like(x) for i in range(len(x)): xi = x[i] if xi <= xp[0]: result[i] = fp[0] continue elif xi >= xp[-1]: result[i] = fp[-1] continue idx = np.searchsorted(xp, xi) - 1 dx = xp[idx + 1] - xp[idx] slope = (fp[idx + 1] - fp[idx]) / dx intercept = fp[idx] - slope * xp[idx] result[i] = slope * xi + intercept return result ``` 这种方法允许完全控制插值过程中的细节,并且能够显著提升执行速度[^1]. #### 方法二:采用其他库提供的高效插值工具 另一个可行的选择是寻找专门针对数值运算优化过的第三方库,比如 CuPy 或者 PyTorch,在 GPU 上运行可以获得更好的性能表现;或者是 Intel 的 oneAPI Data Analytics Library(DAL),它提供了高度优化的数据处理能力以及机器学习算法的支持,其中也包含了多种类型的插值器[^2]. 对于 CPU 计算环境而言,如果不想自己动手写插值逻辑,则可以选择 Cython 来封装 C/C++ 中高效的插值实现方式,从而绕过 Numba 不兼容的问题[^3].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值