標籤:
在學到相關性度量的時候,有一個係數用來度量相似性(距離),這個係數叫做皮爾遜係數,事實上在統計學的時候就已經學過了,僅僅是當時不知道還能用到機器學習中來,這更加讓我認為機器學習離不開統計學了。
皮爾遜相關係數——Pearson correlation coefficient,用於度量兩個變數之間的相關性,其值介於-1與1之間,值越大則說明相關性越強。
兩個變數之間的皮爾遜相關係數定義為兩個變數之間的共變數和標準差的商:
因為μX = E(X), σX2 = E[(X ? E(X))2] = E(X2) ? E2(X),Y也類似, 而且
-
故相關係數也能夠表示成
-
對於樣本皮爾遜相關係數:
-
當中E是數學期望,cov表示共變數。
(公式摘自:http://zh.wikipedia.org/wiki/%E7%9A%AE%E5%B0%94%E9%80%8A%E7%A7%AF%E7%9F%A9%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0)
比方,依據上面的公式計算兩個使用者的Pearson 相關性:
/**
* 皮爾遜Pearson Correlation
* 對使用者X,Y sum^2X:X的全部評分項之平方和sum^2Y:Y的全部評分項之平方和
* sumXY:sumX 、sumY的交集之和,即X、Y都評價了的項之和
* 相關性:sumXY / sqrt(sumX^2 * sumY^2)
* 兩個變數之間的皮爾遜相關係數定義為兩個變數之間的共變數和標準差的商:
* p(X,Y) = (xi - avg(x))(yi - avg(y)) / sqrt((xi - avg(x))^2) * sqrt((yi - avg(y))^2)
*皮爾遜距離度量的是兩個變數X和Y之間的距離:
* d(X,Y) =1 -p(X,Y)/(n -1) * sum((Xi - avg(X))/p(X) * (Yi-avg(Y)))/p(Y)
*
*
*/
public double userSimilarity(int userid1, int userid2) throws MyException {// if(userid1 == userid2)// throw new MyException("同一使用者不能比較類似度。"); List<Rating> list1 = null; List<Rating> list2 = null; double avgX = 0.0; double avgY = 0.0; try { list1 = st.getRatings(userid1); list2 = st.getRatings(userid2); avgX = st.getAvgRatings(userid1); avgY = st.getAvgRatings(userid2); } catch (SQLException e) { e.printStackTrace(); } double sumXY = 0, sumX = 0, sumY = 0; for (int i = 0; i < list1.size(); i++) { double rating1 = list1.get(i).getRating(); sumX += (rating1 - avgX) * (rating1 - avgX); } for (int j = 0; j < list2.size(); j++) { double rating2 = list2.get(j).getRating(); sumY += (rating2 - avgY) * (rating2 - avgY); } for (int i = 0; i < list1.size(); i++) { double rating1 = list1.get(i).getRating(); for (int j = 0; j < list2.size(); j++) { double rating2 = list2.get(j).getRating(); if (list1.get(i).getItemid() == list2.get(j).getItemid()) { sumXY += (rating1 - avgX) * (rating2 - avgY); } } } return sumXY / (Math.sqrt(sumX * sumY)); }
機器學習筆記——皮爾遜相關係數