京公网安备 11010802034615号
经营许可证编号:京B2-20210330
一、推荐系统的概念
推荐系统(Recommendation System, RS),简单来说就是根据用户的日常行为,自动预测用户的喜好,为用户提供更多完善的服务。举个简单的例子,在京东商城,我们浏览一本书之后,系统会为我们推荐购买了这本书的其他用户购买的其他的书:

推荐系统在很多方面都有很好的应用,尤其在现在的个性化方面发挥着重要的作用。
二、推荐系统的分类
推荐系统使用了一系列不同的技术,主要可以分为以下两类:
基于内容(content-based)的推荐。主要依据的是推荐项的性质。
基于协同过滤(collaborative filtering)的推荐。主要依据的是用户或者项之间的相似性。
在协同过滤方法中,我们很显然的会发现,基于协同过滤的推荐系统用可以分为两类:
基于项(item-based)的推荐系统。主要依据的是项与项之间的相似性。
基于用户(user-based)的推荐系统。主要依据的是用户与用户之间的相似性。
三、相似度的度量方法
相似性的度量的方法有很多种,不同的度量方法的应用范围也不一样。相似性度量方法的设计也是机器学习算法设计中很重要的一部分,尤其是对于聚类算法,推荐系统这类算法。
相似性的度量方法必须满足拓扑学中的度量空间的基本条件:
假设d是度量空间上M的度量
,其中度量d满足:
非负性:
,当且
仅当时取等号;
对称性:
;
三角不等性:
。
这里主要介绍三种相似性的度量方法:欧式距离、皮尔逊相关系数和余弦相似度。
1、欧式距离
欧式距离是使用较多的相似性的度量方法,在kMeans中就使用到欧式距离作为相似项的发现。
2、皮尔逊相关系数(Pearson Correlation)
在欧氏距离的计算中,不同特征之间的量级对欧氏距离的影响比较大,例如,
和
我们就不能很好的利用欧式距离判断和,和之间的相似性的大小。而皮尔逊相似性的度量对量级不敏感:

其中
表示向量x和向量y内积,
表示向量x的二范数。
3、余弦相似度(Cosine Similarity)
余弦相似度有着与皮尔逊相似度同样的性质,对量级不敏感,是计算两个向量的夹角。在吴军老师的《数学之美》上,在计算文本相似性的过程中,大量使用了余弦相似性的度量方法。

四、基于相似度的推荐系统
协同过滤是通过将用户和其他用户的数据进行对比来实现推荐的。我们通过一个评分系统对基于协同过滤的推荐系统作阐述。

(不同用户对不同商品的评分)
如图,横轴为每个用户对不同商品的评分,评分的范围为1~5,0表示该用户未对该商品评分。我们以用户Tracy为例,Tracy未对日式炸鸡排和寿司饭评分,我们利用协同过滤推荐系统预测Tracy对该两个商品评分,并依据分数的高低向Tracy推荐商品。
1、计算相似度
在本例中,我们是依据物品的相似度,即计算日式炸鸡排与鳗鱼饭、烤牛肉和手撕猪肉的相似度实现对日式炸鸡排的评分,用同样的方法对寿司饭评分。数据分析师培训
2、排序
排序的目的是实现在日式炸鸡排与寿司饭这两个商品中推荐给用户Tracy。
3、实验结果

(相似度的计算——基于余弦相似度)

