欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解

 更新時(shí)間:2017年11月27日 14:42:15   作者:panjiao119  
這篇文章主要介紹了JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解,具有一定參考價(jià)值,需要的朋友可以了解下。

最近在看集體智慧編程,相比其他機(jī)器學(xué)習(xí)的書籍,這本書有許多案例,更貼近實(shí)際,而且也很適合我們這種準(zhǔn)備學(xué)習(xí)machinelearning的小白。

這本書我覺(jué)得不足之處在于,里面沒(méi)有對(duì)算法的公式作講解,而是直接用代碼去實(shí)現(xiàn),所以給想具體了解該算法帶來(lái)了不便,所以想寫幾篇文章來(lái)做具體的說(shuō)明。以下是第一篇,對(duì)皮爾遜相關(guān)系數(shù)作講解,并采用了自己比較熟悉的java語(yǔ)言做實(shí)現(xiàn)。

皮爾遜數(shù)學(xué)公式如下,來(lái)自維基百科。

其中,E是數(shù)學(xué)期望,cov表示協(xié)方差,\sigma_X和\sigma_Y是標(biāo)準(zhǔn)差。

化簡(jiǎn)后得:

皮爾遜相似度計(jì)算的算法還是很簡(jiǎn)單的,實(shí)現(xiàn)起來(lái)也不難。只要求變量X、Y、乘積XY,X的平方,Y的平方的和。我的代碼所使用的數(shù)據(jù)測(cè)試集來(lái)自集體智慧編程一書。代碼如下:

package pearsonCorrelationScore;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
 * @author shenchao
 *
 *     皮爾遜相關(guān)度評(píng)價(jià)
 *
 *     以《集體智慧編程》一書用戶評(píng)價(jià)相似度數(shù)據(jù)集做測(cè)試
 */
public class PearsonCorrelationScore {
	private Map<String, Map<String, double>> dataset = null;
	public PearsonCorrelationScore() {
		initDataSet();
	}
	/**
* 初始化數(shù)據(jù)集
*/
	private void initDataSet() {
		dataset = new HashMap<String, Map<String, double>>();
		// 初始化Lisa Rose 數(shù)據(jù)集
		Map<String, double> roseMap = new HashMap<String, double>();
		roseMap.put("Lady in the water", 2.5);
		roseMap.put("Snakes on a Plane", 3.5);
		roseMap.put("Just My Luck", 3.0);
		roseMap.put("Superman Returns", 3.5);
		roseMap.put("You, Me and Dupree", 2.5);
		roseMap.put("The Night Listener", 3.0);
		dataset.put("Lisa Rose", roseMap);
		// 初始化Jack Matthews 數(shù)據(jù)集
		Map<String, double> jackMap = new HashMap<String, double>();
		jackMap.put("Lady in the water", 3.0);
		jackMap.put("Snakes on a Plane", 4.0);
		jackMap.put("Superman Returns", 5.0);
		jackMap.put("You, Me and Dupree", 3.5);
		jackMap.put("The Night Listener", 3.0);
		dataset.put("Jack Matthews", jackMap);
		// 初始化Jack Matthews 數(shù)據(jù)集
		Map<String, double> geneMap = new HashMap<String, double>();
		geneMap.put("Lady in the water", 3.0);
		geneMap.put("Snakes on a Plane", 3.5);
		geneMap.put("Just My Luck", 1.5);
		geneMap.put("Superman Returns", 5.0);
		geneMap.put("You, Me and Dupree", 3.5);
		geneMap.put("The Night Listener", 3.0);
		dataset.put("Gene Seymour", geneMap);
	}
	public Map<String, Map<String, double>> getDataSet() {
		return dataset;
	}
	/**
* @param person1
*      name
* @param person2
*      name
* @return 皮爾遜相關(guān)度值
*/
	public double sim_pearson(String person1, String person2) {
		// 找出雙方都評(píng)論過(guò)的電影,(皮爾遜算法要求)
		List<String> list = new ArrayList<String>();
		for (Entry<String, double> p1 : dataset.get(person1).entrySet()) {
			if (dataset.get(person2).containsKey(p1.getKey())) {
				list.add(p1.getKey());
			}
		}
		double sumX = 0.0;
		double sumY = 0.0;
		double sumX_Sq = 0.0;
		double sumY_Sq = 0.0;
		double sumXY = 0.0;
		int N = list.size();
		for (String name : list) {
			Map<String, double> p1Map = dataset.get(person1);
			Map<String, double> p2Map = dataset.get(person2);
			sumX += p1Map.get(name);
			sumY += p2Map.get(name);
			sumX_Sq += Math.pow(p1Map.get(name), 2);
			sumY_Sq += Math.pow(p2Map.get(name), 2);
			sumXY += p1Map.get(name) * p2Map.get(name);
		}
		double numerator = sumXY - sumX * sumY / N;
		double denominator = Math.sqrt((sumX_Sq - sumX * sumX / N)
		* (sumY_Sq - sumY * sumY / N));
		// 分母不能為0
		if (denominator == 0) {
			return 0;
		}
		return numerator / denominator;
	}
	public static void main(String[] args) {
		PearsonCorrelationScore pearsonCorrelationScore = new PearsonCorrelationScore();
		System.out.println(pearsonCorrelationScore.sim_pearson("Lisa Rose",
		"Jack Matthews"));
	}
}

