引言:电商推荐系统的革命性变革
在当今数字化商业环境中,电商推荐系统已经成为提升用户转化率和解决”选择困难症”的核心技术。传统的电商网站往往让用户面临”信息过载”的困境——面对成千上万的商品,用户难以做出决策,导致转化率低下。而现代算法驱动的推荐系统通过智能分析用户行为、偏好和上下文信息,能够精准预测用户需求,将最合适的商品推送到用户面前。
推荐系统的技术演进经历了从简单的协同过滤到深度学习模型的跨越式发展。早期的推荐系统主要依赖于基于规则的方法和简单的统计模型,而现代系统则融合了机器学习、深度学习、图神经网络等多种先进技术。这种技术变革不仅提升了推荐的准确性,更重要的是,它从根本上改变了用户与电商平台的交互方式。
推荐系统的核心算法架构
1. 协同过滤算法:挖掘用户行为模式
协同过滤(Collaborative Filtering)是推荐系统的基石算法,它通过分析用户之间的相似性或商品之间的相似性来进行推荐。协同过滤分为两种主要类型:基于用户的协同过滤和基于商品的协同过滤。
基于用户的协同过滤的核心思想是:喜欢相似商品的用户可能有相似的偏好。算法通过计算用户之间的相似度,为目标用户推荐相似用户喜欢的商品。相似度计算通常使用余弦相似度或皮尔逊相关系数。
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
class UserBasedCF:
def __init__(self):
self.user_similarity_matrix = None
def calculate_user_similarity(self, user_item_matrix):
“””
计算用户之间的相似度矩阵
user_item_matrix: 用户-商品评分矩阵
“””
# 使用余弦相似度计算用户相似度
self.user_similarity_matrix = cosine_similarity(user_item_matrix)
return self.user_similarity_matrix
def recommend_for_user(self, user_id, user_item_matrix, top_k=10):
“””
为指定用户生成推荐
user_id: 目标用户ID
user_item_matrix: 用户-商品评分矩阵
top_k: 推荐商品数量
“””
# 获取目标用户的相似用户
similar_users = np.argsort(self.user_similarity_matrix[user_id])[::-1][1:]
# 获取目标用户未评分的商品
target_user_ratings = user_item_matrix[user_id]
unrated_items = np.where(target_user_ratings == 0)[0]
# 为未评分商品计算预测评分
predicted_scores = {}
for item in unrated_items:
score = 0
similarity_sum = 0
for similar_user in similar_users[:50]: # 取前50个相似用户
if user_item_matrix[similar_user][item] > 0:
similarity = self.user_similarity_matrix[user_id][similar_user]
score += similarity * user_item_matrix[similar_user][item]
similarity_sum += similarity
if similarity_sum > 0:
predicted_scores[item] = score / similarity_sum
# 返回预测评分最高的top_k个商品
recommended_items = sorted(predicted_scores.items(),
key=lambda x: x[1],
reverse=True)[:top_k]
return recommended_items
# 示例数据:用户-商品评分矩阵(0表示未评分)
user_item_matrix = np.array([
[5, 3, 0, 1, 0], # 用户0
[4, 0, 0, 1, 0], # 用户1
[1, 1, 0, 5, 0], # 用户2
[0, 0, 4, 0, 5], # 用户3
[0, 0, 0, 0, 0], # 用户4(新用户)
])
cf = UserBasedCF()
cf.calculate_user_similarity(user_item_matrix)
recommendations = cf.recommend_for_user(4, user_item_matrix, top_k=3)
print(“基于用户的协同过滤推荐结果:”, recommendations)
基于商品的协同过滤则关注商品之间的相似性,它认为用户可能喜欢与他们之前喜欢的商品相似的商品。这种方法在商品数量相对稳定、用户行为稀疏的场景下表现更好。
2. 基于内容的推荐:理解商品特征
基于内容的推荐(Content-Based Recommendation)通过分析商品的特征属性和用户的历史偏好,为用户推荐与其过去喜欢的商品特征相似的商品。这种方法不依赖于其他用户的行为数据,因此对于新商品或小众商品有很好的覆盖。
内容推荐的核心在于特征提取和相似度计算。对于电商商品,特征可以包括类别、品牌、价格区间、描述文本、图像特征等。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
import pandas as pd
class ContentBasedRecommender:
def __init__(self):
self.tfidf = TfidfVectorizer(stop_words=’english’)
self.cosine_sim = None
self.indices = None
def fit(self, products_df):
“””
训练基于内容的推荐模型
products_df: 包含商品ID和描述信息的DataFrame
“””
# 创建商品描述的TF-IDF矩阵
tfidf_matrix = self.tfidf.fit_transform(products_df[‘description’])
# 计算商品之间的余弦相似度
self.cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
# 创建商品ID到索引的映射
self.indices = pd.Series(products_df.index,
index=products_df[‘product_id’]).to_dict()
def recommend_for_product(self, product_id, top_k=10):
“””
为指定商品推荐相似商品
product_id: 目标商品ID
“””
if product_id not in self.indices:
return []
idx = self.indices[product_id]
sim_scores = list(enumerate(self.cosine_sim[idx]))
# 按相似度排序
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
# 获取top_k个最相似的商品(排除自己)
sim_scores = sim_scores[1:top_k+1]
product_indices = [i[0] for i in sim_scores]
return product_indices
def recommend_for_user(self, user_history, products_df, top_k=10):
“””
根据用户历史浏览/购买记录推荐商品
user_history: 用户历史商品ID列表
“””
if not user_history:
return []
# 获取用户历史商品的相似商品
all_recommendations = []
for product_id in user_history:
recommendations = self.recommend_for_product(product_id, top_k*2)
all_recommendations.extend(recommendations)
# 去重并排序
from collections import Counter
recommendation_counts = Counter(all_recommendations)
# 选择出现次数最多的商品
top_recommendations = recommendation_counts.most_common(top_k)
return [item[0] for item in top_recommendations]
# 示例数据
products_data = {
‘product_id’: [‘P001’, ‘P002’, ‘P003’, ‘P004’, ‘P005’],
‘description’: [
‘wireless bluetooth headphones with noise cancellation’,
‘wireless earbuds with charging case’,
‘gaming headset with microphone and RGB lights’,
‘smartphone with 5G connectivity and large display’,
‘laptop with high performance processor and SSD’
]
}
products_df = pd.DataFrame(products_data)
content_rec = ContentBasedRecommender()
content_rec.fit(products_df)
# 推荐相似商品
similar_products = content_rec.recommend_for_product(‘P001’, top_k=3)
print(“相似商品推荐:”, similar_products)
# 基于用户历史推荐
user_history = [‘P001’, ‘P003’]
user_recommendations = content_rec.recommend_for_user(user_history, products_df, top_k=2)
print(“基于用户历史的推荐:”, user_recommendations)
3. 混合推荐系统:融合多种算法优势
混合推荐系统(Hybrid Recommendation System)通过结合多种推荐算法的优势,克服单一算法的局限性。常见的混合策略包括加权混合、切换混合、特征组合和级联混合等。
class HybridRecommender:
def __init__(self, cf_weight=0.5, content_weight=0.5):
self.cf_weight = cf_weight
self.content_weight = content_weight
self.cf_recommender = UserBasedCF()
self.content_recommender = ContentBasedRecommender()
def fit(self, user_item_matrix, products_df):
“””训练混合推荐模型”””
self.cf_recommender.calculate_user_similarity(user_item_matrix)
self.content_recommender.fit(products_df)
def recommend(self, user_id, user_history, user_item_matrix,
products_df, top_k=10):
“””
生成混合推荐结果
“””
# 获取协同过滤推荐
cf_recommendations = self.cf_recommender.recommend_for_user(
user_id, user_item_matrix, top_k*2
)
# 获取基于内容的推荐
content_recommendations = self.content_recommender.recommend_for_user(
user_history, products_df, top_k*2
)
# 分数归一化和加权融合
cf_scores = {item[0]: item[1] for item in cf_recommendations}
content_scores = {item: 1.0 for item in content_recommendations}
# 合并并计算最终得分
all_items = set(cf_scores.keys()) | set(content_scores.keys())
final_scores = {}
for item in all_items:
cf_score = cf_scores.get(item, 0)
content_score = content_scores.get(item, 0)
# 归一化
if cf_score > 0:
cf_score = cf_score / max(cf_scores.values())
if content_score > 0:
content_score = content_score / max(content_scores.values())
final_scores[item] = (self.cf_weight * cf_score +
self.content_weight * content_score)
# 返回top_k个推荐
sorted_items = sorted(final_scores.items(),
key=lambda x: x[1],
reverse=True)[:top_k]
return sorted_items
# 使用示例
hybrid_rec = HybridRecommender(cf_weight=0.6, content_weight=0.4)
hybrid_rec.fit(user_item_matrix, products_df)
# 混合推荐
user_history = [‘P001’, ‘P003′]
hybrid_recommendations = hybrid_rec.recommend(
user_id=4, user_history=user_history,
user_item_matrix=user_item_matrix,
products_df=products_df, top_k=3
)
print(“混合推荐结果:”, hybrid_recommendations)
深度学习在推荐系统中的应用
1. 神经协同过滤(NCF)
神经协同过滤(Neural Collaborative Filtering)利用神经网络来学习用户和商品之间的复杂非线性关系,相比传统矩阵分解方法具有更强的表达能力。
import tensorflow as tf
from tensorflow.keras import layers, Model
class NCF(Model):
def __init__(self, num_users, num_items, embedding_dim=50):
super(NCF, self).__init__()
self.num_users = num_users
self.num_items = num_items
self.embedding_dim = embedding_dim
# 用户和商品的嵌入层
self.user_embedding = layers.Embedding(
num_users, embedding_dim, name=’user_embedding’
)
self.item_embedding = layers.Embedding(
num_items, embedding_dim, name=’item_embedding’
)
# MLP层
self.mlp_layers = [
layers.Dense(128, activation=’relu’),
layers.Dropout(0.2),
layers.Dense(64, activation=’relu’),
layers.Dropout(0.2),
layers.Dense(32, activation=’relu’)
]
# 输出层
self.output_layer = layers.Dense(1, activation=’sigmoid’)
def call(self, inputs):
user_input, item_input = inputs[:, 0], inputs[:, 1]
# 获取嵌入向量
user_embed = self.user_embedding(user_input)
item_embed = self.item_embedding(item_input)
# GMF部分(广义矩阵分解)
gmf = layers.multiply([user_embed, item_embed])
# MLP部分
mlp_input = layers.concatenate([user_embed, item_embed])
x = mlp_input
for layer in self.mlp_layers:
x = layer(x)
# 合并GMF和MLP
combined = layers.concatenate([gmf, x])
# 预测
output = self.output_layer(combined)
return output
def prepare_training_data(user_item_matrix):
“””准备训练数据:将用户-商品矩阵转换为(用户,商品,评分)格式”””
training_data = []
for user_id in range(user_item_matrix.shape[0]):
for item_id in range(user_item_matrix.shape[1]):
rating = user_item_matrix[user_id][item_id]
if rating > 0:
training_data.append([user_id, item_id, rating])
return np.array(training_data)
# 训练数据准备
training_data = prepare_training_data(user_item_matrix)
X_train = training_data[:, :2] # 用户ID和商品ID
y_train = training_data[:, 2] / 5.0 # 归一化评分到[0,1]
# 创建并训练模型
ncf_model = NCF(num_users=5, num_items=5, embedding_dim=8)
ncf_model.compile(optimizer=’adam’, loss=’binary_crossentropy’, metrics=[‘accuracy’])
# 模拟训练(实际使用时需要更多数据)
# ncf_model.fit(X_train, y_train, epochs=10, batch_size=2, verbose=0)
# 预测函数
def ncf_recommend(model, user_id, num_items, top_k=10):
“””为指定用户生成NCF推荐”””
user_array = np.full(num_items, user_id)
item_array = np.arange(num_items)
input_data = np.column_stack([user_array, item_array])
predictions = model.predict(input_data, verbose=0).flatten()
recommended_items = np.argsort(predictions)[::-1][:top_k]
return list(recommended_items)
# 使用示例
# recommendations = ncf_recommend(ncf_model, user_id=4, num_items=5, top_k=3)
# print(“NCF推荐结果:”, recommendations)
2. Wide & Deep模型:记忆与泛化的平衡
Wide & Deep模型结合了线性模型的记忆能力(wide部分)和深度神经网络的泛化能力(deep部分),在推荐系统中表现出色。
class WideDeepModel(Model):
def __init__(self, num_users, num_items, embedding_dim=32):
super(WideDeepModel, self).__init__()
# Wide部分:线性模型,用于记忆
self.wide_user_embedding = layers.Embedding(num_users, 1)
self.wide_item_embedding = layers.Embedding(num_items, 1)
# Deep部分:深度神经网络,用于泛化
self.deep_user_embedding = layers.Embedding(num_users, embedding_dim)
self.deep_item_embedding = layers.Embedding(num_items, embedding_dim)
self.deep_layers = [
layers.Dense(128, activation=’relu’),
layers.BatchNormalization(),
layers.Dense(64, activation=’relu’),
layers.BatchNormalization(),
layers.Dense(32, activation=’relu’)
]
# 输出层
self.output_layer = layers.Dense(1, activation=’sigmoid’)
def call(self, inputs):
user_input, item_input = inputs[:, 0], inputs[:, 1]
# Wide部分计算
wide_user = self.wide_user_embedding(user_input)
wide_item = self.wide_item_embedding(item_input)
wide_output = layers.add([wide_user, wide_item])
wide_output = layers.Flatten()(wide_output)
# Deep部分计算
deep_user = self.deep_user_embedding(user_input)
deep_item = self.deep_item_embedding(item_input)
deep_concat = layers.concatenate([deep_user, deep_item])
x = deep_concat
for layer in self.deep_layers:
x = layer(x)
# 合并Wide和Deep
combined = layers.concatenate([wide_output, x])
# 预测
output = self.output_layer(combined)
return output
# 使用示例
# wide_deep_model = WideDeepModel(num_users=5, num_items=5, embedding_dim=16)
# wide_deep_model.compile(optimizer=’adam’, loss=’binary_crossentropy’)
3. 图神经网络推荐:捕捉高阶关系
图神经网络(GNN)通过将用户和商品建模为图结构中的节点,能够捕捉用户-商品交互中的高阶关系和结构信息。
import torch
import torch.nn as nn
import torch.nn.functional as F
class GraphSAGE(nn.Module):
“””GraphSAGE图神经网络用于推荐”””
def __init__(self, input_dim, hidden_dim, output_dim, num_layers=2):
super(GraphSAGE, self).__init__()
self.num_layers = num_layers
# 图卷积层
self.layers = nn.ModuleList()
self.layers.append(nn.Linear(input_dim, hidden_dim))
for _ in range(num_layers – 1):
self.layers.append(nn.Linear(hidden_dim, hidden_dim))
self.output_projection = nn.Linear(hidden_dim, output_dim)
def forward(self, x, adj_matrix):
“””
x: 节点特征矩阵
adj_matrix: 邻接矩阵
“””
for i, layer in enumerate(self.layers):
# 邻居聚合
neighbor_features = torch.matmul(adj_matrix, x)
# 拼接自身特征和邻居特征
combined = torch.cat([x, neighbor_features], dim=1)
# 线性变换和激活
x = layer(combined)
x = F.relu(x)
x = F.dropout(x, p=0.2, training=self.training)
# 输出投影
x = self.output_projection(x)
return x
class GNNRecommender:
“””基于GNN的推荐系统”””
def __init__(self, embedding_dim=64, hidden_dim=128):
self.embedding_dim = embedding_dim
self.hidden_dim = hidden_dim
self.model = None
def build_graph(self, user_item_matrix):
“””构建用户-商品二部图”””
num_users, num_items = user_item_matrix.shape
# 创建邻接矩阵(用户-商品交互)
adj_matrix = np.zeros((num_users + num_items, num_users + num_items))
# 用户到商品的边
for user_id in range(num_users):
for item_id in range(num_items):
if user_item_matrix[user_id][item_id] > 0:
adj_matrix[user_id, num_users + item_id] = 1
adj_matrix[num_users + item_id, user_id] = 1
return torch.FloatTensor(adj_matrix)
def train(self, user_item_matrix, epochs=100):
“””训练GNN模型”””
num_users, num_items = user_item_matrix.shape
total_nodes = num_users + num_items
# 构建图
adj_matrix = self.build_graph(user_item_matrix)
# 节点特征(这里使用单位矩阵作为初始特征)
node_features = torch.eye(total_nodes)
# 初始化模型
self.model = GraphSAGE(
input_dim=total_nodes,
hidden_dim=self.hidden_dim,
output_dim=self.embedding_dim,
num_layers=2
)
# 训练循环(简化版)
optimizer = torch.optim.Adam(self.model.parameters(), lr=0.01)
for epoch in range(epochs):
self.model.train()
optimizer.zero_grad()
# 前向传播
embeddings = self.model(node_features, adj_matrix)
# 计算损失(这里使用简单的重构损失)
user_embeds = embeddings[:num_users]
item_embeds = embeddings[num_users:]
# 重构用户-商品交互
reconstructed = torch.matmul(user_embeds, item_embeds.t())
target = torch.FloatTensor(user_item_matrix)
loss = F.mse_loss(reconstructed, target)
loss.backward()
optimizer.step()
if epoch % 20 == 0:
print(f”Epoch {epoch}, Loss: {loss.item():.4f}”)
return embeddings
def recommend(self, user_id, top_k=10):
“””为用户生成推荐”””
if self.model is None:
raise ValueError(“Model not trained yet”)
self.model.eval()
with torch.no_grad():
# 获取所有节点嵌入
num_users = 5 # 根据实际数据调整
user_embeds = self.model.embeddings[:num_users]
item_embeds = self.model.embeddings[num_users:]
# 计算用户与所有商品的相似度
user_vector = user_embeds[user_id]
scores = torch.matmul(user_vector, item_embeds.t())
# 获取top_k个商品
top_items = torch.topk(scores, k=top_k).indices.tolist()
return top_items
# 使用示例
# gnn_rec = GNNRecommender(embedding_dim=32, hidden_dim=64)
# embeddings = gnn_rec.train(user_item_matrix, epochs=50)
# recommendations = gnn_rec.recommend(user_id=4, top_k=3)
# print(“GNN推荐结果:”, recommendations)
算法如何解决用户选择困难症
1. 个性化排序与过滤:减少决策负担
选择困难症的核心问题是信息过载。推荐系统通过个性化排序和过滤,将用户可能感兴趣的商品排在前面,大幅减少用户需要浏览的商品数量。
class PersonalizedFilter:
def __init__(self):
self.user_preferences = {}
def analyze_user_behavior(self, user_id, browsing_history, purchase_history):
“””
分析用户行为,构建用户画像
“””
# 提取用户偏好特征
preferences = {
‘price_range’: self._analyze_price_preference(purchase_history),
‘brand_preference’: self._analyze_brand_preference(browsing_history),
‘category_preference’: self._analyze_category_preference(browsing_history),
‘style_preference’: self._analyze_style_preference(browsing_history)
}
self.user_preferences[user_id] = preferences
return preferences
def _analyze_price_preference(self, purchase_history):
“””分析用户价格偏好”””
if not purchase_history:
return None
prices = [item[‘price’] for item in purchase_history]
return {
‘min’: min(prices),
‘max’: max(prices),
‘avg’: sum(prices) / len(prices)
}
def _analyze_brand_preference(self, browsing_history):
“””分析用户品牌偏好”””
brand_count = {}
for item in browsing_history:
brand = item.get(‘brand’)
if brand:
brand_count[brand] = brand_count.get(brand, 0) + 1
# 返回偏好度最高的品牌
if brand_count:
return max(brand_count.items(), key=lambda x: x[1])[0]
return None
def _analyze_category_preference(self, browsing_history):
“””分析用户类别偏好”””
category_count = {}
for item in browsing_history:
category = item.get(‘category’)
if category:
category_count[category] = category_count.get(category, 0) + 1
if category_count:
return sorted(category_count.items(),
key=lambda x: x[1],
reverse=True)[:3]
return []
def _analyze_style_preference(self, browsing_history):
“””分析用户风格偏好”””
style_keywords = [‘minimalist’, ‘luxury’, ‘sporty’, ‘casual’, ‘formal’]
style_count = {style: 0 for style in style_keywords}
for item in browsing_history:
description = item.get(‘description’, ”).lower()
for style in style_keywords:
if style in description:
style_count[style] += 1
preferred_styles = [style for style, count in style_count.items()
if count > 0]
return preferred_styles
def filter_products(self, products, user_id, limit=20):
“””
根据用户画像过滤商品
“””
if user_id not in self.user_preferences:
return products[:limit]
preferences = self.user_preferences[user_id]
filtered_products = []
for product in products:
score = 0
# 价格匹配
if preferences[‘price_range’]:
price = product[‘price’]
avg_price = preferences[‘price_range’][‘avg’]
if abs(price – avg_price) / avg_price < 0.3: # 价格差异在30%以内
score += 2
# 品牌匹配
if preferences['brand_preference'] and \
product.get('brand') == preferences['brand_preference']:
score += 3
# 类别匹配
if preferences['category_preference']:
for category, _ in preferences['category_preference']:
if category in product.get('category', ''):
score += 1
# 风格匹配
if preferences['style_preference']:
for style in preferences['style_preference']:
if style in product.get('description', '').lower():
score += 1
if score > 0:
filtered_products.append((product, score))
# 按得分排序
filtered_products.sort(key=lambda x: x[1], reverse=True)
# 返回前limit个商品
return [product for product, score in filtered_products[:limit]]
# 使用示例
personalized_filter = PersonalizedFilter()
# 模拟用户行为数据
browsing_history = [
{‘brand’: ‘Apple’, ‘category’: ‘Electronics/Smartphones’, ‘description’: ‘premium smartphone with great camera’},
{‘brand’: ‘Samsung’, ‘category’: ‘Electronics/Smartphones’, ‘description’: ‘flagship phone with AMOLED display’},
{‘brand’: ‘Apple’, ‘category’: ‘Electronics/Laptops’, ‘description’: ‘professional laptop for work’}
]
purchase_history = [
{‘price’: 999, ‘brand’: ‘Apple’, ‘category’: ‘Smartphones’},
{‘price’: 1299, ‘brand’: ‘Apple’, ‘category’: ‘Laptops’}
]
# 分析用户偏好
preferences = personalized_filter.analyze_user_behavior(
user_id=1,
browsing_history=browsing_history,
purchase_history=purchase_history
)
print(“用户画像:”, preferences)
# 模拟商品库
products = [
{‘id’: ‘P001’, ‘name’: ‘iPhone 15’, ‘price’: 999, ‘brand’: ‘Apple’,
‘category’: ‘Electronics/Smartphones’, ‘description’: ‘premium smartphone’},
{‘id’: ‘P002’, ‘name’: ‘Samsung Galaxy S24’, ‘price’: 899, ‘brand’: ‘Samsung’,
‘category’: ‘Electronics/Smartphones’, ‘description’: ‘flagship phone’},
{‘id’: ‘P003’, ‘name’: ‘MacBook Pro’, ‘price’: 1999, ‘brand’: ‘Apple’,
‘category’: ‘Electronics/Laptops’, ‘description’: ‘professional laptop’},
{‘id’: ‘P004’, ‘name’: ‘Budget Phone’, ‘price’: 299, ‘brand’: ‘Generic’,
‘category’: ‘Electronics/Smartphones’, ‘description’: ‘basic phone’},
{‘id’: ‘P005’, ‘name’: ‘Gaming Laptop’, ‘price’: 1599, ‘brand’: ‘Gaming’,
‘category’: ‘Electronics/Laptops’, ‘description’: ‘gaming laptop’}
]
# 过滤并排序商品
filtered_products = personalized_filter.filter_products(
products, user_id=1, limit=3
)
print(“个性化过滤结果:”, filtered_products)
2. 多样性与惊喜度:避免推荐同质化
为了避免推荐结果过于同质化导致用户疲劳,推荐系统需要平衡准确性和多样性。通过引入多样性算法,可以在保持相关性的同时提供新鲜感。
class DiversityRecommender:
def __init__(self, diversity_weight=0.3):
self.diversity_weight = diversity_weight
def calculate_diversity(self, candidate_items, selected_items, feature_extractor):
“””
计算候选商品与已选商品的多样性
“””
if not selected_items:
return 1.0 # 如果还没有选择,多样性为最大值
diversity_scores = []
for candidate in candidate_items:
max_similarity = 0
for selected in selected_items:
# 计算特征相似度
similarity = self._feature_similarity(
feature_extractor(candidate),
feature_extractor(selected)
)
max_similarity = max(max_similarity, similarity)
# 多样性 = 1 – 最大相似度
diversity = 1 – max_similarity
diversity_scores.append(diversity)
return diversity_scores
def _feature_similarity(self, features1, features2):
“””计算两个商品特征的相似度”””
if not features1 or not features2:
return 0
# 计算余弦相似度
intersection = len(set(features1) & set(features2))
union = len(set(features1) | set(features2))
if union == 0:
return 0
return intersection / union
def recommend_with_diversity(self, base_recommendations, candidate_pool,
feature_extractor, top_k=10):
“””
在保证相关性的前提下增加多样性
“””
selected = []
remaining_candidates = list(base_recommendations)
while len(selected) < top_k and remaining_candidates:
# 计算每个候选商品的综合得分
scores = []
for candidate in remaining_candidates:
# 基础相关性得分(假设已经归一化到[0,1])
relevance_score = 0.8 # 这里简化处理,实际应从模型获取
# 计算多样性得分
diversity_scores = self.calculate_diversity(
[candidate], selected, feature_extractor
)
diversity_score = diversity_scores[0] if diversity_scores else 1.0
# 综合得分
final_score = (1 - self.diversity_weight) * relevance_score + \
self.diversity_weight * diversity_score
scores.append((candidate, final_score))
# 选择得分最高的商品
scores.sort(key=lambda x: x[1], reverse=True)
best_item = scores[0][0]
selected.append(best_item)
remaining_candidates.remove(best_item)
return selected
# 使用示例
diversity_rec = DiversityRecommender(diversity_weight=0.3)
# 模拟基础推荐结果(按相关性排序)
base_recommendations = ['P001', 'P002', 'P003', 'P004', 'P005']
# 特征提取器
def feature_extractor(product_id):
features_map = {
'P001': ['Apple', 'Smartphone', 'Premium'],
'P002': ['Samsung', 'Smartphone', 'Premium'],
'P003': ['Apple', 'Laptop', 'Professional'],
'P004': ['Generic', 'Smartphone', 'Budget'],
'P005': ['Gaming', 'Laptop', 'HighPerformance']
}
return features_map.get(product_id, [])
# 生成多样性推荐
diverse_recommendations = diversity_rec.recommend_with_diversity(
base_recommendations,
base_recommendations,
feature_extractor,
top_k=3
)
print("多样性推荐结果:", diverse_recommendations)
3. 解释性推荐:增强用户信任
选择困难症往往伴随着决策焦虑。通过提供推荐理由,可以增强用户信任,降低决策难度。
class ExplainableRecommender:
def __init__(self):
self.explanation_templates = {
'similar_to_history': "Because you viewed {similar_item}",
'popular_in_category': "Popular in {category}",
'similar_users': "Users like you also bought {item}",
'price_match': "Matches your preferred price range",
'trending': "Trending now among shoppers"
}
def generate_explanation(self, user_id, item_id, context):
"""
生成推荐解释
"""
explanations = []
# 基于浏览历史的解释
if 'similar_item' in context:
explanations.append(
self.explanation_templates['similar_to_history'].format(
similar_item=context['similar_item']
)
)
# 基于类别的解释
if 'category' in context:
explanations.append(
self.explanation_templates['popular_in_category'].format(
category=context['category']
)
)
# 基于相似用户的解释
if 'similar_users' in context:
explanations.append(
self.explanation_templates['similar_users'].format(
item=context['similar_users']
)
)
# 基于价格的解释
if 'price_match' in context:
explanations.append(self.explanation_templates['price_match'])
# 基于趋势的解释
if 'trending' in context and context['trending']:
explanations.append(self.explanation_templates['trending'])
return explanations
def recommend_with_explanation(self, user_id, recommendations, context_data):
"""
带解释的推荐
"""
explained_recommendations = []
for item_id, score in recommendations:
# 构建上下文
context = {}
# 检查是否与用户历史相似
if 'user_history' in context_data:
for history_item in context_data['user_history']:
if self._calculate_item_similarity(item_id, history_item) > 0.7:
context[‘similar_item’] = history_item[‘name’]
break
# 检查类别流行度
if ‘category_popularity’ in context_data and \
item_id in context_data[‘category_popularity’]:
context[‘category’] = context_data[‘category_popularity’][item_id]
# 检查价格匹配
if ‘price_preference’ in context_data and \
‘item_price’ in context_data:
pref = context_data[‘price_preference’]
price = context_data[‘item_price’]
if abs(price – pref[‘avg’]) / pref[‘avg’] < 0.3:
context['price_match'] = True
# 检查趋势
if 'trending_items' in context_data and \
item_id in context_data['trending_items']:
context['trending'] = True
# 生成解释
explanations = self.generate_explanation(user_id, item_id, context)
explained_recommendations.append({
'item_id': item_id,
'score': score,
'explanations': explanations
})
return explained_recommendations
def _calculate_item_similarity(self, item1, item2):
"""计算两个商品的相似度(简化版)"""
# 实际应用中应使用更复杂的相似度计算
return 0.8 # 简化返回
# 使用示例
explainable_rec = ExplainableRecommender()
# 模拟推荐结果
recommendations = [('P001', 0.95), ('P002', 0.87), ('P003', 0.82)]
# 模拟上下文数据
context_data = {
'user_history': [
{'id': 'P004', 'name': 'iPhone 13', 'category': 'Smartphones'}
],
'category_popularity': {'P001': 'Smartphones', 'P002': 'Smartphones'},
'price_preference': {'avg': 900},
'item_price': 999,
'trending_items': ['P001']
}
# 生成带解释的推荐
explained_recs = explainable_rec.recommend_with_explanation(
user_id=1, recommendations=recommendations, context_data=context_data
)
print("带解释的推荐:")
for rec in explained_recs:
print(f"商品 {rec['item_id']} (得分: {rec['score']:.2f}):")
for exp in rec['explanations']:
print(f" - {exp}")
实际应用案例与效果分析
1. 亚马逊的推荐系统架构
亚马逊是推荐系统的先驱,其推荐系统每年产生数百亿美元的收入。亚马逊采用多层推荐架构:
第一层
:基于协同过滤的实时推荐,处理用户当前会话的行为
第二层
:基于内容的推荐,处理商品属性和用户画像
第三层
:基于深度学习的预测模型,预测用户长期偏好
亚马逊的推荐系统通过以下方式提升转化率:
个性化首页
:根据用户历史定制首页展示
“购买此商品的用户也购买了”
:经典的协同过滤应用
实时推荐
:在用户浏览过程中动态调整推荐
2. 淘宝的推荐系统创新
淘宝的推荐系统在处理海量商品和用户方面具有独特优势:
实时特征工程
:在线计算用户实时行为特征
多目标优化
:同时优化点击率、转化率、GMV等多个指标
图神经网络应用
:利用用户-商品-商家的异构图结构
淘宝通过推荐系统实现了:
猜你喜欢
:基于用户兴趣的个性化推荐
相关推荐
:商品详情页的关联推荐
购物车推荐
:基于购物车商品的搭配推荐
3. 抖音电商的推荐策略
抖音电商(TikTok Shop)将内容推荐与电商推荐深度融合:
内容理解
:通过视频内容理解用户兴趣
实时反馈
:基于用户在视频上的停留、点赞等行为实时调整推荐
兴趣电商
:通过内容激发用户潜在需求
推荐系统的评估与优化
1. 离线评估指标
from sklearn.metrics import precision_score, recall_score, ndcg_score
import numpy as np
class RecommendationEvaluator:
def __init__(self):
self.metrics = {}
def calculate_precision_at_k(self, recommended, relevant, k):
"""计算Precision@K"""
recommended_k = recommended[:k]
relevant_set = set(relevant)
recommended_set = set(recommended_k)
precision = len(recommended_set & relevant_set) / k
return precision
def calculate_recall_at_k(self, recommended, relevant, k):
"""计算Recall@K"""
recommended_k = recommended[:k]
relevant_set = set(relevant)
recommended_set = set(recommended_k)
if not relevant_set:
return 0.0
recall = len(recommended_set & relevant_set) / len(relevant_set)
return recall
def calculate_ndcg_at_k(self, recommended, relevant_scores, k):
"""计算NDCG@K"""
# 简化版NDCG计算
recommended_k = recommended[:k]
dcg = 0
idcg = 0
for i, item in enumerate(recommended_k):
if item in relevant_scores:
relevance = relevant_scores[item]
dcg += relevance / np.log2(i + 2)
# 理想排序的DCG
ideal_relevances = sorted(relevant_scores.values(), reverse=True)
for i, rel in enumerate(ideal_relevances[:k]):
idcg += rel / np.log2(i + 2)
return dcg / idcg if idcg > 0 else 0.0
def evaluate_all(self, recommended, relevant, k=10):
“””综合评估”””
# 创建相关性分数(1表示相关,0表示不相关)
relevant_scores = {item: 1 for item in relevant}
results = {
‘precision@k’: self.calculate_precision_at_k(recommended, relevant, k),
‘recall@k’: self.calculate_recall_at_k(recommended, relevant, k),
‘ndcg@k’: self.calculate_ndcg_at_k(recommended, relevant_scores, k)
}
return results
# 使用示例
evaluator = RecommendationEvaluator()
# 模拟推荐结果和真实相关商品
recommended = [‘P001’, ‘P002’, ‘P003’, ‘P004’, ‘P005’]
relevant = [‘P001’, ‘P003’, ‘P006’] # 真实用户喜欢的商品
# 评估
metrics = evaluator.evaluate_all(recommended, relevant, k=5)
print(“评估结果:”, metrics)
2. 在线A/B测试
在线A/B测试是验证推荐算法效果的金标准:
class ABTestFramework:
def __init__(self):
self.variants = {}
self.results = {}
def create_variant(self, name, algorithm, traffic_split=0.5):
“””创建测试变体”””
self.variants[name] = {
‘algorithm’: algorithm,
‘traffic_split’: traffic_split,
‘metrics’: {
‘ctr’: [],
‘conversion_rate’: [],
‘revenue_per_user’: [],
‘user_satisfaction’: []
}
}
def assign_user(self, user_id):
“””为用户分配测试变体”””
import random
rand = random.random()
cumulative = 0
for name, variant in self.variants.items():
cumulative += variant[‘traffic_split’]
if rand <= cumulative:
return name
return list(self.variants.keys())[0]
def record_metrics(self, variant_name, metrics):
"""记录指标"""
if variant_name in self.variants:
for key, value in metrics.items():
self.variants[variant_name]['metrics'][key].append(value)
def analyze_results(self):
"""分析测试结果"""
results = {}
for name, variant in self.variants.items():
metrics = variant['metrics']
results[name] = {
'avg_ctr': np.mean(metrics['ctr']) if metrics['ctr'] else 0,
'avg_conversion_rate': np.mean(metrics['conversion_rate']) if metrics['conversion_rate'] else 0,
'avg_revenue_per_user': np.mean(metrics['revenue_per_user']) if metrics['revenue_per_user'] else 0,
'avg_user_satisfaction': np.mean(metrics['user_satisfaction']) if metrics['user_satisfaction'] else 0
}
return results
def statistical_significance(self, variant_a, variant_b, metric='conversion_rate'):
"""计算统计显著性(简化版)"""
metrics_a = self.variants[variant_a]['metrics'][metric]
metrics_b = self.variants[variant_b]['metrics'][metric]
if len(metrics_a) < 30 or len(metrics_b) < 30:
return "样本量不足"
from scipy import stats
t_stat, p_value = stats.ttest_ind(metrics_a, metrics_b)
return {
't_statistic': t_stat,
'p_value': p_value,
'significant': p_value < 0.05,
'winner': variant_a if np.mean(metrics_a) > np.mean(metrics_b) else variant_b
}
# 使用示例
ab_test = ABTestFramework()
# 创建两个变体
ab_test.create_variant(‘baseline’, ‘collaborative_filtering’, 0.5)
ab_test.create_variant(‘new_algorithm’, ‘hybrid_neural’, 0.5)
# 模拟记录数据(实际应用中会实时记录)
for i in range(100):
ab_test.record_metrics(‘baseline’, {
‘ctr’: 0.12 + np.random.normal(0, 0.02),
‘conversion_rate’: 0.03 + np.random.normal(0, 0.01),
‘revenue_per_user’: 15 + np.random.normal(0, 5),
‘user_satisfaction’: 4.2 + np.random.normal(0, 0.3)
})
ab_test.record_metrics(‘new_algorithm’, {
‘ctr’: 0.15 + np.random.normal(0, 0.02),
‘conversion_rate’: 0.04 + np.random.normal(0, 0.01),
‘revenue_per_user’: 18 + np.random.normal(0, 5),
‘user_satisfaction’: 4.5 + np.random.normal(0, 0.3)
})
# 分析结果
results = ab_test.analyze_results()
print(“A/B测试结果:”, results)
# 统计显著性检验
sig_test = ab_test.statistical_significance(‘baseline’, ‘new_algorithm’, ‘conversion_rate’)
print(“统计显著性:”, sig_test)
3. 在线学习与实时优化
推荐系统需要持续学习用户反馈,实时调整推荐策略:
class OnlineLearningRecommender:
def __init__(self, learning_rate=0.01):
self.learning_rate = learning_rate
self.user_embeddings = {}
self.item_embeddings = {}
self.interaction_history = []
def update_from_feedback(self, user_id, item_id, reward, context):
“””
根据用户反馈实时更新模型
reward: 1表示点击/购买,0表示忽略
“””
# 获取或初始化嵌入
if user_id not in self.user_embeddings:
self.user_embeddings[user_id] = np.random.randn(32) * 0.1
if item_id not in self.item_embeddings:
self.item_embeddings[item_id] = np.random.randn(32) * 0.1
user_emb = self.user_embeddings[user_id]
item_emb = self.item_embeddings[item_id]
# 计算预测得分
predicted_score = np.dot(user_emb, item_emb)
# 计算损失
target_score = reward
loss = (target_score – predicted_score) ** 2
# 梯度下降更新
error = target_score – predicted_score
# 更新用户嵌入
self.user_embeddings[user_id] += self.learning_rate * error * item_emb
# 更新商品嵌入
self.item_embeddings[item_id] += self.learning_rate * error * user_emb
# 记录交互历史
self.interaction_history.append({
‘user_id’: user_id,
‘item_id’: item_id,
‘reward’: reward,
‘context’: context,
‘timestamp’: pd.Timestamp.now()
})
return loss
def get_recommendations(self, user_id, candidate_items, top_k=10):
“””实时推荐”””
if user_id not in self.user_embeddings:
# 新用户,返回热门商品
return self._get_popular_items(candidate_items, top_k)
user_emb = self.user_embeddings[user_id]
scores = []
for item_id in candidate_items:
if item_id not in self.item_embeddings:
self.item_embeddings[item_id] = np.random.randn(32) * 0.1
item_emb = self.item_embeddings[item_id]
score = np.dot(user_emb, item_emb)
scores.append((item_id, score))
# 排序并返回top_k
scores.sort(key=lambda x: x[1], reverse=True)
return scores[:top_k]
def _get_popular_items(self, candidate_items, top_k):
“””获取热门商品(用于冷启动)”””
# 简化:随机返回
import random
return [(item, 0.5) for item in random.sample(candidate_items, min(top_k, len(candidate_items)))]
# 使用示例
online_rec = OnlineLearningRecommender(learning_rate=0.05)
# 模拟用户交互
interactions = [
{‘user_id’: 1, ‘item_id’: ‘P001’, ‘reward’: 1, ‘context’: {‘time’: ‘morning’}},
{‘user_id’: 1, ‘item_id’: ‘P002’, ‘reward’: 0, ‘context’: {‘time’: ‘morning’}},
{‘user_id’: 1, ‘item_id’: ‘P003’, ‘reward’: 1, ‘context’: {‘time’: ‘evening’}},
]
# 在线学习
for interaction in interactions:
loss = online_rec.update_from_feedback(
interaction[‘user_id’],
interaction[‘item_id’],
interaction[‘reward’],
interaction[‘context’]
)
print(f”Loss: {loss:.4f}”)
# 实时推荐
candidate_items = [‘P001’, ‘P002’, ‘P003’, ‘P004’, ‘P005’]
recommendations = online_rec.get_recommendations(1, candidate_items, top_k=3)
print(“实时推荐:”, recommendations)
未来趋势与挑战
1. 多模态推荐系统
未来的推荐系统将融合文本、图像、视频、音频等多种模态的信息,提供更丰富的推荐体验。
2. 隐私保护与联邦学习
随着隐私法规的加强,推荐系统需要在保护用户隐私的前提下进行学习。联邦学习允许在用户设备上本地训练模型,只上传模型更新,不上传原始数据。
3. 可解释AI与因果推断
用户不仅想知道”推荐什么”,更想知道”为什么推荐”。因果推断技术可以帮助推荐系统理解推荐与结果之间的因果关系,而不仅仅是相关性。
4. 实时性与低延迟
用户期望即时的推荐反馈。未来的推荐系统需要在毫秒级时间内完成特征提取、模型推理和结果返回,这对系统架构和算法效率提出了更高要求。
结论
算法驱动的推荐系统通过精准的用户理解、智能的商品匹配和人性化的交互设计,从根本上解决了电商领域的用户选择困难症,显著提升了转化率。从传统的协同过滤到现代的深度学习、图神经网络,推荐算法不断演进,为用户提供了越来越个性化、多样化的购物体验。
成功的推荐系统不仅需要先进的算法,还需要对业务场景的深刻理解、对用户心理的准确把握,以及持续的实验和优化。通过A/B测试、在线学习等手段,推荐系统能够不断适应用户需求的变化,实现商业价值的最大化。
随着技术的进步,未来的推荐系统将更加智能、透明和人性化,成为连接用户与商品的智能桥梁,彻底改变电商的购物体验。