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

上代码:

 
  
  1. package com.Social.cbra; 
  2.   
  3.   
  4. import java.util.HashMap; 
  5. import java.util.Iterator; 
  6. import java.util.Map; 
  7. import java.util.logging.Logger; 
  8.   
  9. /** 
  10.  *  
  11.  * @author larry 
  12.  *  
  13.  */ 
  14. public class Similarity { 
  15.     static Logger logger = Logger.getLogger(Similarity.class.getName()); 
  16.     Map<String, Double> rating_map = new HashMap<String, Double>(); 
  17.   
  18.     /** 
  19.      * @param args 
  20.      */ 
  21.     public static void main(String[] args) { 
  22.         Similarity similarity1 = new Similarity(); 
  23.         similarity1.rating_map.put("1", 1d); 
  24.         similarity1.rating_map.put("2", 1d); 
  25.         similarity1.rating_map.put("3", 1d); 
  26.         Similarity similarity2 = new Similarity(); 
  27.         similarity2.rating_map.put("1", 1d); 
  28.         similarity2.rating_map.put("2", 1d); 
  29.         similarity2.rating_map.put("3", 1d); 
  30.         logger.info("" + similarity1.getsimilarity_bydim(similarity2)); 
  31.         //System.out.println(rating_map.size()); 
  32.     } 
  33.   
  34.     public double getsimilarity_bydim(Similarity u) { 
  35.         double sim = 0d; 
  36.         double common_items = 0
  37.           
  38.         Iterator<String> rating_map_iterator = rating_map.keySet().iterator(); 
  39.         while(rating_map_iterator.hasNext()){ 
  40.             String rating_map_iterator_key = rating_map_iterator.next(); 
  41.             Iterator<String> u_rating_map_iterator = u.rating_map.keySet().iterator(); 
  42.             while(u_rating_map_iterator.hasNext()){ 
  43.                 String u_rating_map_iterator_key = u_rating_map_iterator.next(); 
  44.                 if(rating_map_iterator_key.equals(u_rating_map_iterator_key)){ 
  45.                     //相似度计数加一 
  46.                     //求差值的平方和 
  47.                     common_items++; 
  48.                     sim += Math.pow((u.rating_map.get(u_rating_map_iterator_key) - this.rating_map.get(rating_map_iterator_key)), 2);            
  49.                 } 
  50.             } 
  51.         } 
  52.           
  53.         //如果等于零则无相同条目,返回sim=0即可 
  54.         if(common_items > 0){ 
  55.             //相似度的范围在0-1之间//tanh取值范围-1到1 
  56.             //0表示完全不相似 
  57.             //1表示完全相似 
  58.             //求平均后开跟 
  59.             //乘上相同的数量占最大可能相同的数量的比重 
  60.             sim = Math.sqrt(sim/common_items); 
  61.             sim = 1.0d - Math.tanh(sim); 
  62.             int max_common_items = Math.min(rating_map.size(), u.rating_map.size()); 
  63.             sim = sim * (common_items/max_common_items); 
  64.         } 
  65.         return sim; 
  66.     } 
  67.   

转自:http://www.itivy.com/java/archive/2012/3/13/634672518556702882.html