协同过滤推荐算法与应用

协同过滤推荐算法与应用
协同过滤推荐算法与应用

机器学习算法day03_协同过滤推荐算法及应用课程大纲

协同过滤推荐算法原理协同过滤推荐算法概述

协同过滤推荐算法思想

协同过滤推荐算法分析

协同过滤推荐算法要点

协同过滤推荐算法实现

协同过滤推荐算法案例案例需求

数据规整

参数设定

用Scikili机器学习算法库实现

算法检验

实现推荐

协同过滤推荐算法补充计算距离的数学公式

协同过滤算法常见问题

课程目标:

1、理解协同过滤算法的核心思想

2、理解协同过滤算法的代码实现

3、掌握协同过滤算法的应用步骤:数据处理、建模、运算和结果判定

1. CF协同过滤推荐算法原理

1.1 概述

什么是协同过滤(Collaborative Filtering, 简称CF)?

首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。

协同过滤算法又分为基于用户的协同过滤算法和基于物品的协同过滤算法

1.2 案例需求

如下数据是各用户对各文档的偏好:

用户/文档文档A文档B文档C文档D

用户A√√推荐?推荐?

用户B√√√

用户C√√√

用户D√√

现在需要基于上述数据,给A用户推荐一篇文档

1.3 算法分析

1.3.1 基于用户相似度的分析

直觉分析:“用户A/B”都喜欢物品A和物品B,从而“用户A/B”的口味最为相近

因此,为“用户A”推荐物品时可参考“用户B”的偏好,从而推荐D

这种就是基于用户的协同过滤算法UserCF指导思想

1.3.2 基于物品相似度的分析

直觉分析:物品组合(A,D)被同时偏好出现的次数最多,因而可以认为A/D两件物品的相似度最高,从而,可以为选择了A物品的用户推荐D物品

这种就是基于物品的协同过滤算法ItemCF指导思想

1.4 算法要点

1.4.1、指导思想

这种过滤算法的有效性基础在于:

1、用户偏好具有相似性,即用户可分类。这种分类的特征越明显,推荐准确率越高

2、物品之间具有相似性,即偏好某物品的人,都很可能也同时偏好另一件相似物品

1.4.2、两种CF算法适用的场景

什么情况下使用哪种算法推荐效果会更好?

不同环境下这两种理论的有效性也不同,应用时需做相应调整。

a.如豆瓣上的文艺作品,用户对其的偏好程度与用户自身的品位关联性较强;适合UserCF

b.而对于电子商务网站来说,商品之间的内在联系对用户的购买行为影响更为显著。

1.5 算法实现

总的来说,要实现协同过滤,需要一下几个步骤:

1.收集用户偏好

2.找到相似的用户或物品

3.计算推荐

1.5.1 收集用户偏好

用户有很多方式向系统提供自己的偏好信息,而且不同的应用也可能大不相同,下面举例进行介绍:

用户行为类型特征作用

评分显式整数量化值[0,n] 可以得到精确偏好

投票显式布尔量化值0|1 可以得到精确偏好

转发显式布尔量化值0|1 可以得到精确偏好

保存书签显式布尔量化值0|1 可以得到精确偏好

标记书签Tag 显式一些单词需要进一步分析得到偏好

评论显式一些文字需要进一步分析得到偏好

点击流隐式一组点击记录需要进一步分析得到偏好

页面停留时间隐式一组时间信息噪音偏大,不好利用

购买隐式布尔量化值0|1 可以得到精确偏好

1.5.2 原始偏好数据的预处理

用户行为识别/组合

在一般应用中,我们提取的用户行为一般都多于一种,关于如何组合这些不同的用户行为,比如,可以将用户行为分为“查看”和“购买”等等,然后基于不同的行为,计算不同的用户/ 物品相似度。

类似于当当网或者京东给出的“购买了该图书的人还购买了...”,“查看了图书的人还查

看了...”

喜好程度加权

根据不同行为反映用户喜好的程度将它们进行加权,得到用户对于物品的总体喜好。

一般来说,显式的用户反馈比隐式的权值大,但比较稀疏,毕竟进行显示反馈的用户是少数;同时相对于“查看”,“购买”行为反映用户喜好的程度更大,但这也因应用而异。

数据减噪和归一化。

①减噪:用户行为数据是用户在使用应用过程中产生的,它可能存在大量的噪音和用户的误操作,我们可以通过经典的数据挖掘算法过滤掉行为数据中的噪音,这样可以是我们的分析更加精确。

②归一化:如前面讲到的,在计算用户对物品的喜好程度时,可能需要对不同的行为数据进行加权。但可以想象,不同行为的数据取值可能相差很大,比如,用户的查看数据必然比购买数据大的多,如何将各个行为的数据统一在一个相同的取值范围中,从而使得加权求和得到的总体喜好更加精确,就需要我们进行归一化处理。最简单的归一化处理,就是将各类数据除以此类中的最大值,以保证归一化后的数据取值在[0,1] 范围中。

形成用户偏好矩阵

一般是二维矩阵,一维是用户列表,另一维是物品列表,值是用户对物品的偏好,一般是[0,1] 或者[-1, 1] 的浮点数值。

1.5.3 找到相似用户或物品

当已经对用户行为进行分析得到用户喜好后,我们可以根据用户喜好计算相似用户和物品,然后基于相似用户或者物品进行推荐,这就是最典型的CF 的两个分支:基于用户的CF 和基于物品的CF。这两种方法都需要计算相似度,下面我们先看看最基本的几种计算相似度的方法。

1.5.4 相似度的计算

相似度的计算,现有的几种基本方法都是基于向量(Vector)的,其实也就是计算两个向量的距离,距离越近相似度越大。

在推荐的场景中,在用户- 物品偏好的二维矩阵中,我们可以将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,或者将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度。

CF的常用方法有三种,分别是欧式距离法、皮尔逊相关系数法、余弦相似度法。

为了测试算法,给出以下简单的用好偏好数据矩阵:

行表示三名用户,列表示三个品牌,对品牌的喜爱度按照1~5增加。

用户苹果小米魅族

zhangsan 5 5 2

Lisi 3 5 4

wangwu 1 2 5

(1)欧氏距离法

就是计算每两个点的距离,比如Nike和Sony的相似度。

数值越小,表示相似度越高。

def OsDistance(vector1, vector2):

sqDiffVector = vector1-vector2

sqDiffVector=sqDiffVector**2

sqDistances = sqDiffVector.sum()

distance = sqDistances**0.5

return distance

(2)皮尔逊相关系数

两个变量之间的相关系数越高,从一个变量去预测另一个变量的精确度就越高,这是因为相关系数越高,就意味着这两个变量的共变部分越多,所以从其中一个变量的变化就可越多地获知另一个变量的变化。如果两个变量之间的相关系数为1或-1,那么你完全可由变量X去获知变量Y的值。

·当相关系数为0时,X和Y两变量无关系。

·当X的值增大,Y也增大,正相关关系,相关系数在0.00与1.00之间

·当X的值减小,Y也减小,正相关关系,相关系数在0.00与1.00之间

·当X的值增大,Y减小,负相关关系,相关系数在-1.00与0.00之间

当X的值减小,Y增大,负相关关系,相关系数在-1.00与0.00之间

相关系数的绝对值越大,相关性越强,相关系数越接近于1和-1,相关度越强,相关系数越接近于0,相关度越弱。

在python中用函数corrcoef实现,具体方法见参考资料

(3)余弦相似度

通过测量两个向量内积空间的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相

反的方向时,余弦相似度的值为-1。在比较过程中,向量的规模大小不予考虑,仅仅考虑到向量的指向方向。余弦相似度通常用于两个向量的夹角小于90°之内,因此余弦相似度的值为0到1之间。

def cosSim(inA,inB):

num = float(inA.T*inB)

denom = la.norm(inA)*la.norm(inB)

