JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解
最近在看《集體智慧編程》,相比其他機(jī)器學(xué)習(xí)的書(shū)籍,這本書(shū)有許多案例,更貼近實(shí)際,而且也很適合我們這種準(zhǔn)備學(xué)習(xí)machinelearning的小白。
這本書(shū)我覺(jué)得不足之處在于,里面沒(méi)有對(duì)算法的公式作講解,而是直接用代碼去實(shí)現(xiàn),所以給想具體了解該算法帶來(lái)了不便,所以想寫(xiě)幾篇文章來(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)自《集體智慧編程》一書(shū)。代碼如下:
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à)
*
* 以《集體智慧編程》一書(shū)用戶(hù)評(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ì)本站的支持!
- Java數(shù)據(jù)結(jié)構(gòu)之稀疏矩陣定義與用法示例
- Java基于余弦方法實(shí)現(xiàn)的計(jì)算相似度算法示例
- Android Java實(shí)現(xiàn)余弦匹配算法示例代碼
- java字符串相似度算法
- Java實(shí)現(xiàn)的求逆矩陣算法示例
- java實(shí)現(xiàn)任意矩陣Strassen算法
- Java矩陣連乘問(wèn)題(動(dòng)態(tài)規(guī)劃)算法實(shí)例分析
- Java實(shí)現(xiàn)輸出回環(huán)數(shù)(螺旋矩陣)的方法示例
- java實(shí)現(xiàn)的n*n矩陣求值及求逆矩陣算法示例
- Java編程實(shí)現(xiàn)鄰接矩陣表示稠密圖代碼示例
- Java實(shí)現(xiàn)的計(jì)算稀疏矩陣余弦相似度示例
相關(guān)文章
Java Spring MVC 上傳下載文件配置及controller方法詳解
這篇文章主要介紹了Java Spring MVC 上傳下載文件配置及controller方法詳解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
SpringBoot整合FTP實(shí)現(xiàn)文件傳輸?shù)牟襟E
這篇文章主要給大家介紹了SpringBoot整合FTP實(shí)現(xiàn)文件傳輸?shù)牟襟E,文中的流程步驟和代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-11-11
java8 利用reduce實(shí)現(xiàn)將列表中的多個(gè)元素的屬性求和并返回操作
這篇文章主要介紹了java8 利用reduce實(shí)現(xiàn)將列表中的多個(gè)元素的屬性求和并返回操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
SpringBoot通過(guò)yml和xml文件配置日志輸出方法
這篇文章主要介紹了SpringBoot通過(guò)yml和xml文件配置日志輸出方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
詳解SpringBoot Mongo 自增長(zhǎng)ID有序規(guī)則
本文主要介紹springboot基于mongodb有序id生成,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
SpringBoot + Spring Security 基本使用及個(gè)性化登錄配置詳解
這篇文章主要介紹了SpringBoot + Spring Security 基本使用及個(gè)性化登錄配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Java8新特性之深入解析日期和時(shí)間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java8新特性之深入解析日期和時(shí)間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-06-06
MyBatis之foreach標(biāo)簽的用法及多種循環(huán)問(wèn)題
這篇文章主要介紹了MyBatis之foreach標(biāo)簽的用法及多種循環(huán)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