(推荐结果)
从推荐结果,我们发现寿司饭的评分更高,首推寿司饭,日式炸鸡排排在寿司饭后面。
4、MATLAB代码
主程序
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
%% 主函数
% 导入数据
data = [4,4,0,2,2;4,0,0,3,3;4,0,0,1,1;1,1,1,2,0;2,2,2,0,0;1,1,1,0,0;5,5,5,0,0];
% reccomendation
[sortScore, sortIndex] = recommend(data, 3, 'cosSim');
len = size(sortScore);
finalRec = [sortIndex, sortScore];
disp(finalRec);
计算相似度的函数
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
function [ score ] = evaluate( data, user, simMeas, item )
[m,n] = size(data);
simTotal = 0;
ratSimTotal = 0;
% 寻找用户都评价的商品
% data(user, item)为未评价的商品
for j = 1:n
userRating = data(user, j);%此用户评价的商品
ratedItem = zeros(m,1);
numOfNon = 0;%统计已评价商品的数目
if userRating == 0%只是找到已评分的商品
continue;
end
for i = 1:m
if data(i,item) ~= 0 && data(i,j) ~= 0
ratedItem(i,1) = 1;
numOfNon = numOfNon + 1;
end
end
% 判断有没有都评分的项
if numOfNon == 0
similarity = 0;
else
% 构造向量,便于计算相似性
vectorA = zeros(1,numOfNon);
vectorB = zeros(1,numOfNon);
r = 0;
for i = 1:m
if ratedItem(i,1) == 1
r = r+1;
vectorA(1,r) = data(i, j);
vectorB(1,r) = data(i, item);
end
end
switch simMeas
case {'cosSim'}
similarity = cosSim(vectorA,vectorB);
case {'ecludSim'}
similarity = ecludSim(vectorA,vectorB);
case {'pearsSim'}
similarity = pearsSim(vectorA,vectorB);
end
end
disp(['the ', num2str(item), ' and ', num2str(j), ' similarity is ', num2str(similarity)]);
simTotal = simTotal + similarity;
ratSimTotal = ratSimTotal + similarity * userRating;
end
if simTotal == 0
score = 0;
else
score = ratSimTotal./simTotal;
end
end
推荐函数
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
function [ sortScore, sortIndex ] = recommend( data, user, simMeas )
% 获取data的大小
[m, n] = size(data);%m为用户,n为商品
if user > m
disp('The user is not in the dataBase');
end
% 寻找用户user未评分的商品
unratedItem = zeros(1,n);
numOfUnrated = 0;
for j = 1:n
if data(user, j) == 0
unratedItem(1,j) = 1;%0表示已经评分,1表示未评分
numOfUnrated = numOfUnrated + 1;
end
end
if numOfUnrated == 0
disp('the user has rated all items');
end
% 对未评分项打分,已达到推荐的作用
itemScore = zeros(numOfUnrated,2);
r = 0;
for j = 1:n
if unratedItem(1,j) == 1%找到未评分项
r = r + 1;
score = evaluate(data, user, simMeas, j);
itemScore(r,1) = j;
itemScore(r,2) = score;
end
end
%排序,按照分数的高低进行推荐
[sortScore, sortIndex_1] = sort(itemScore(:,2),'descend');
[numOfIndex,x] = size(sortIndex_1(:,1));
sortIndex = zeros(numOfIndex,1);
for m = 1:numOfIndex
sortIndex(m,:) = itemScore(sortIndex_1(m,:),1);
end
end
相似度的函数:
欧式距离函数
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
function [ ecludSimilarity ] = ecludSim( vectorA, vectorB )
ecludSimilarity = 1./(1 + norm(vectorA - vectorB));
end
皮尔逊相关系数函数
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
function [ pearsSimilarity ] = pearsSim( vectorA, vectorB )
pearsSimilarityMatrix = 0.5 + 0.5 * corrcoef(vectorA, vectorB);
pearsSimilarity = pearsSimilarityMatrix(1,2);
end
余弦相似度函数
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
function [ cosSimilarity ] = cosSim( vectorA, vectorB )
%注意vectorA和vectorB都是行向量
num = vectorA * vectorB';
denom = norm(vectorA) * norm(vectorB);
cosSimilarity = 0.5 + 0.5 * (num./denom);
end
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
【专访摘要】本次CDA持证专访邀请到拥有丰富物流供应链数据分析经验的赖尧,他结合自身在京东、华莱士、兰格赛等企业的从业经历 ...
2026-05-15在数字化时代,企业的每一次业务优化、每一项技术迭代,都需要回答一个核心问题:这个动作到底能带来多少价值?是提升了用户转化 ...
2026-05-15在数据仓库建设中,事实表与维度表是两大核心组件,二者相互关联、缺一不可,共同构成数据仓库的基础架构。事实表聚焦“发生了什 ...
2026-05-15 很多数据分析师沉迷于复杂的机器学习算法,却忽略了数据分析最基础也最核心的能力——描述性统计。事实上,80%的商业分析问 ...
2026-05-15【核心关键词】互联网、机会、运营、关键词、账户、数字化、后台、客户、成本、网络、数据分析、底层逻辑、市场推广、数据反馈 ...
2026-05-14在Python数据分析中,Pandas作为核心工具库,凭借简洁高效的数据处理能力,成为数据分析从业者的必备技能。其中,基于两列(或多 ...
2026-05-14 很多人把统计学理解为“一堆公式和计算”,却忽略了它的本质——一门让数据“开口说话”的科学。真正的数据分析高手,不是会 ...
2026-05-14在零售行业存量竞争日趋激烈的当下,客户流失已成为侵蚀企业利润的“隐形杀手”——据行业数据显示,零售企业平均客户流失率高达 ...
2026-05-13当流量红利消退、用户需求日趋多元,“凭经验决策、广撒网投放”的传统营销模式早已难以为继。大数据的崛起,为企业营销提供了全 ...
2026-05-13 许多数据分析师精通Excel函数和SQL查询,但当面对一张上万行的销售明细表,要快速回答“哪个地区销量最高”“哪款产品增长最 ...
2026-05-13在手游行业存量竞争日趋激烈、流量成本持续高企的当下,“拉新”早已不是行业核心痛点,“留存”尤其是“付费留存”,成为决定手 ...
2026-05-12 很多数据分析师掌握了Excel函数、会写SQL查询,但当被问到“数据从哪里来”“数据加工有哪些步骤”“如何使用分析工具连接数 ...
2026-05-12用户调研是企业洞察客户需求、优化产品服务、制定运营策略的核心前提,而调研数据的可靠性,直接决定了决策的科学性与有效性。在 ...
2026-05-11在市场竞争日趋激烈、流量成本持续攀升的今天,企业的核心竞争力已从“获取流量”转向“挖掘客户价值”。客户作为企业最宝贵的资 ...
2026-05-11 很多数据分析师精通Excel单元格操作,熟练应用多种公式,但当被问到“表结构数据的基本处理单位是什么”“字段和记录的本质 ...
2026-05-11在互联网运营、产品优化、用户增长等领域,次日留存率是衡量产品价值、用户粘性与运营效果的核心指标,更是判断新用户是否认可产 ...
2026-05-09相关性分析是数据分析领域中用于探究两个或多个变量之间关联强度与方向的核心方法,广泛应用于科研探索、商业决策、医疗研究、社 ...
2026-05-09 数据分析师八成以上的时间在和数据表格打交道,但许多人拿到Excel后习惯性地先算、先分析,结果回头发现漏了一列关键数据, ...
2026-05-09在数据驱动运营的时代,指标是连接业务目标与实际行动的核心桥梁,是企业解读业务现状、发现问题、预判趋势的“量化标尺”。一套 ...
2026-05-08在存量竞争日趋激烈的商业时代,“以客户为中心”早已从口号落地为企业运营的核心逻辑。而客户画像作为打通“了解客户”与“服务 ...
2026-05-08