return 0.5+0.5*(num/denom)

注:本课程的实战案例基于皮尔逊相关系数法实现

1.5.3 计算推荐

UserCF基于用户相似度的推荐

计算推荐的过程其实就是KNN算法的计算过程

ItemCF基于物品相似度的推荐

算法思路

1. 构建物品的同现矩阵

2. 构建用户对物品的评分矩阵

3. 通过矩阵计算得出推荐结果

推荐结果=用户评分矩阵*同现矩阵

实质:计算各种物品组合的出现次数

2. CF协同过滤算法Python实战

2.1 电影推荐需求

根据一个用户对电影评分的数据集来实现基于用户相似度的协同过滤算法推荐,相似度的算法采用皮尔逊相关系数法

数据样例如下:

用户ID:电影ID:评分:时间

1::1193::5::978300760

1::661::3::978302109

1::914::3::978301968

1::3408::4::978300275

1::2355::5::978824291

1::1197::3::978302268

1::1287::5::978302039

1::2804::5::978300719

1::594::4::978302268

1::919::4::978301368

2.2 算法实现

本案例使用的数据分析包为pandas,Numpy和matplotlib

2.2.1 数据规整

首先将评分数据从ratings.dat中读出到一个DataFrame 里:

>>> import pandas as pd

>>> from pandas import Series,DataFrame

>>> rnames = ['user_id','movie_id','rating','timestamp']

>>> ratings = pd.read_table(r'ratings.dat',sep='::',header=None,names=rnames)

>>> ratings[:3]

user_id movie_id rating timestamp

0 1 1193 5 978300760

1 1 661 3 978302109

2 1 914

3 978301968

[3 rows x 4 columns]

ratings 表中对我们有用的仅是user_id、movie_id 和rating 这三列,因此我们将这三列取出,放到一个以user 为行,movie 为列,rating 为值的表data 里面。

>>> data = ratings.pivot(index='user_id',columns='movie_id',values='rating') #形成一个透视表>>> data[:5]

可以看到这个表相当得稀疏,填充率大约只有5%,接下来要实现推荐的第一步是计算user 之间的相关系数

2.2.2 相关度测算

DataFrame对象有一个很亲切的方法:

.corr(method='pearson', min_periods=1) 方法,可以对所有列互相计算相关系数。

其中:

method默认为皮尔逊相关系数,

min_periods参数,这个参数的作用是设定计算相关系数时的最小样本量,低于此值的一对列将不进行运算。这个值的取舍关系到相关系数计算的准确性,因此有必要先来确定一下这个参数。

2.2.3 min_periods 参数测定

测定这样一个参数的基本方法:

统计在min_periods 取不同值时,相关系数的标准差大小,越小越好;

但同时又要考虑到,我们的样本空间十分稀疏,min_periods 定得太高会导致出来的结果集太小,所以只能选定一个折中的值。

这里我们测定评分系统标准差的方法为:

在data中挑选一对重叠评分最多的用户,用他们之间的相关系数的标准差去对整体标准差做点估计。

在此前提下对这一对用户在不同样本量下的相关系数进行统计,观察其标准差变化。

首先,要找出重叠评分最多的一对用户。我们新建一个以user 为行列的方阵foo,然后挨个填充不同用户间重叠评分的个数:

>>> foo = DataFrame(np.empty((len(data.index),len(data.index)),dtype=int),index=data.index,columns=data.index)

#print(empt.shape): (6040, 6040)

>>> for i in foo.index:

for j in foo.columns:

foo.ix[i,j] = data.ix[i][data.ix[j].notnull()].dropna().count()

这段代码特别费时间,因为最后一行语句要执行4000*4000 = 1600万遍;

找到的最大值所对应的行列分别为424 和4169,这两位用户之间的重叠评分数为998:>>> for i in foo.index:

foo.ix[i,i]=0#先把对角线的值设为0

>>> ser = Series(np.zeros(len(foo.index)))

>>> for i in foo.index:

ser[i]=foo[i].max()#计算每行中的最大值

>>> ser.idxmax()#返回ser的最大值所在的行号

4169

>>> ser[4169]#取得最大值

998

>>> foo[foo==998][4169].dropna()#取得另一个user_id

424 4169

Name: user_id, dtype: float64

把424 和4169 的评分数据单独拿出来,放到一个名为test 的表里,另外计算了一下这两个用户之间的相关系数为0.456,还算不错,另外通过柱状图了解一下他俩的评分分布情况:

>>> data.ix[4169].corr(data.ix[424])

0.45663851303413217

>>> test = data.reindex([424,4169],columns=data.ix[4169][data.ix[424].notnull()].dropna().index) >>> test

movie_id 2 6 10 11 12 17 ...

424 4 4 4 4 1 5 ...

4169 3 4 4 4 2 5 ...

>>> test.ix[424].value_counts(sort=False).plot(kind='bar')

>>> test.ix[4169].value_counts(sort=False).plot(kind='bar')

对这俩用户的相关系数统计,我们分别随机抽取20、50、100、200、500 和998 个样本值,各抽20 次。并统计结果:

>>> periods_test = DataFrame(np.zeros((20,7)),columns=[10,20,50,100,200,500,998])

>>> for i in periods_test.index:

for j in periods_test.columns:

sample = test.reindex(columns=np.random.permutation(test.columns)[:j])

periods_test.ix[i,j] = sample.iloc[0].corr(sample.iloc[1])

>>> periods_test[:5]

10 20 50 100 200 500 998

0 -0.306719 0.709073 0.504374 0.376921 0.477140 0.426938 0.456639

1 0.386658 0.607569 0.434761 0.471930 0.43722

2 0.430765 0.456639

2 0.507415 0.585808 0.440619 0.634782 0.490574 0.436799 0.456639

3 0.628112 0.628281 0.452331 0.380073 0.472045 0.444222 0.456639

4 0.792533 0.641503 0.444989 0.499253 0.426420 0.441292 0.456639

[5 rows x 7 columns]

>>> periods_test.describe()

10 20 50 100 200 500 #998略

count 20.000000 20.000000 20.000000 20.000000 20.000000 20.000000

mean 0.346810 0.464726 0.458866 0.450155 0.467559 0.452448

std 0.398553 0.181743 0.103820 0.093663 0.036439 0.029758

min -0.444302 0.087370 0.192391 0.242112 0.412291 0.399875

25% 0.174531 0.320941 0.434744 0.375643 0.439228 0.435290

50% 0.487157 0.525217 0.476653 0.468850 0.472562 0.443772

75% 0.638685 0.616643 0.519827 0.500825 0.487389 0.465787

max 0.850963 0.709073 0.592040 0.634782 0.546001 0.513486

[8 rows x 7 columns]

从std 这一行来看,理想的min_periods 参数值应当为200 左右(标准差和均值、极值最接近)。

2.2.3 算法检验

为了确认在min_periods=200 下本推荐算法的靠谱程度,最好还是先做个检验。

具体方法为:在评价数大于200 的用户中随机抽取1000 位用户,每人随机提取一个评价另存到一个数组里,并在数据表中删除这个评价。然后基于阉割过的数据表计算被提取出的1000 个评分的期望值,最后与真实评价数组进行相关性比较,看结果如何。

>>> check_size = 1000

>>> check = {}

>>> check_data = data.copy()#复制一份data 用于检验,以免篡改原数据

>>> check_data = check_data.ix[check_data.count(axis=1)>200]#滤除评价数小于200的用户>>> for user in np.random.permutation(check_data.index):

movie = np.random.permutation(check_data.ix[user].dropna().index)[0]

check[(user,movie)] = check_data.ix[user,movie]

check_data.ix[user,movie] = np.nan

check_size -= 1

if not check_size:

break

>>> corr = check_data.T.corr(min_periods=200)

>>> corr_clean = corr.dropna(how='all')

>>> corr_clean = corr_clean.dropna(axis=1,how='all')#删除全空的行和列

