(集体智慧编程读后感)欧几里得距离在推荐系统中的应用
在生活中,很常见的例子是系统推荐, 例如某电影网站对用户的观看历史,影评推荐感兴趣的电影, 同理也有很多音乐网站和购物网站对用户的行为和爱好进行分析从而对用户进行分类,集中推荐, 进行更有针对性的广告和更有效率把自己的产品推向用户;
举个例子(下面有3个人,分别对餐品进行了如下的评价):
用户1:{ 尖椒肉丝:8, 麻婆豆腐:8.5, 辣子鸡:8.4}
用户2:{ 尖椒肉丝:7, 麻婆豆腐:7.5, 剁椒鱼头:8.5, 辣子鸡:8.4, 回锅肉:9}
用户3:{ 辣子鸡:3, 麻婆豆腐:5, 白切鸡:9, 清蒸鱼头:8}
用户的相似度算法的一种是:欧几里得距离算法, 在每个用户的多维数据中找出用户的相似度
举个简单的图来说明:
简单起见; 上图使用二维来表示用户间的距离, 所以使用两个餐品; 欧几里得度量(euclidean metric)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。 用户距离越近代表相似度和爱好越相近
上图中用户间的距离可用二维空间的公式:
用户1与用户2的距离: sqrt(pow(8-7,2)+pow(8.5-7.5,2)) = 1.4142135623731
用户1与用户3的距离: sqrt(pow(8-3,2)+pow(8.5-5,2)) = 6.123724357
用户2与用户3的距离: sqrt(pow(7-3,2)+pow(7.5-5,2)) = 4.716990566
在这个简单的二维角度上可以通过肉眼很直观的看到推荐什么餐品更符合用户1的口味和爱好
所以在二维的空间公式可以表示为:
x,y 分别表示两个用户, x1,x2 表示用户x对两个餐品的爱好程度, y1,y2表示用户y对相同两个餐品的爱好程度
在两个用户的相似度的多维度公式为:
即几何意义上的多维度空间中的两个点之间的距离
通常我们为了方便计算;会对函数的结果进行加1,并求倒数,得出一个0-1之间的数,并数值越大,用户相似度越高
在所有用户中求出两两之间的距离;并根据距离最小(相似度最大)的用户计算两用户间评价餐品的差集并按评分高低进行排序进行推荐
在编程语言用;可以用二维数组来表示(因为数据量大的时候,通常都更热宠于使用数据库)
$data=array(
‘用户1’=>array(
‘餐品1’=>评分,//此处可以是评分,也可以是浏览量,浏览时长,等等多角度的数据
….
‘餐品n’=>评分,//数据纬度越大,数据越准确
),
‘用户2’=>array(
‘餐品6’=>评分,
….
‘餐品n’=>评分,
),
….
‘用户n’=>array(
‘餐品x’=>评分,
….
‘餐品n’=>评分,
),
);
实现基本使用(使用PHP描述):
$res = array();
foreach($data as $k1 => $v1) {
foreach($data as $k2 => $v2) {
if($k1 == $k2) continue;//不用和自己计算向适度
$pow_sum = 0;
foreach($v1 as $k=>$v) {
if(isset($v2[$k])) {//如果两个用户同事评论或参与或浏览过相同餐品
$pow_sum += pow($v-$v2[$k],2);
}
}
$res[$k1][$k2]=1/(1+sqrt($pow_sum));
}
}
$res数组就是得到用户两两对应的相似度,并可以进行分类