您好,登錄后才能下訂單哦!
最近在看《集體智慧編程》,相比其他機(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ū)用戶評(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ì)本站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。