>>> check_ser = Series(check)#这里是被提取出来的1000 个真实评分

>>> check_ser[:5]

(15, 593) 4

(23, 555) 3

(33, 3363) 4

(36, 2355) 5

(53, 3605) 4

dtype: float64

接下来要基于corr_clean 给check_ser 中的1000 个用户-影片对计算评分期望。

计算方法为:对与用户相关系数大于0.1 的其他用户评分进行加权平均,权值为相关系数

>>> result = Series(np.nan,index=check_ser.index)

>>> for user,movie in result.index:#这个循环看着很乱,实际内容就是加权平均而已

prediction = []

if user in corr_clean.index:

corr_set = corr_clean[user][corr_clean[user]>0.1].dropna()#仅限大于0.1 的用户else:continue

for other in corr_set.index:

if not np.isnan(data.ix[other,movie]) and other != user:#注意bool(np.nan)==True

prediction.append((data.ix[other,movie],corr_set[other]))

if prediction:

result[(user,movie)] = sum([value*weight for value,weight in prediction])/sum([pair[1] for pair in prediction])

>>> result.dropna(inplace=True)

>>> len(result)#随机抽取的1000 个用户中也有被min_periods=200 刷掉的

862

>>> result[:5]

(23, 555) 3.967617

(33, 3363) 4.073205

(36, 2355) 3.903497

(53, 3605) 2.948003

(62, 1488) 2.606582

dtype: float64

>>> result.corr(check_ser.reindex(result.index))

0.436227437429696

>>> (result-check_ser.reindex(result.index)).abs().describe()#推荐期望与实际评价之差的绝对值

count 862.000000

mean 0.785337

std 0.605865

min 0.000000

25% 0.290384

50% 0.686033

75% 1.132256

max 3.629720

dtype: float64

862 的样本量能达到0.436 的相关系数,应该说结果还不错。如果一开始没有滤掉评价数小于200 的用户的话,那么首先在计算corr 时会明显感觉时间变长,其次result 中的样本量会很小,大约200+个。但因为样本量变小的缘故,相关系数可以提升到0.5~0.6 。

另外从期望与实际评价的差的绝对值的统计量上看,数据也比较理想。

2.2.4 实现推荐

在上面的检验,尤其是平均加权的部分做完后,推荐的实现就没有什么新东西了。

首先在原始未阉割的data 数据上重做一份corr 表:

>>> corr = data.T.corr(min_periods=200)

>>> corr_clean = corr.dropna(how='all')

>>> corr_clean = corr_clean.dropna(axis=1,how='all')

我们在corr_clean 中随机挑选一位用户为他做一个推荐列表:

>>> lucky = np.random.permutation(corr_clean.index)[0]

>>> gift = data.ix[lucky]

>>> gift = gift[gift.isnull()]#现在gift 是一个全空的序列

最后的任务就是填充这个gift:

>>> corr_lucky = corr_clean[lucky].drop(lucky)#lucky 与其他用户的相关系数Series,不包含lucky 自身

>>> corr_lucky = corr_lucky[corr_lucky>0.1].dropna()#筛选相关系数大于0.1 的用户

>>> for movie in gift.index:#遍历所有lucky没看过的电影

prediction = []

for other in corr_lucky.index:#遍历所有与lucky 相关系数大于0.1 的用户

if not np.isnan(data.ix[other,movie]):

prediction.append((data.ix[other,movie],corr_clean[lucky][other]))

if prediction:

gift[movie] = sum([value*weight for value,weight in prediction])/sum([pair[1] for pair in prediction])

>>> gift.dropna().order(ascending=False)#将gift 的非空元素按降序排列

movie_id

3245 5.000000

2930 5.000000

2830 5.000000

2569 5.000000

1795 5.000000

981 5.000000

696 5.000000

682 5.000000

666 5.000000

572 5.000000

1420 5.000000

3338 4.845331

669 4.660464

214 4.655798

3410 4.624088

...

2833 1

2777 1

2039 1

1773 1

1720 1

1692 1

1538 1

1430 1

1311 1

1164 1

843 1

660 1

634 1

591 1

56 1

Name: 3945, Length: 2991, dtype: float64

3、CF协同过滤算法补充

3.1、计算距离的数学公式

欧几里德距离(Euclidean Distance)

最初用于计算欧几里德空间中两个点的距离,假设x,y 是n 维空间的两个点,它们之间的欧几里德距离是:

可以看出,当n=2 时,欧几里德距离就是平面上两个点的距离。

当用欧几里德距离表示相似度,一般采用以下公式进行转换:距离越小,相似度越大

皮尔逊相关系数(Pearson Correlation Coefficient)

皮尔逊相关系数一般用于计算两个定距变量间联系的紧密程度,它的取值在[-1,+1] 之间。

sx, sy是x 和y 的样品标准偏差。

Cosine 相似度(Cosine Similarity)

Cosine 相似度被广泛应用于计算文档数据的相似度:

Tanimoto 系数(Tanimoto Coefficient)

Tanimoto 系数也称为Jaccard 系数,是Cosine 相似度的扩展,也多用于计算文档数据的相似度:

相似邻居的计算

介绍完相似度的计算方法,下面我们看看如何根据相似度找到用户-物品的邻居,常用的挑选邻居的原则可以分为两类:

1)固定数量的邻居:K-neighborhoods 或者Fix-size neighborhoods

不论邻居的“远近”,只取最近的K 个,作为其邻居。

如下图中的A,假设要计算点1 的5- 邻居,那么根据点之间的距离,我们取最近的5 个点,分别是点2,点3,点4,点7 和点5。但很明显我们可以看出,这种方法对于孤立点的计算效果不好,因为要取固定个数的邻居,当它附近没有足够多比较相似的点,就被迫取一些不太相似的点作为邻居,这样就影响了邻居相似的程度,比如下图中,点1 和点5 其实并不是很相似。

2)基于相似度门槛的邻居:Threshold-based neighborhoods

与计算固定数量的邻居的原则不同,基于相似度门槛的邻居计算是对邻居的远近进行最大值的限制,落在以当前点为中心,距离为K 的区域中的所有点都作为当前点的邻居,这种方法计算得到的邻居个数不确定,但相似度不会出现较大的误差。

如下图中的B,从点1 出发,计算相似度在K 内的邻居,得到点2,点3,点4 和点7,这种方法计算出的邻居的相似度程度比前一种优,尤其是对孤立点的处理。

图:相似邻居计算示意图

3.2、协同过滤算法常见问题

虽然协同过滤是一种比较省事的推荐方法,但在某些场合下并不如利用元信息推荐好用。协同过滤会遇到的两个常见问题是

1)稀疏性问题——因用户做出评价过少,导致算出的相关系数不准确

2)冷启动问题——因物品获得评价过少,导致无“权”进入推荐列表中

都是样本量太少导致的(上例中也使用了至少200 的有效重叠评价数)。

因此在对于新用户和新物品进行推荐时,使用一些更一般性的方法效果可能会更好。比如: 给新用户推荐更多平均得分超高的电影;

把新电影推荐给喜欢类似电影(如具有相同导演或演员)的人。

后面这种做法需要维护一个物品分类表,这个表既可以是基于物品元信息划分的,也可是通过聚类得到的。

基于用户的协同过滤算法 UserCF流程图

UserCF算法主要流程: 主要全局变量: const int usersum = 6040; //用户总数 const int itemsum =3952; //项目总数 const int N =10; //为用户推荐前N个物品 int trainuser[usersum][itemsum]={0}; //训练集合user item rate矩阵 int test[usersum][itemsum]={0}; //测试集合user item rate矩阵 struct _simi { double value; //相似值 int num; //相似用户号 }; _simi simiUser[usersum][usersum]; //排序后的相似性矩阵double trainuserItem[usersum][itemsum]={0.0}; // user item 兴趣程度矩阵int recommend[usersum][N]={0}; //为每个用户推荐N个物品

