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语言实现了基于协同过滤算法的商品推荐系统。通过分析用户行为数据,为用户推荐相似用户喜欢的商品。在实际应用中,可以根据需求调整算法参数和优化系统性能。
Comments NOTHING