在这些算法中间并没有解决我的问题
我希望达到的效果是
在查询出相关产品的时候能够生成一张 线性图标
这样能够直观的描述 产品 在我的产品库的位置
以及能够直观的描述出热点产品 能描述 这些热点产品以及 其短期内和其他热点产品的关联
主要我想的是 我想在一张 向量图中间 来标识产品 这个产品之间的关联 以及其他的什么
可以有不同的字段来标识
这样我希望 通过描述出 这些 查询产品 与产品的相关度的 算法
来帮助我实现绘画出 这张图
GenericUserBasedRecommender
这个是基于用户之间的 相识度来推荐产品的 一种算法
基于UserSimilarity UserNeighborhood这两个实现的一种算法
想发的基础是说
通过建立一种人与人之间的相似度物品与物品之间的相似度
UserSimilarity:用于定义两个用户之间的相似度的界面
ItemSimilarity:用于定义两个项目之间的相似度的界面
//PearsonCorrelationSimilarity:基于皮尔逊相关系数计算相似度
//EuclideanDistanceSimilarity:基于欧几里德距离计算相似度
//TanimotoCoefficientSimilarity:基于Tanimoto 系数计算相似度
//UncerteredCosineSimilarity:计算 Cosine相似度
然后
UserNeighborhood:用于计算相似用户邻近度的界面
//NearestNUserNeighborhood:对每个用户取固定数量 N的最近邻居
//ThresholdUserNeighborhood:对每个用户基于一定的限制,取落在相似度门限内的所有用户为邻居。
最后 GenericUserBasedRecommender
这个推荐的原理 是说 通过 UserNeighborhood 算出于当前用户类似的用户
然后遍历 这些 类似用户的产品 (排除掉自己已经 存在(投票啊 购买啊什么的 排除掉自己的))
然后通过 这里有一个小技巧 使用了一个 PriorityQueue
这个queue 是一个队列
这个队列 判断 如果遍历到的产品 大于这个队列中间 最小的值 就插入队列 然后队列中最小的 出列
最终返回一个 list 这个list 就是推荐给 这个用户的相关的产品
类似代码为
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood = newNearestNUserNeighborhood(2,similarity, model);
Recommenderrecommender = new GenericUserBasedRecommender(model,neighborhood, similarity);
List<RecommendedItem> recommendations =recommender.recommend(1, 2);
for (RecommendedItem recommendation :recommendations) {
System.out.println(recommendation);
}
SlopeOneRecommender
相关介绍
http://www.cppblog.com/AutomateProgram/archive/2010/07/19/120790.html
http://www.cnblogs.com/breezedeus/archive/2011/03/11/1981781.html
代码类似:
DataModelmodel=new GenericDataModel(preferences);//DataModel的建立 DiffStoragediffStorage = new MemoryDiffStorage(model, Weighting.UNWEIGHTED, Long.MAX_VALUE);
Recommender recommenderdef = new SlopeOneRecommender(model,Weighting.UNWEIGHTED, Weighting.UNWEIGHTED, diffStorage);
算法基础
皮尔逊相关系数
即相关分析中的相关系数r,分别对X和Y基于自身总体标准化后计算空间向量的余弦夹角
皮尔逊相关系数是一种度量两个变量间相关程度的方法。它是一个介于 1 和 -1 之间的值,其中,1 表示变量完全正相关, 0 表示无关,-1 表示完全负相关。
Tanimoto 系数计算相似度
http://www.360doc.com/content/09/0203/14/96202_2448777.shtml
在这里Na代表用户a保存的所有链接数,Nb代表用户b保存的所有链接数,Nc则代表用户Na和Nb间共同拥有的链接数。譬如,如果我保存了10个链接,你保存了20个链接,我们共有的链接为5个,那么我们间的相似性为5/(10+20-5)=0.2。