拆分数据集函数int SplitData(int m, int k) 主要流程: 将数据集拆分为测试集test和训练集trainuser,其中1/m为测试集,取不同的k<=m-1值在相同的随即种子下可得到不同的测/训集合

计算用户之间相似度函数double Simility(int* Ua, int*Ub)主要流程:计算用户Ua和Ub的相似性,返回值为Ua和Ub的相似度

用户相似性矩阵排序函数int sort(double *simArr,_simi *simStruct)主要流程:根据相似性由高到低排序,每行第一个是自己

改进了协同过滤推荐算法的推荐系统的制作流程

图片简介:

本技术介绍了一种改进了协同过滤推荐算法的推荐系统,属于推荐系统技术相关领域。该推荐系统包括输入模块、推荐算法和输出模块三个部分,输入模块用于输入用户个人基本信息、用户对项目的评分和用户历史信息等;推荐算法根据输入信息分析用户兴趣爱好,寻找最相似用户和项目,给出预测的评分结果;输出模块依据用户输入请求,输出相应的推荐项目。其中改进部分是对推荐算法中冷启动问题进行优化。针对新用户、新项目和新系统不同的冷启动问题,提出了优化解决方法。 技术要求 1.一种改进了协同过滤推荐算法的推荐系统,其特征在于,包括输入模块、推荐算法和输出模块;输入模块用于输入用户个人基本信息、用户对项目的评分、用户历史信息和当 前的点击操作;推荐算法根据输入信息分析用户兴趣爱好,寻找最相似用户和项目,给 出预测的评分结果;输出模块依据用户输入请求,输出相应的推荐项目到客户端。 2.如权利要求1所述的一种改进了协同过滤推荐算法的推荐系统,其特征在于,所述推荐算法为协同过滤推荐算法,所述协同过滤推荐算法冷启动实现方式为:一、提供非个性 化的推荐,非个性化推荐的最简单例子就是热门排行榜,可以给用户推荐热门排行榜, 然后等到用户的反馈足够多,数据收集到一定的时候,再转换为个性化推荐;二、利用 用户的注册信息,提供的年龄、性别、职业等数据做粗粒度的个性化;三、利用用户的 社交网络账号登录,导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的 物品;四、利用物品的内容信息计算物品相关表,利用专家进行标注。 3.如权利要求2所述的一种改进了协同过滤推荐算法的推荐系统,其特征在于,在所述推荐算法中,用户点击商品链接后,推荐系统会记录用户的点击行为,然后系统计算用户 间相似度,找出与当前用户最相似的前N个用户,接着在这前N个用户中找出当前用户没有点击的商品,将点击率最高的几个商品加入推荐列表,最后将推荐列表发往客户端向 用户展示推荐的商品。

基于协同过滤的推荐算法及代码实现

