社会化推荐系统浅析-欧几里德距离的java实现

欧几里德距离是一个简单的相似度评价方法,返回0-1的值代表互相之间的相似度,1为完全相似

上代码:

package com.Social.cbra;


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Logger;

/**
 * 
 * @author larry
 * 
 */
public class Similarity {
	static Logger logger = Logger.getLogger(Similarity.class.getName());
	Map<String, Double> rating_map = new HashMap<String, Double>();

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Similarity similarity1 = new Similarity();
		similarity1.rating_map.put("1", 1d);
		similarity1.rating_map.put("2", 1d);
		similarity1.rating_map.put("3", 1d);
		Similarity similarity2 = new Similarity();
		similarity2.rating_map.put("1", 1d);
		similarity2.rating_map.put("2", 1d);
		similarity2.rating_map.put("3", 1d);
		logger.info("" + similarity1.getsimilarity_bydim(similarity2));
		//System.out.println(rating_map.size());
	}

	public double getsimilarity_bydim(Similarity u) {
		double sim = 0d;
		double common_items = 0;
		
		Iterator<String> rating_map_iterator = rating_map.keySet().iterator();
		while(rating_map_iterator.hasNext()){
			String rating_map_iterator_key = rating_map_iterator.next();
			Iterator<String> u_rating_map_iterator = u.rating_map.keySet().iterator();
			while(u_rating_map_iterator.hasNext()){
				String u_rating_map_iterator_key = u_rating_map_iterator.next();
				if(rating_map_iterator_key.equals(u_rating_map_iterator_key)){
					//相似度计数加一
					//求差值的平方和
					common_items++;
					sim += Math.pow((u.rating_map.get(u_rating_map_iterator_key) - this.rating_map.get(rating_map_iterator_key)), 2);			
				}
			}
		}
		
		//如果等于零则无相同条目,返回sim=0即可
		if(common_items > 0){
			//相似度的范围在0-1之间//tanh取值范围-1到1
			//0表示完全不相似
			//1表示完全相似
			//求平均后开跟
			//乘上相同的数量占最大可能相同的数量的比重
			sim = Math.sqrt(sim/common_items);
			sim = 1.0d - Math.tanh(sim);
			int max_common_items = Math.min(rating_map.size(), u.rating_map.size());
			sim = sim * (common_items/max_common_items);
		}
		return sim;
	}

}



  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值