095. 编写代码实现简单的推荐系统

在C语言中实现一个简单的推荐系统可以通过基于用户或基于物品的协同过滤算法来完成。这里我将展示一个简单的基于用户的协同过滤推荐系统。这种推荐系统通过分析用户之间的相似性来为用户推荐他们可能喜欢的物品。

基于用户的协同过滤推荐系统

算法步骤

  1. 计算用户相似度:使用相似度度量(如皮尔逊相关系数或余弦相似度)计算用户之间的相似度。
  2. 找到相似用户:为每个用户找到最相似的其他用户。
  3. 生成推荐:根据相似用户的评分,为当前用户生成推荐。

示例代码:简单的基于用户的协同过滤推荐系统

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define NUM_USERS 5
#define NUM_ITEMS 4

// 用户评分矩阵
float ratings[NUM_USERS][NUM_ITEMS] = {
    {5, 3, 0, 1},
    {4, 0, 0, 1},
    {1, 1, 0, 5},
    {1, 0, 0, 4},
    {0, 1, 5, 4},
};

// 计算两个用户之间的皮尔逊相关系数
float pearsonCorrelation(int user1, int user2) {
    float sum1 = 0.0, sum2 = 0.0, sum1Sq = 0.0, sum2Sq = 0.0, pSum = 0.0;
    int n = 0;

    for (int i = 0; i < NUM_ITEMS; i++) {
        if (ratings[user1][i] > 0 && ratings[user2][i] > 0) {
            sum1 += ratings[user1][i];
            sum2 += ratings[user2][i];
            sum1Sq += ratings[user1][i] * ratings[user1][i];
            sum2Sq += ratings[user2][i] * ratings[user2][i];
            pSum += ratings[user1][i] * ratings[user2][i];
            n++;
        }
    }

    if (n == 0) return 0.0;

    float num = pSum - (sum1 * sum2 / n);
    float den = sqrt((sum1Sq - sum1 * sum1 / n) * (sum2Sq - sum2 * sum2 / n));
    if (den == 0) return 0.0;

    return num / den;
}

// 找到最相似的用户
int findMostSimilarUser(int user) {
    float maxSim = -1.0;
    int mostSimilarUser = -1;

    for (int i = 0; i < NUM_USERS; i++) {
        if (i != user) {
            float sim = pearsonCorrelation(user, i);
            if (sim > maxSim) {
                maxSim = sim;
                mostSimilarUser = i;
            }
        }
    }

    return mostSimilarUser;
}

// 为用户生成推荐
void generateRecommendations(int user) {
    int mostSimilarUser = findMostSimilarUser(user);
    printf("Recommendations for user %d (based on user %d):\n", user, mostSimilarUser);

    for (int i = 0; i < NUM_ITEMS; i++) {
        if (ratings[user][i] == 0 && ratings[mostSimilarUser][i] > 0) {
            printf("Item %d with rating %.1f\n", i, ratings[mostSimilarUser][i]);
        }
    }
}

int main() {
    for (int i = 0; i < NUM_USERS; i++) {
        generateRecommendations(i);
    }

    return 0;
}

代码说明

  1. 用户评分矩阵:定义了一个二维数组 ratings,表示用户对物品的评分。0表示用户未评分。
  2. 计算皮尔逊相关系数:使用 pearsonCorrelation 函数计算两个用户之间的皮尔逊相关系数。
  3. 找到最相似的用户:使用 findMostSimilarUser 函数为每个用户找到最相似的其他用户。
  4. 生成推荐:使用 generateRecommendations 函数为每个用户生成推荐。
  5. 主函数:为每个用户生成推荐,并打印结果。

示例运行

Recommendations for user 0 (based on user 1):
Item 1 with rating 4.0
Recommendations for user 1 (based on user 0):
Item 1 with rating 3.0
Recommendations for user 2 (based on user 4):
Item 0 with rating 1.0
Recommendations for user 3 (based on user 4):
Item 0 with rating 1.0
Recommendations for user 4 (based on user 2):
Item 1 with rating 1.0

扩展功能

  1. 改进相似度度量:使用其他相似度度量方法,如余弦相似度或欧几里得距离。
  2. 处理稀疏数据:对于稀疏的评分矩阵,可以使用更复杂的相似度计算方法。
  3. 生成更复杂的推荐:考虑多个相似用户的评分,而不是仅依赖一个最相似的用户。
  4. 优化性能:使用更高效的数据结构(如稀疏矩阵)来存储评分数据。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)