本文由larrylgq編寫,轉載請註明出處:http://blog.csdn.net/larrylgq/article/details/7395261
作者:呂桂強
郵箱:larry.lv.word@gmail.com
相關係數的值介於–1與+1之間,即–1≤r≤+1。其性質如下:
- 當r>0時,表示兩變數正相關,r<0時,兩變數為負相關。
- 當|r|=1時,表示兩變數為完全線性相關,即為函數關係。
- 當r=0時,表示兩變數間無線性相關關係。
- 當0<|r|<1時,表示兩變數存在一定程度的線性相關。且|r|越接近1,兩變數間線性關係越密切;|r|越接近於0,表示兩變數的線性相關越弱。
- 一般可按三級劃分:|r|<0.4為低度線性相關;0.4≤|r|<0.7為顯著性相關;0.7≤|r|<1為高度線性相關。
上代碼:
package com.Social.cbra.praron2;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", 434d);similarity1.rating_map.put("2", 7d);similarity1.rating_map.put("3", 23d);Similarity similarity2 = new Similarity();similarity2.rating_map.put("1", 6d);similarity2.rating_map.put("2", 2d);similarity2.rating_map.put("3", 6d);logger.info("" + similarity1.getsimilarity_bydim(similarity2));}public double getsimilarity_bydim(Similarity u) {double sim = 0d;double common_items_len = 0;double this_sum = 0d;double u_sum = 0d;double this_sum_sq = 0d;double u_sum_sq = 0d;double p_sum = 0d;Iterator<String> rating_map_iterator = this.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)){double this_grade = this.rating_map.get(rating_map_iterator_key);double u_grade = u.rating_map.get(u_rating_map_iterator_key);//評分求和//平方和//乘積和this_sum += this_grade;u_sum += u_grade;this_sum_sq += Math.pow(this_grade, 2);u_sum_sq += Math.pow(u_grade, 2);p_sum += this_grade * u_grade;common_items_len++;}}}//如果等於零則無相同條目,返回sim=0即可if(common_items_len > 0){logger.info("common_items_len:"+common_items_len);logger.info("p_sum:"+p_sum);logger.info("this_sum:"+this_sum);logger.info("u_sum:"+u_sum);double num = common_items_len * p_sum - this_sum * u_sum;double den = Math.sqrt((common_items_len * this_sum_sq - Math.pow(this_sum, 2)) * (common_items_len * u_sum_sq - Math.pow(u_sum, 2)));logger.info("" + num + ":" + den);sim = (den == 0) ? 1 : num / den;}//如果等於零則無相同條目,返回sim=0即可return sim;}}