基于用户的协同过滤推荐皮尔遜做用户间相似度计算。出现的问题是:邻居用户个数越多MAE反而越大。跟踪后发现原因是那些共同评分个数为1的用户间的相似度为1,囲同评分越多的都小于1.
理论上邻居用户越多,MAE应该越小怎样解决共同评分个数只有1个的用户的相似度为1的问题,才能实验得到理想的效果求众大牛不吝赐教!
一:什么是KNN算法
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别
即使不知道未知电影属于哪种类型,我們也可以通过某种方法计算出来如下图
现在我们得到了样本集中与未知电影的距离,按照距离的递增顺序可以找到k个距离最近邻的电影,假定k=3则三个最靠近的电影是和he is not realy into Dudes,Beautiful women, California man kNN算法按照距离最近邻的三部电影类型决定未知电影类型,这三部都是爱情片所以未知电影的类型也為爱情片
二:KNN算法的一般流程
使用方法:进入kNN.py文件所在的目录,输入Python依次输入
在实际使用中,有幾个问题是值得注意的:
1、K值的选取选多大合适呢?
2、计算两者间距离用哪种距离会更好呢(欧几里得距离等等几个)?
3、计算量太夶怎么办
4、假设样本中,类型分布非常不均比如动作片电影有200部,但是爱情片电影只有20部这样计算起来,即使不是动作片电影也會因为动作片样本太多,导致k个最近邻邻居里有不少动作片电影这样该怎么办呢?
没有万能的算法模型只有最优的算法,要懂得合适利用算法
已知LiI的晶体与NaCI晶体结构相同实驗测得Li+与I?最邻近的距离是3.02(埃,1=0.1nm)假定I-和Li+都是刚性球。
(1)欲计算得到I-、Li+的近似半径时你还必须再做什么假定?
(2)计算I-、Li+的近似半径
(3)若用另一种方法测得Li+的半径为0.60~0.68,试验证你的假定是否正确
(1)欲求得I-和Li+的近似半径,除假设I-与Li+是刚性球外还需要再假定两刚性球间彼此相切,这才可将Li+与I-的离子看成是两离子半径之和 (2)根据NaCl的晶体结构即可建立如图所示的数学模型。設图中大圆表示I-其半径为r-,小圆为Li+其半径r+,则有如下关系: BC=2r ③ ∴I-的近似半径为2.14 ?、Li+的近似半径为0.88 ?。 (3)r+>0.60~0.68 ? 說明可将Li+、I-看成刚性球但实际不相切,因为电子之间互相排斥致使两离子半径之和小于它们之间的理论距离。 |