Ruby 语言 实现商品推荐系统 协同过滤算法 + 用户行为数据

Ruby阿木 发布于 11 小时前 1 次阅读


Ruby 商品推荐系统:协同过滤算法与用户行为数据应用

随着互联网的快速发展,电子商务行业日益繁荣,商品推荐系统成为提高用户满意度和商家收益的关键技术。协同过滤算法作为一种有效的推荐算法,在商品推荐系统中得到了广泛应用。本文将围绕Ruby语言,结合用户行为数据,实现一个简单的商品推荐系统。

系统设计

1. 系统架构

本商品推荐系统采用以下架构:

- 数据层:负责存储用户行为数据和商品信息。
- 业务层:负责处理推荐算法,生成推荐结果。
- 表示层:负责展示推荐结果。

2. 技术选型

- 数据库:使用SQLite作为数据存储。
- Ruby语言:使用Ruby语言编写业务逻辑。
- 算法:采用基于用户行为的协同过滤算法。

数据准备

1. 数据结构

- 用户表(users):存储用户信息,如用户ID、用户名等。
- 商品表(products):存储商品信息,如商品ID、商品名称、商品类别等。
- 用户行为表(user_actions):存储用户行为数据,如用户ID、商品ID、行为类型(浏览、购买等)。

2. 数据导入

使用Ruby的ActiveRecord库连接SQLite数据库,并导入用户行为数据。

ruby
require 'active_record'

ActiveRecord::Base.establish_connection(
adapter: 'sqlite3',
database: 'recommendation_system.db'
)

创建表
ActiveRecord::Schema.define do
create_table :users do |t|
t.string :name
t.integer :age
end

create_table :products do |t|
t.string :name
t.string :category
end

create_table :user_actions do |t|
t.integer :user_id
t.integer :product_id
t.string :action_type
end
end

导入数据
users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Charlie', age: 35 }
]

products = [
{ name: 'Product A', category: 'Category 1' },
{ name: 'Product B', category: 'Category 2' },
{ name: 'Product C', category: 'Category 3' }
]

user_actions = [
{ user_id: 1, product_id: 1, action_type: 'browse' },
{ user_id: 1, product_id: 2, action_type: 'purchase' },
{ user_id: 2, product_id: 2, action_type: 'browse' },
{ user_id: 3, product_id: 3, action_type: 'purchase' }
]

users.each { |user| User.create!(user) }
products.each { |product| Product.create!(product) }
user_actions.each { |action| UserAction.create!(action) }

协同过滤算法

1. 算法原理

协同过滤算法通过分析用户之间的相似度,为用户推荐相似用户喜欢的商品。主要分为两种类型:基于用户的协同过滤和基于物品的协同过滤。

2. 实现步骤

1. 计算用户之间的相似度。
2. 根据相似度为用户推荐商品。

2.1 计算相似度

使用余弦相似度计算用户之间的相似度。

ruby
def cosine_similarity(user1, user2)
dot_product = 0
norm1 = 0
norm2 = 0

user1_actions.each do |action|
product_id = action.product_id
rating1 = action.rating
rating2 = user2.user_actions.find_by(product_id: product_id)&.rating || 0

dot_product += rating1 rating2
norm1 += rating12
norm2 += rating22
end

return 0 if norm1 == 0 || norm2 == 0

Math.acos(dot_product / (Math.sqrt(norm1) Math.sqrt(norm2)))
end

2.2 推荐商品

根据用户之间的相似度,为用户推荐商品。

ruby
def recommend_products(user_id, num_recommendations)
similar_users = User.joins(:user_actions)
.where.not(user_id: user_id)
.select('users., COUNT(user_actions.user_id) AS common_actions')
.group(:user_id)
.having('COUNT(user_actions.user_id) > 1')
.order('common_actions DESC')

recommendations = []

similar_users.each do |user|
similarity = cosine_similarity(User.find(user_id), user)
next if similarity < 0.5

user.user_actions.each do |action|
next if recommendations.include?(action.product_id)

recommendation_score = action.rating similarity
recommendations << { product_id: action.product_id, score: recommendation_score }
end
end

recommendations.sort_by { |recommendation| -recommendation[:score] }
.first(num_recommendations)
end

系统测试

1. 测试数据

创建测试数据,包括用户、商品和用户行为。

ruby
创建测试数据
users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Charlie', age: 35 }
]

products = [
{ name: 'Product A', category: 'Category 1' },
{ name: 'Product B', category: 'Category 2' },
{ name: 'Product C', category: 'Category 3' }
]

user_actions = [
{ user_id: 1, product_id: 1, action_type: 'browse' },
{ user_id: 1, product_id: 2, action_type: 'purchase' },
{ user_id: 2, product_id: 2, action_type: 'browse' },
{ user_id: 3, product_id: 3, action_type: 'purchase' }
]

users.each { |user| User.create!(user) }
products.each { |product| Product.create!(product) }
user_actions.each { |action| UserAction.create!(action) }

2. 测试推荐结果

调用`recommend_products`函数,为用户推荐商品。

ruby
recommendations = recommend_products(1, 2)
puts "Recommended products for Alice:"
recommendations.each do |recommendation|
puts "Product ID: {recommendation[:product_id]}, Score: {recommendation[:score]}"
end

总结

本文使用Ruby语言实现了基于协同过滤算法的商品推荐系统。通过分析用户行为数据,为用户推荐相似用户喜欢的商品。在实际应用中,可以根据需求调整算法参数和优化系统性能。