什么叫“注重用户体验呢”?
其实很简单。很俗的讲法--当一个用户上到你的网站的时候,你要让用户感到用的很爽,并且下次还
想来。然而“并且下次还想来“却是很多网站都想做到的东西。
众多web2.0网站推出友邻,同好,小组,同城等功能。其实很多网站
都是基于用户注册时注册的资料来对用户进行的分组。使用数据库的数 据配对进行的用户分类。例如一个技术网站,你注册的时候填写了上海 | <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> |
市,爱好donet. 则下次你登录的时候系统自动会把你分类到donet技术类。并会把donet技术类的人员随机推荐5-10个建议你加入其友邻。
其实上述的做法有时是最有效而且。精度往往很高。(虽然没有理论依据).
然而随着数据量的增大。这样做带来了一个很大的缺点---效率低下。百万级的数据使你无法瞬间完成这种相似用户的推荐。这也是一个中小型web2.0网站面临的难题。
拿CSDN的读书频道为例。即将推出的是一个书友会功能。其中每个用户都能对图书进行评分。目前设置最高为5分。书友会的宗旨
--- “以书会友”.
反过来讲。既然以书会友,那系统最关心的事情是帮读者找朋友。一般读者都很懒。其实我也很懒。我上有些电影网站。假如他不推荐我一些兴趣爱好和我相同的用户我肯定不自己加他们。所以这样系统有个相似用户的推荐确实很重要。
刚开始我尝试了采用普通程序进行批量查询。逻辑异常简单。如用户A对10本书的里的5本书打了3分以上。另外5本是2分以下。包含2分。则我会使用程序把对这些书也打打3分以上的用户取出来,取他们打分最高的书并且刨去用户A打分最低的5本书。然后降排序取前10本。最后取出拥有这10本打分(超过3分)最多的5本用户。 很幸运的是。系统测试的时候这个算法往往很准。不幸运的是。当测试数据到了10万以上的时候系统慢的想自杀。
于是我开始尝试使用一些别的办法。
探索中走弯路的不可避免的/
我首先使用了最简单而且传统的 方法 --- 余弦相似性。
为了容易看懂。我画个图
book1 book2 book3 book4 book5
user1 2 2 1 5
user 2 3 3 0 5
user3 3 4 5
user4 4 3
user5 5 3
用此来举个例。 上面一共5本书。其中有5个用户对此进行了打分,分值如上图所示。
其中最高5分。
这样看来整个数据视图变成了一个矩阵。
用户和图书的关系可以看成一个向量。如user1的向量就是(2,2,0,1,5)(注:其中没有打分的
我们假设为0)
于是假设开始。
1。假如2个用户之间的向量夹角为0。我们可以认为他们是完全相似的用户。(实际中很少这个情况
)
2. 假如2个用户之间向量夹角都不为0。则夹角越小用户的相似性越大。
经过我翻了一些资料。于是使用 向量的余弦来计算用户相似性。
假设用户向量使用 D来表示.我们要求的是和user1 最相似的用户.于是接下来的就是要计算 Duser1
分别和 user2,user3,user4,user5的相似性。 ----假设用sum(userx,usery)表示两个用户的相似性.
通过计算 (保留2位小数)
user1:user2 =0.81
user1:user3 =0.34
user1:user4 =0.79
user1:user5 =0.74
这样可以看出.user2 和use1的相似性是最大的。 使用这个方法为我解决了10万数据的效率问题
后来我发现其实里面的漏洞很大...未完待续.....
附:
余弦公式: 向量的内积/向量模的乘积