機器學習-迴歸中的相關度和R平方值

1. 皮爾遜相關係數(Pearson Correlation Coefficient)python

     1.1 衡量兩個值線性相關強度的量測試

     1.2 取值範圍[-1, 1]spa

            正相關:>0, 負相關:<0, 無相關:=0ssr

      1.3 要理解Pearson相關係數,首先要理解協方差(Covariance),協方差是一個反映兩個隨機變量相關程度的指標,若是一個變量跟隨着另外一個變量同時變大或者變小,那麼這兩個變量的協方差就是正值,反之相反,公式以下: blog

                            

 

             方差:utf-8

                            

             Pearson相關係數公式以下:ci

                            

                           

            注意:有了協方差,爲何還使用皮爾遜相關係數?雖然協方差能反映兩個隨機變量的相關程度(協方差大於0的時候表示二者正相關,小於0的時候表示二者負相關),可是協方差值的大小並不能很好地度量兩個隨機變量的關聯程度,例如,如今二維空間中分佈着一些數據,咱們想知道數據點座標X軸和Y軸的相關程度,若是X與Y的相關程度較小可是數據分佈的比較離散,這樣會致使求出的協方差值較大,用這個值來度量相關程度是不合理的。 
           爲了更好的度量兩個隨機變量的相關程度,引入了Pearson相關係數,其在協方差的基礎上除以了兩個隨機變量的標準.
it

2. 計算方法舉例:io

     x      yast

     1     10

     3     12

     8     24

     7     21

     9     34

    在Excel中計算:

3. 其餘例子

    

4. R平方值

    4.1 定義:決定係數,反應因變量的所有變異能經過迴歸關係被自變量解釋的比例。

                    也就是說,對於已經建模的模型,多大程度上能夠解釋數據

   4.2 描述:如R平方爲0.8,則表示迴歸關係能夠解釋因變量80%的變異。換句話說,若是咱們控制自變量不變,則因變量的變異程度會減小80%。

   4.3 簡單線性迴歸:R^2 = r * r (r爲皮爾遜相關係數)

         多元線性迴歸:

                      

                                        

 

        R平方也有侷限性:R平方隨着自變量的增長會變大,R平方和樣本量是有關係的。所以,咱們要對R平方進行修正。修正方法:

                                                

        實際中通常會選擇修正後的R平方值對線性迴歸模型對擬合度進行評判

 Python實現:

# -*- coding:utf-8 -*-

import numpy as np
from astropy.units import Ybarn
import math

#相關度
def computeCorrelation(X, Y):
    xBar = np.mean(X)
    yBar = np.mean(Y)
    SSR = 0
    varX = 0
    varY = 0
    for i in range(0, len(X)):
        diffXXbar = X[i] - xBar
        diffYYbar = Y[i] - yBar
        SSR += (diffXXbar * diffYYbar)
        varX += diffXXbar**2
        varY += diffYYbar**2
    SST = math.sqrt(varX * varY)
    return SSR / SST

#測試
testX = [1, 3, 8, 7, 9]
testY = [10, 12, 24, 21, 34]

# print("相關度r:", computeCorrelation(testX, testY))
#相關度r: 0.940310076545

#R平方
#簡單線性迴歸:
# print("r^2:", str(computeCorrelation(testX, testY)**2))
#r^2: 0.884183040052

#多個x自變量時:
def polyfit(x, y, degree): #degree自變量x次數
    result = {}
    coeffs = np.polyfit(x, y, degree)
    result['polynomial'] = coeffs.tolist()

    p = np.poly1d(coeffs)
    yhat = p(x)
    ybar = np.sum(y)/len(y)
    ssreg = np.sum((yhat - ybar)**2)
    sstot = np.sum((y - ybar)**2)
    result['determination'] = ssreg / sstot

    return  result

#測試
print(polyfit(testX, testY, 1)["determination"])
#r^2:0.884183040052
相關文章
相關標籤/搜索