將各個(gè)測(cè)試集的數(shù)據(jù)反映到二維坐標(biāo)面中,如下所示:

上述程序求得的值實(shí)際上就為該直線的斜率。其斜率的區(qū)間在[-1,1]之間,其絕對(duì)值的大小反映了兩者相似度大小,斜率越大,相似度越大,當(dāng)相似度為1時(shí),該直線為一條對(duì)角線。

總結(jié)

以上就是本文關(guān)于JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例

    Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例

    本篇文章主要介紹了Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • jvm oom排查記錄剖析

    jvm oom排查記錄剖析

    這篇文章主要為大家介紹了jvm oom排查記錄剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java實(shí)現(xiàn)電影院訂票系統(tǒng)代碼

    Java實(shí)現(xiàn)電影院訂票系統(tǒng)代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)電影院訂票系統(tǒng)代碼,代碼實(shí)現(xiàn)了界面類登錄注冊(cè)類,用戶類等,具有一定參考價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • Java復(fù)合語(yǔ)句的使用方法詳解

    Java復(fù)合語(yǔ)句的使用方法詳解

    這篇文章主要介紹了Java編程中復(fù)合語(yǔ)句,結(jié)合相關(guān)的具體實(shí)例介紹了其用法,需要的朋友可以參考下
    2017-09-09
  • Spring裝配Bean教程之XML安裝配置bean詳解

    Spring裝配Bean教程之XML安裝配置bean詳解

    大家都知道spring有多重配置方式,基于XML,基于注解,基于java類的配置,其中基于XML是最強(qiáng)大的一種,下面這篇文章主要給大家介紹了關(guān)于Spring裝配Bean之XML安裝配置bean的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-10-10
  • Java concurrency之AtomicReference原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency之AtomicReference原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    AtomicReference是作用是對(duì)"對(duì)象"進(jìn)行原子操作。這篇文章主要介紹了Java concurrency之AtomicReference原子類,需要的朋友可以參考下
    2017-06-06
  • java多線程讀取多個(gè)文件的方法

    java多線程讀取多個(gè)文件的方法

    這篇文章主要為大家詳細(xì)介紹了java多線程讀取多個(gè)文件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Netty分布式pipeline管道傳播事件的邏輯總結(jié)分析

    Netty分布式pipeline管道傳播事件的邏輯總結(jié)分析

    這篇文章主要為大家介紹了Netty分布式pipeline管道傳播事件總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • SpringBoot整合RocketMQ批量發(fā)送消息的實(shí)現(xiàn)代碼

    SpringBoot整合RocketMQ批量發(fā)送消息的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringBoot整合RocketMQ批量發(fā)送消息的實(shí)現(xiàn),文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • java Future 接口使用方法詳解

    java Future 接口使用方法詳解

    這篇文章主要介紹了java Future 接口使用方法詳解,F(xiàn)uture接口是Java線程Future模式的實(shí)現(xiàn),可以來(lái)進(jìn)行異步計(jì)算的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評(píng)論