基于协同过滤的推荐算法与代码实现 什么是协同过滤? 协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤(Collaborative Filtering, 简称CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。 协同过滤一般是在海量的用户中发掘出一小部分和你品位比较类似的,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的其他东西组织成一个排序的目录作为推荐给你。当然其中有一个核心的问题: 如何确定一个用户是不是和你有相似的品位? 如何将邻居们的喜好组织成一个排序的目录? 简单来说: 1. 和你兴趣合得来的朋友喜欢的,你也很有可能喜欢; 2. 喜欢一件东西A,而另一件东西B 与这件十分相似,就很有可能喜欢B; 3. 大家都比较满意的,人人都追着抢的,我也就很有可能喜欢。 三者均反映在协同过滤的评级(rating)或者群体过滤(social filtering)这种行为特性上。 深入协同过滤的核心 首先,要实现协同过滤,需要一下几个步骤: 1. 收集用户偏好 2. 找到相似的用户或物品 3. 计算推荐 (1)收集用户偏好 要从用户的行为和偏好中发现规律,并基于此给予推荐,如何收集用户的偏好信息成为系统推荐效果最基础的决定因素。用户有很多方式向系统提供自己的偏好信息,而且不同的应用也可能大不相同,下面举例进行介绍:

以上列举的用户行为都是比较通用的,推荐引擎设计人员可以根据自己应用的特点添加特殊的用户行为,并用他们表示用户对物品的喜好。 在一般应用中,我们提取的用户行为一般都多于一种,关于如何组合这些不同的用户行为,基本上有以下两种方式: 将不同的行为分组:一般可以分为“查看”和“购买”等等,然后基于不同的行为,计算不同的用户/物品相似度。类似于当当网或者Amazon 给出的“购买了该图书的人还购买了...”,“查看了图书的人还查看了...”

基于项目的协同过滤算法 ItemCF流程图

ItemCF算法主要流程: 主要全局变量: const int usersum = 6040; //用户总数 const int itemsum =3952; //项目总数 const int N =10; //为用户推荐前N个物品 int trainuser[usersum][itemsum]={0}; //训练集合user item rate矩阵 int test[usersum][itemsum]={0}; //测试集合user item rate矩阵 struct _simi { double value; //相似值 int num; //相似物品号 }; _simi simiItem[itemsum][itemsum]; //排序后的相似性矩阵double trainuserItem[usersum][itemsum]={0.0}; // user item 兴趣程度矩阵int recommend[usersum][N]={0}; //为每个用户推荐N个物品

拆分数据集函数int SplitData(int m, int k) 主要流程: 将数据集拆分为测试集test和训练集trainuser,其中1/m为测试集,取不同的k<=m-1值在相同的随即种子下可得到不同的测/训集合

计算项目之间相似度函数double Simility(int* ItemA, int* ItemB)主要流程:计算用户ItemA和ItemB的相似性,返回值为ItemA和ItemB的相似度

用户i对物品j预测兴趣程度函数double getUserLikeItem(int i,int j,int k)主要流程: 利用k个最近邻来计算

基于用户评分Kmeans聚类的协同过滤推荐算法实现

基于用户评分Kmeans聚类的协同过滤 推荐算法实现 一:基于用户评分Kmeans聚类的协同过滤推荐算法实现步骤 1、构建用户-电影评分矩阵: public Object readFile(String fileName){ List user = new ArrayList(); double[][] weight = new double[user_num][keyword_num]; List obj = new ArrayList(); try { File file = getFile(fileName); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line = ""; while (br.ready()) { line = br.readLine(); String[] data = line.split(" "); String[] str = data[1].split(";"); user.add(data[0]); for (int i = 0; i < str.length; i++) { String[] s = str[i].split(":");

weight[Integer.parseInt(data[0])-1][Integer.par seInt(s[0])-1] = Double.parseDouble(s[1]); } } obj.add(user); obj.add(weight); br.close(); } catch (Exception e) { e.printStackTrace(); } return obj; } 2、根据用户评分聚类: public class GenerateGroup implements Base{ private List initPlayers;//初始化,一个随机聚类中心 private List players;//每个用户实体类 public static List clusterHeart; public GenerateGroup(List list) { players = list;

一种改进的协同过滤推荐算法

种改进的协同过滤推荐算法 摘要:协同过滤算法自提出以来便得到了广泛运用,但 协同过滤算法本身具有的数据稀疏性及冷启动问题也制约了算法的性能。通过分析协同过滤算法的原理和不足,提出了一种改进协同过滤算法的思路,并在MovieLens 数据集上进行了验证,一定程度上提高了 算法性能。 关键词关键词:推荐系统;协同过滤;数据稀疏性文献标识码:A 文章编号:1672-7800(2016)004-0063-03 0 引言网络技术的 迅猛发展使得互联网上的信息呈现爆炸式 中图分类号:TP312 增长,为人们的生活和学习提供了便利,与此同时,海量的数据也带来了一些问题,其中最主要的就是“信息过载”问题。所谓信息过载问题,是指由于不相关的垃圾数据过多从而导致用户无法准确找到自己想要信息的问题。 为应对信息过载问题,人们提出了各种解决方案,其中 最为用户所熟悉的无疑是搜索引擎技术。但搜索引擎的服务是被动的,它要求使用者必须先给出一个搜索关键字,然后才能提供与该关键字相关的信息。这种完全依赖于关键字的服务模式要求用户能用关键字准确描述自己所需信息,否则

无法提供服务,但是现实中用户很多时候并不能精确描述自己的需求信息。这种情况下,以推荐系统为代表的技术可以较好地解决该问题,提高用户的使用体验。 1 协同过滤算法 1.1算法介绍 “协同过滤”技术最早由GlodBerg等于20世纪90年代 提出,该技术最初被用来过滤电子邮件[1],此后这种技术取得了商业上的巨大成功,得到了广泛使用[2-3] 。协同过滤的基本思想是,如果两个用户在一些项目上具有相似的评价信息,包括显示的直接评分信息或者点击、购买等隐式评价信息,则这两个用户具有相似兴趣。一般而言,协同过滤需要使用到的用户评价信息会被存储在一个数据表中,该表可以被称为用户评分矩阵。 协同过滤技术的关键在于计算两个用户或者项目的相 似度,然后根据相似的用户或者项目进行推荐。其中如果根据某一用户的评分数据寻找到与其相似的用户,并依据相似用户的爱好对活动用户进行推荐的思想被称为基于用户的协同过滤。如果知道用户对某一项目评分较高,则可以根据评分矩阵寻找与这一项目相似的项目推荐给用户,这种思想被称为基于项目的协同过滤。 两种协同过滤算法的基本步骤比较相似。首先,依据用 户对物品的评分建立用户评分矩阵,矩阵的行数为系统中用

基于协同过滤算法的电影推荐系统设计

高级数据挖掘期末大作业

基于协同过滤算法的电影推荐系统 本电影推荐系统中运用的推荐算法是基于协同过滤算法(Collaborative Filtering Recommendation)。协同过滤是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。 电影推荐系统中引用了Apache Mahout提供的一个协同过滤算法的推荐引擎Taste,它实现了最基本的基于用户和基于内容的推荐算法,并提供了扩展接口,使用户方便的定义和实现自己的推荐算法。 电影推荐系统是基于用户的推荐系统,即当用户对某些电影评分之后,系统根据用户对电影评分的分值,判断用户的兴趣,先运用UserSimilarity计算用户间的相似度.UserNeighborhood根据用户相似度找到与该用户口味相似的邻居,最后由Recommender提供推荐个该用户可能感兴趣的电影详细信息。将用户评过分的电影信息和推荐给该用户的电影信息显示在网页结果页中,推荐完成。 一、Taste 介绍 Taste是Apache Mahout 提供的一个个性化推荐引擎的高效实现,该引擎基于java实现,可扩展性强,同时在mahout中对一些推荐算法进行了MapReduce 编程模式转化,从而可以利用hadoop的分布式架构,提高推荐算法的性能。 在Mahout0.5版本中的Taste,实现了多种推荐算法,其中有最基本的基于用户的和基于内容的推荐算法,也有比较高效的SlopeOne算法,以及处于研究阶段的基于SVD和线性插值的算法,同时Taste还提供了扩展接口,用于定制化开发基于内容或基于模型的个性化推荐算法。 Taste 不仅仅适用于Java 应用程序,还可以作为内部服务器的一个组件以HTTP 和Web Service 的形式向外界提供推荐的逻辑。Taste 的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。 下图展示了构成Taste的核心组件:

基于在线评论情感分析的改进协同过滤推荐算法

第45卷 第6A 期 2018年6月 计算机科学COMPUTER SCIENCE Vol.45No.6A June 2018 本文受国家自然科学基金项目(71671121,11471152)资助.孙丽华(1979-),女,博士生,主要研究方向为个性化推荐算法,E-mail :sunlh68@t j u.edu.cn ;张兴芳(1957-) ,女,教授,主要研究方向为不确定性的数学理论与应用. 基于在线评论情感分析的改进协同过滤推荐算法 孙丽华1 张兴芳2 (天津大学管理与经济学部 天津300072)1 ( 聊城大学数学科学学院 山东聊城252000)2 摘 要 针对在线中文评论中用户主观意见的不确定性,提出了一种基于不确定理论的情感分析模型,并结合情感分析模型设计了一种个性化推荐算法.首先,采用分词工具ICTCLAS 和IKAnal y zer 预处理在线中文评论,并基于情感词典(HowNet )计算特征词的点互信息值;然后,应用不确定变量与不确定集设计情感分析模型;最后,根据情感分析模型设计搜索K 最近邻居的新方法,并产生推荐.实验结果表明,该方法能够有效提高推荐的准确率,缓解数据稀疏问题. 关键词 推荐算法,不确定统计,在线评论,情感分析中图法分类号 TP391 文献标识码 A Im p roved Collaborative Filterin g Recommendation Al g oritbm Based on Sentiment Anal y sis of Online Review SUN Li-hua 1 ZHANG Xin g -fan g 2 (Colle g e of Mana g ement and Economics ,Tian j in Universit y ,Tian j in 300072,China ) 1(School of Mathematical Sciences ,Liaochen g Universit y ,Liaochen g ,Shandon g 252000,China ) 2 Abstract Aimin g at the uncertaint y of users sub j ect o p inions in online Chinese review ,a sentiment anal y sis model based on uncertaint y theor y was p ro p osed.An individual recommendation al g orithm was desi g ned on the basis of the p ro p osed sentiment anal y sis model. First ,the tokenizers of ICTCLAS and IKAnal y zer was used to p re p rocess online Chinese review to g enerate characteristic words ,and the p oint mutual information value of characteristic words accoun-tin g for the sentiment direction were com p uted based on HowNet dictionar y .Then ,the sentiment anal y sis model was established via uncertaint y theor y of uncertain variables and uncertain sets.In addition ,the new similarit y formula based on the p ro p osed model was used to search the K-nearest nei g hbors.Finall y ,the recommendation lists were g iven.Ex p eri- mental results show that the p ro p osed method can effectivel y im p rove the accurac y of recommendation and alleviate the s p arse data p roblem. Ke y words Recommendation al g orithm ,Uncertain statistics ,Online review ,Sentiment anal y sis 1 引言 随着互联网的发展,电子商务逐步进入社会化商务时代,用户可以发布和获得网络信息的渠道日益增多. 以 协同过 滤 思想为基础的推荐技术[1] 很好地帮助用户提高了信息利 用率.基于用户或项目的协同过滤推荐算法,无论是在实际应用领域还是理论发展方面,都取得了丰富的成果.但是,在电子商务网站中,普遍存在数据稀疏问题,国内外一些学者通 过改进推荐算法来提高推荐精度[2-3] ,从而满足用户的需求. 然而,随着用户需求的不断细化,学者们发现评分数据中包含的信息量有限,不可避免地忽略了用户的某些特征信息,限制了推荐的精度. 在线评论是用户对项目使用经验的具体反馈,从评论信息中挖掘用户意见,无疑能完善用户偏好模型,提高推荐精度.由于自然语言本身具有不确定性,使得用户反馈的体验信息具有不确定性.为解决这类问题,现有文献多采用概率 [2] 或模糊 [4-5] 的方法.例如,Dra g oni 等 [6] 利用模糊的方法 刻画情感倾向,并将该方法应用到不同的领域来分析评论中的情感倾向性.Ha q ue 等 [7] 基于模糊逻辑的方法分析用户正 面或者负面的情绪来判断用户对产品的兴趣.Loia 等[8] 和 Wan g 等[9] 利用模糊的方法来识别文本中用户的情感倾向. Fu 等[12] 利用模糊方法从句子级别来研究情感分类, 提高了情感分类的准确性.因此,情感分析技术很快被应用到推荐 系统中[10-11].Fu 等[13] 结合评论信息来丰富用户的偏好信 息,利用HowNet 情感词典分析评论中用户的情感倾向,挖 掘用户情感倾向来提高推荐结果的准确性.De 等[2] 利用概率推断的方法从模糊观测的结果中改进协同过滤推荐算法, 提高推荐结果的精度. 然而,概率论和模糊数学中并没有涵盖所有的非确定性,例如,在情感分析过程中,分析用户的情感倾向是正向的程度或者是负向的程度;类似地,分析用户的情感强度是无法用工 具测量的.不确定理论[14]对这些问题给出了合理的解释,并对其做了进一步的完善[ 15] .可以利用不确定理论来更好地描述这些既不是随机也不是模糊的非确定问题. 本文针对在线中文评论中用户主观意见的不确定问题,建立了一种基于不确定理论的情感分析模型,并在此基础上设计了个性化推荐算法,以提高推荐结果的精度和缓解数据稀疏问题.最后,在Java 环境下,利用两个真实数据集验证 了该算法的有效性. 万方数据

浅谈基于协同过滤的个性化推荐算法

浅谈基于协同过滤 算法的个性化推荐 姓名: 学号: 班级: 学院: 年月日

摘要 协同过滤是如今推荐系统中最为成熟的的一个推荐算法系类,是利用群体的喜好来推测使用者的喜好,从而向用户产生推荐的算法。当前协同过滤算法大致可以分为基于用户的协同过滤算法和基于项目的协同过滤算法。协同过滤为主要算法的推荐系统的应用领域日益广泛,电子商务是其应用的最主要和最成功的领域。但协同过滤算法仍具有很多不足之处,最突出的不足分别是数据稀疏性问题,冷启动问题和系统延伸性问题。在已有的理论和实践研究基础上,个人提出了协同过滤推荐值得深入研究的方向应包括多维数据的交叉利用,从而提高协同过滤推荐的精准度。 关键字:协同过滤推荐,基于用户,基于项目,数据稀疏,冷启动,系统延 伸性,多维数据的交叉利用 正文 一、协同过滤推荐的基本定义 (一)协同过滤推荐的概念 协同过滤是如今推荐系统中最为成熟的的一个推荐算法系类,简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的资讯,个人透过合作的机制给予资讯相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选资讯,回应不一定局限于特别感兴趣的,特别不感兴趣资讯的纪录也相当重要。 (二)协同过滤推荐的主要算法概述 当前协同过滤算法大致可以分为两类,一类是基于用户的协同过滤算法,一类是基于项目的协同过滤算法。 基于用户的协同过滤推荐根据相似用户群的观点来产生对目标用户的推荐。基本思想是如果某些用户对部分项目的评分趋于一致或是很接近,可以认为他们对其它项目的评分差异就比较小,进一步,可以使用这些相似用户的项目评分值对目标用户的未评分项目进行估计。基于用户的协同过滤使用数理统计的方法来寻找与目标用户有相似兴趣偏好的最近邻居用户集合,再以最近邻居用户对特定项目的评分为基础使用一定的数学方法来预测目标用户对该特定项目的评分,而预测评分最高的前N个商品可以看作是用户最有可能感兴趣top-N商品返回给目标用户(这就是所谓的top-N推荐)。基于用户的协同过滤推荐算法的核心思想是利用数理统计的方法为目标用户寻找他的最近邻居用户集,再以最近邻居用户对特定项目的评分为基础使用一定的数学方法来预测目标用户对该特定项目的评分,最终产生最后的推荐结果。通过最近邻居用户对目标用户未评分项目的评分值进行加权平均来逼近,这是该算法思想的关键。基于用户的协同过滤推荐算法的主要工作有:用户之间相似性的衡量、最近邻居集的查找和评分预测值的计算。 和基于用户的协同过滤相比,基于项目的协同过滤推荐算法的思想出发点是完全相反的,但是计算方法一致。基于项目的协同过滤推荐算法是根据用户对与

协同过滤推荐算法与应用

机器学习算法day03_协同过滤推荐算法及应用课程大纲 课程目标: 1、理解协同过滤算法的核心思想 2、理解协同过滤算法的代码实现 3、掌握协同过滤算法的应用步骤:数据处理、建模、运算和结果判定

4、 1. CF协同过滤推荐算法原理 1.1 概述 什么是协同过滤(Collaborative Filtering, 简称CF)? 首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做? 大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。 协同过滤算法又分为基于用户的协同过滤算法和基于物品的协同过滤算法 1.2 案例需求 如下数据是各用户对各文档的偏好: 现在需要基于上述数据,给A用户推荐一篇文档

1.3 算法分析 1.3.1 基于用户相似度的分析 直觉分析:“用户A/B”都喜欢物品A和物品B,从而“用户A/B”的口味最为相近 因此,为“用户A”推荐物品时可参考“用户B”的偏好,从而推荐D 这种就是基于用户的协同过滤算法UserCF指导思想 1.3.2 基于物品相似度的分析 直觉分析:物品组合(A,D)被同时偏好出现的次数最多,因而可以认为A/D两件物品的相似度最高,从而,可以为选择了A物品的用户推荐D物品

这种就是基于物品的协同过滤算法ItemCF指导思想 1.4 算法要点 1.4.1、指导思想 这种过滤算法的有效性基础在于: 1、用户偏好具有相似性,即用户可分类。这种分类的特征越明显,推荐准确率越高 2、物品之间具有相似性,即偏好某物品的人,都很可能也同时偏好另一件相似物品 1.4.2、两种CF算法适用的场景 什么情况下使用哪种算法推荐效果会更好? 不同环境下这两种理论的有效性也不同,应用时需做相应调整。 a.如豆瓣上的文艺作品,用户对其的偏好程度与用户自身的品位关联性较强;适合UserCF b.而对于电子商务网站来说,商品之间的内在联系对用户的购买行为影响更为显著。 1.5 算法实现 总的来说,要实现协同过滤,需要一下几个步骤: 1.收集用户偏好 2.找到相似的用户或物品 3.计算推荐

基于用户的协同过滤推荐算法原理和实现

在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单。该算法1992年提出并用于邮件过滤系统,两年后1994年被GroupLens 用于新闻过滤。一直到2000年,该算法都是推荐系统领域最著名的算法。 本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其他你有可能感兴趣的人。 基本思想 俗话说“物以类聚、人以群分”,拿看电影这个例子来说,如果你喜欢《蝙蝠侠》、《碟中谍》、《星际穿越》、《源代码》等电影,另外有个人也都喜欢这些电影,而且他还喜欢《钢铁侠》,则很有可能你也喜欢《钢铁侠》这部电影。 所以说,当一个用户A 需要个性化推荐时,可以先找到和他兴趣相似的用户群体G,然后把G 喜欢的、并且A 没有听说过的物品推荐给A,这就是基于用户的系统过滤算法。 原理 根据上述基本原理,我们可以将基于用户的协同过滤推荐算法拆分为两个步骤: 1. 找到与目标用户兴趣相似的用户集合 2. 找到这个集合中用户喜欢的、并且目标用户没有听说过的物品推荐给目标用户1. 发现兴趣相似的用户 通常用Jaccard 公式或者余弦相似度计算两个用户之间的相似度。设N(u) 为用户u 喜欢的物品集合,N(v) 为用户v 喜欢的物品集合,那么u 和v 的相似度是多少呢: Jaccard 公式: 余弦相似度:

假设目前共有4个用户:A、B、C、D;共有5个物品:a、b、c、d、e。用户与物品的关系(用户喜欢物品)如下图所示: 如何一下子计算所有用户之间的相似度呢?为计算方便,通常首先需要建立“物品—用户”的倒排表,如下图所示: 然后对于每个物品,喜欢他的用户,两两之间相同物品加1。例如喜欢物品a 的用户有A 和B,那么在矩阵中他们两两加1。如下图所示:

基于用户-项目特征的协同过滤推荐改进算法

基于用户-项目特征的协同过滤推荐改进算法 朱 珠,辜丽川,舒贵阳,冯娟娟,王 超,陈 卫 ( 安徽农业大学 信息与计算机学院,安徽 合肥 230036 ) 摘 要:基于用户的协同过滤推荐算法是当前使用范围最广的推荐算法之一。传统的协同过滤推荐算法仅依靠用户对项目的打分记录,数据稀疏度高而且来源单一,对用户间相似度测算的可信度影响较大。针对这一问题,引入用户画像信任度和类别评分差异度两个概念,对传统基于用户的协同过滤推荐算法进行改进,提出一种多维用户相似性计算方法,该算法通过调节用户画像信任度和类别评分差异度在用户相似性计算中的贡献系数,进而影响推荐算法评价指标MAE 的变化,实验结果表明,新算法较原算法在命中率和准确率上有较大提高。 关键词:用户画像; 项目类别; 相似性; 协同过滤 中图分类号:TP399 文献标识码:A 文章编号:1673-9639 (2017) 09-0015-05 协同过滤推荐算法[1-2]是应用最为广泛的推荐方法之一,在亚马逊网、Netflix 、YouTube 等在线电子商务[3]、移动应用[4]等领域作为个性化信息服务的解决方案,都有较为成功的应用。随着数据量增大,用户对项目的打分数量有限,每个用户的打分数量通常小于整体待评分项目的1‰,用户-项目打分矩阵数据稀疏等级高,数据重叠性低,严重制约了用户间相似度测算的可信度,降低了推荐算法的性能。因此,如何通过用户相似性计算为目标用户过滤出可靠的邻居用户成为算法亟待解决的关键问题。 为解决数据稀疏性问题,赵琴琴等[3]依据用户-项目评分矩阵,通过相似度传播,为目标用户寻找更多、更可靠的邻居,并分别从用户和项目两方面寻找用户、项目的相似性。胡勋等[5]为提高基于共同评分项目的用户相似度计算精度,使用推土机距离实现跨项目的移动用户相似度计算,提出一种将移动用户信任关系与项目评分特融合的协同过滤推荐算法; 贾冬艳等基于用户相似度计算的结果,动态选取目标用户的兴趣相似集,并依据用户评分信息计算目标用户与兴趣相似用户的信任度,实现双重邻居选取[1]。 以上处理方式在一定程度上缓和了数据稀疏性问题,但这些方式的数据来源单一,仅依赖于用户对项目的行为记录,没有考虑用户和项目自身特征差异对相似性的影响,用户信任度稳定性较低,往往导致推荐结果的准确率和命中率降低。为解决上述问题,本文引入“用户画像”和“用户对同一类别项目的评分量”两个度量因子,提出一种改进相似度的协同过滤推荐算法,实验结果证明该方法在准确度等方面有较大改善。 1.相关概念 1.1.度量相似性 1.1.1.余弦相似性 将用户i 和用户j 的评分向量视为n 维空间向 收稿日期:2017-03-22 基金项目:国家自然科学基金项目(31371533);安徽省重大科技专项(16030701092);安徽农业大学2015年度教育改革与发 展研究项目(18)。 作者简介:朱 珠(1992-),女,安徽六安人,硕士,研究方向:数据挖掘、机器学习等。 第19卷 第9期 铜仁学院学报 V ol. 19, No. 92017年 9 月 Journal of Tongren University Sep. 2017

基于协同过滤算法的电影推荐系统

基于协同过滤算法的电影推荐系统

————————————————————————————————作者:————————————————————————————————日期:

高级数据挖掘期末大作业

基于协同过滤算法的电影推荐系统 本电影推荐系统中运用的推荐算法是基于协同过滤算法(Collaborative Filtering Recommendation)。协同过滤是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。 电影推荐系统中引用了Apache Mahout提供的一个协同过滤算法的推荐引擎Taste,它实现了最基本的基于用户和基于内容的推荐算法,并提供了扩展接口,使用户方便的定义和实现自己的推荐算法。 电影推荐系统是基于用户的推荐系统,即当用户对某些电影评分之后,系统根据用户对电影评分的分值,判断用户的兴趣,先运用UserSimilarity计算用户间的相似度.UserNeighborhood根据用户相似度找到与该用户口味相似的邻居,最后由Recommender提供推荐个该用户可能感兴趣的电影详细信息。将用户评过分的电影信息和推荐给该用户的电影信息显示在网页结果页中,推荐完成。 一、Taste 介绍 Taste是Apache Mahout 提供的一个个性化推荐引擎的高效实现,该引擎基于java实现,可扩展性强,同时在mahout中对一些推荐算法进行了MapReduce 编程模式转化,从而可以利用hadoop的分布式架构,提高推荐算法的性能。 在Mahout0.5版本中的Taste,实现了多种推荐算法,其中有最基本的基于用户的和基于内容的推荐算法,也有比较高效的SlopeOne算法,以及处于研究阶段的基于SVD和线性插值的算法,同时Taste还提供了扩展接口,用于定制化开发基于内容或基于模型的个性化推荐算法。 Taste 不仅仅适用于Java 应用程序,还可以作为内部服务器的一个组件以HTTP 和Web Service 的形式向外界提供推荐的逻辑。Taste 的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。 下图展示了构成Taste的核心组件:

基于用户的协同过滤算法

基于用户的协同过滤算法 作者:罗沐阳(2012101020028) 指导教师:张勇 【摘要】:随着网络技术的应用和普及、电子商务的迅猛发展,越来越多的信息充斥在网络之上。如何在众多的资源中找到适合自己需求的信息,成为众多学者、专家和网络用户火心的核心问题之一。个性化推荐技术在这样的背景下应运而生。协同过滤技术是个性化推荐技术最为核心的技术之一,也是目前应用最为广泛和成功的技术。本文主要研究的是基于用户的协同过滤推荐算法的实现。 【关键词】:协同过滤,相似度,个性化推荐 1.电子商务个性化推荐技术 1.1个性化推荐技术 电子商务对传统的商务交易产生了革命性的变化,从而要求“以产品为中心”向“面向客户”、“以客户为中心”的新的商业模式的转变,要求电子商务网站按客户群划分产品,围绕客户进行服务,为客户提供所需要的东西,所以对每个顾客提供个性化的服务成为必要。在这种背景下,推荐系统(Recommender System)应运而生,它是根据用户个人的喜好、习惯来向其推荐信息、商品的程序。电子商务网站可以使用推荐系统分析客户的消费偏好,向每个客户具有针对性地推荐产品,帮助用户从庞大的商品目录中挑选真正适合自己需要的商品,尽可能为每个顾客提供个性化的服务。 个性化推荐(personalized recommendation)技术通过研究不同用户的兴趣,主动为用户推荐最需要的资源,从而更好地解决互联网信息日益庞大与用户需求之间的矛盾。目前,推荐技术被广泛应用到电子商务、数字图书馆、新闻网站等系统中。因此,各种适用于推荐系统的技术应运而生,如协同过滤技(CF)、bayesian网技术、聚类分析技术、关联规则技术、神经网络技术和图模型技术等,其中,协同过滤是应用最为广泛的个性化推荐技术。协同过滤推荐又分为基于模型(Model-based)的协同过滤和基于用户的协同过滤。后来,sarwr 教授在2001年提出基于项目的协同过滤算法 1.2协同过滤 协同过滤推荐技术是用“相似统计”的方法发现具有相似偏好或是兴趣特征的“相邻用户”。“协同过滤”的思想最早由美国明尼苏达州大学的学者Paul Resnick在1994年,发表的《GroupLens: AnOpen Architecture for Collaborative Filtering of Netnews》一文中提出的。迄今为止, 协同过滤是在个性化推荐系统中应用最广泛和最被人们所认可的一种推荐技术。 协同过滤的基本原理是:根据用户对信息产品的评分情况,对其他用户进行检索, 找出与该用户“品味”相似的一小群人, 也就是“邻居”,然后再基于这些相似性进行信息产品评分预测,产生Top-N的推荐结果。

基于协同过滤算法的推荐系统设计

基于协同过滤算法的推荐系统设计 一、绪论: 长尾理论。 二、协同过滤算法的定义: (一)预定义: 要实现协同过滤算法,需要做以下的预定义: 1、邻域: 给定集合X,映射U:X→P(P(X))(其中P(P(X))是X的幂集的幂集),U 将X中的点x映射到X的子集族U(x)),称U(x)是X的邻域系以及U(x)中的元 素(即X的子集)为点x的邻域,当且仅当U满足以下的邻域公理: U1:若集合A∈U(x),则x∈A。 U2:若集合A,B∈U(x),则A∩B∈U(x)。 U3:若集合A∈U(x),且A ?B ?X,则B∈U(x)。 U4:若集合A∈U(x),则存在集合B∈U(x),使B ?A,且?y∈B,B∈U(y)。 2、皮尔逊相关系数: 皮尔逊相关系数是一种度量两个变量相似程度的一种方法,若变量X和变量Y线性相关,则其皮尔逊系数的z值域为[-1,1]。系数值为1表示完全正相关; 系数值为-1表示完全负相关。 3、曼哈顿距离: 4、欧几里得距离: 5、余弦相似度: 6、 Jaccard相似度: (二)基于用户的协同过滤算法: 在实际应用中,如果一个用户C需要得到个性化的推荐,那么根据这个用户过去喜欢过的物品,计算出与这个顾客有着相似偏好的用户,继而把这些相似的用户所喜欢的、且C没有喜好过的物品推荐给用户C,这就是基于用户的协同过滤算法的主要思路。 该方法主要包括两个步骤: 1、寻找和查询用户具有相似偏好的用户群体。 2、找到这些用户所喜欢的物品集合,选取其中用户最为感兴趣的子集推荐给 查询用户。 在步骤1中,我们使用相似度来度量两个用户之间的相似度。相似度的计算方法可以调用预定义中的皮尔逊相似度、余弦相似度、曼哈顿距离、欧几里得距离和jaccard相似度。记用户A和用户B之间的相似度为sim 在得到用户的相似度之后,我们需要给查询用户返回根据其兴趣度的T opK结果,我们用如下公式衡量用户的兴趣度: 公式 其中S(u,K)代表相似用户集中的前K个用户,N(i)代表喜欢物品i的用户集合。 R代表用户u对物品i的感兴趣程度。 下图代表基于用户协同过滤算法的主要流程: (三)基于物品的协同过滤算法: 在基于用户的协同过滤算法的基础上,又发展出了基于物品的协同过滤算法。 这主要是因为在一般的网站应用中,用户的数量往往远远大于物品的数量,这就造 成了计算用户之间的相似度成为一件非常耗时的工作:以余弦相似度为例。设一个

基于项目的协同过滤推荐算法

基于项目的协同过滤推荐算法采用统计技术来寻找与目标项目有相似评分的邻居项目,再基于邻居项目的评分数据预测目标项目的评分,从而选择预测评分最高的前若干项推荐给目标用户。整个算法基于用户一项目评分矩阵R ( m, n}进行。R( m, n}是一个mxn阶矩阵,m行表示m个用户,n列表示n个项目,矩阵,表示用户i对项目j的评分数据。 元素值R i ,j 一般情况下,网站用户数量增长比较快,而待评价项目比较稳定,因此计算出的项目相似度矩阵的更新频率比较低,所以此矩阵可以使用较长时间。基于项目的协同过滤推荐算法认为,用户对不同项目的评分具有相似性,先计算项目之间的相似性,当需要估计用户对某一项目的评分时,可以参照用户对其他项目的评分来进行判断[11]。 和基于用户的协同过滤推荐算法相似,该算法也分为三步: (1)建立用户—项目矩阵 M表示有m个用户,n为项目数量,矩阵中的R ij表示用户i对项目j的评价,可选取一定的范围数字表示。 (2)获取目标用户邻居 根据用户—项目矩阵,计算目标项目与其他项目的相似度,获得目标项目的项目邻居列表,其中,项目的相似度可根据上文提到的余弦相似性,皮尔森相似系数以及修正的余弦相似系数计算出来,从而采用TOP-N算法产生最近邻居集[2]。 (3)进行推荐 根据邻居对项目的评分来预测目标用户对项目的评分,可采用下面的一个公式:

U为邻居用户集,sim(T,n)表示目标项目与最近邻居的相似性,Ru, n表示用户u 对项目n 的评分; RT 和Rn 分别表示对项目T 和项目n的平均评分[11]。 基于项目的协同过滤推荐技术可以对基于一些复杂的,难以表达的概念(信息质量、品位)进行过滤,同时也可以推荐一些新特性。 但是,由于大型电子商务站点用户及商品项的数量庞大且不断增加,使得R ( m, n}成为高维矩阵,’用户给予评分的商品项很少,通常在1%以下[3j,导致R ( m, n}中的评分数据极端稀疏。因此,基于项目的协同过滤推荐算法面临严峻的用户评分数据稀疏性的挑战[m。文献[8了在其提出的优化算法中考虑到了项目的类别相似性,但只涉及项目的第1层分类,而未能扩展到实际商品在多类别多层次上的相似性。本文提出了计算项目类别相似性的方法,并将其与传统的项目评分相似性相结合,进一步求得项目综合相似性,从而提高最近邻居项目的搜寻准确度,同时也缓解了用户评分数据稀疏性问题。 2 基于项目的协同过滤推荐算法的不足 对于项目i、j之间的评分相似性simR(i,j),基于项目的协同过滤推荐算法主要采用以下3种方法进行度量:

基于协同过滤算法的电影推荐系统

高级数据挖掘期末大作业基于协同过滤算法的电影推荐系统

本电影推荐系统中运用的推荐算法是基于协同过滤算法(Collaborative Filtering Recommendation)。协同过滤是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同,协同过滤分析用户兴趣,在用户群中找到指定用户的相似(兴趣)用户,综合这些相似用户对某一信息的评价,形成系统对该指定用户对此信息的喜好程度预测。 电影推荐系统中引用了Apache Mahout提供的一个协同过滤算法的推荐引擎Taste,它实现了最基本的基于用户和基于内容的推荐算法,并提供了扩展接口,使用户方便的定义和实现自己的推荐算法。 电影推荐系统是基于用户的推荐系统,即当用户对某些电影评分之后,系统根据用户对电影评分的分值,判断用户的兴趣,先运用UserSimilarity计算用户间的相似度.UserNeighborhood根据用户相似度找到与该用户口味相似的邻居,最后由Recommender提供推荐个该用户可能感兴趣的电影详细信息。将用户评过分的电影信息和推荐给该用户的电影信息显示在网页结果页中,推荐完成。 一、Taste 介绍 Taste是Apache Mahout 提供的一个个性化推荐引擎的高效实现,该引擎基于java实现,可扩展性强,同时在mahout中对一些推荐算法进行了MapReduce 编程模式转化,从而可以利用hadoop的分布式架构,提高推荐算法的性能。 在版本中的Taste,实现了多种推荐算法,其中有最基本的基于用户的和基于内容的推荐算法,也有比较高效的SlopeOne算法,以及处于研究阶段的基于SVD和线性插值的算法,同时Taste还提供了扩展接口,用于定制化开发基于内容或基于模型的个性化推荐算法。 Taste 不仅仅适用于Java 应用程序,还可以作为内部服务器的一个组件以HTTP 和Web Service 的形式向外界提供推荐的逻辑。Taste 的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。 下图展示了构成Taste的核心组件:

相关文档
最新文档