概述
定義
物理意義
皮爾森距離
機器學習中的應用
代碼實現
概述
皮爾森相關系數也稱皮爾森積矩相關系數(Pearson product-moment correlation coefficient) ,是一種線性相關系數,是最常用的一種相關系數。記為r,用來反映兩個變量X和Y的線性相關程度,r值介於-1到1之間,絕對值越大表明相關性越強。
定義
總體相關系數ρ定義為兩個變量X、Y之間的協方差和兩者標准差乘積的比值,如下:
估算樣本的協方差和標准差,可得到樣本相關系數(即樣本皮爾森相關系數),常用r表示:
r還可以由(Xi,Yi)樣本點的標准分數均值估計得到與上式等價的表達式:
其中為Xi樣本的標准分數、樣本均值和樣本標准差,n為樣本數量。
物理意義
皮爾森相關系數反映了兩個變量的線性相關性的強弱程度,r的絕對值越大說明相關性越強。
當r>0時,表明兩個變量正相關,即一個變量值越大則另一個變量值也會越大;
當r<0時,表明兩個變量負相關,即一個變量值越大則另一個變量值反而會越小;
當r=0時,表明兩個變量不是線性相關的(注意只是非線性相關),但是可能存在其他方式的相關性(比如曲線方式);
當r=1和-1時,意味着兩個變量X和Y可以很好的由直線方程來描述,所有樣本點都很好的落在一條直線上。
皮爾森距離
通過皮爾森系數定義:
皮爾森系數范圍為[-1,1],因此皮爾森距離范圍為[0,2]。
機器學習中的應用
皮爾森(pearson)相關系數、斯皮爾曼(spearman)相關系數和肯德爾(kendall)相關系數並稱為統計學三大相關系數。其中,spearman和kendall屬於等級相關系數亦稱為“秩相關系數”,是反映等級相關程度的統計分析指標。pearson是用來反應倆變量之間相似程度的統計量,在機器學習中可以用來計算特征與類別間的相似度,即可判斷所提取到的特征和類別是正相關、負相關還是沒有相關程度。
Pearson相關系數的計算方法有三種形式,如下:
皮爾森相關系數是衡量線性關聯性的程度,p的一個幾何解釋是其代表兩個變量的取值根據均值集中后構成的向量之間夾角的余弦。
代碼實現
python實現公式3的代碼:
def pearson(vector1, vector2):
n = len(vector1)
#simple sums
sum1 = sum(float(vector1[i]) for i in range(n))
sum2 = sum(float(vector2[i]) for i in range(n))
#sum up the squares
sum1_pow = sum([pow(v, 2.0) for v in vector1])
sum2_pow = sum([pow(v, 2.0) for v in vector2])
#sum up the products
p_sum = sum([vector1[i]*vector2[i] for i in range(n)])
#分子num,分母den
num = p_sum - (sum1*sum2/n)
den = math.sqrt((sum1_pow-pow(sum1, 2)/n)*(sum2_pow-pow(sum2, 2)/n))
if den == 0:
return 0.0
return num/den
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
python實現公式1的代碼:
# 計算特征和類的平均值
def calcMean(x,y):
sum_x = sum(x)
sum_y = sum(y)
n = len(x)
x_mean = float(sum_x+0.0)/n
y_mean = float(sum_y+0.0)/n
return x_mean,y_mean
# 計算Pearson系數
def calcPearson(x,y):
x_mean,y_mean = calcMean(x,y) # 計算x,y向量平均值
n = len(x)
sumTop = 0.0
sumBottom = 0.0
x_pow = 0.0
y_pow = 0.0
for i in range(n):
sumTop += (x[i]-x_mean)*(y[i]-y_mean)
for i in range(n):
x_pow += math.pow(x[i]-x_mean,2)
for i in range(n):
y_pow += math.pow(y[i]-y_mean,2)
sumBottom = math.sqrt(x_pow*y_pow)
p = sumTop/sumBottom
return p
# 計算每個特征的Pearson系數,返回數組
def calcAttribute(dataSet):
prr = []
n,m = shape(dataSet) # 獲取數據集行數和列數
x = [0] * n # 初始化特征x和類別y向量
y = [0] * n
for i in range(n): # 得到類向量
y[i] = dataSet[i][m-1]
for j in range(m-1): # 獲取每個特征的向量,並計算Pearson系數,存入到列表中
for k in range(n):
x[k] = dataSet[k][j]
prr.append(calcSpearman(x,y))
return prr
————————————————
版權聲明:本文為CSDN博主「chao2016」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/chao2016/article/details/80917579
