一元線性回歸 逐畫素判斷 多組同時執行 矩陣運算

2021-10-22 19:01:53 字數 2983 閱讀 9608

一元線性回歸再簡單不過了,實現的方式多種多樣。呼叫scikit-learn linear_model.linearregression()、scipy.polyfit( ) 或 numpy.polyfit( )、stats.linregress( )、optimize.curve_fit( )、numpy.linalg.lstsq、statsmodels.ols ( )使用矩陣求逆方法的解析解、高中數學講的最小二乘法公式,詳細請看部落格:python環境下的8種簡單線性回歸演算法 。

但如果資料y(y1,y2,y3,…yn)**現隨機位置與個數的無效值(0值),只有將對應的x(x1,x2,x3,…xn)與y中的無效值(0值)剔除,得到的y隨x變化趨勢才是準確的。對於較少組y與x的回歸,可以採用for迴圈一組一組的判斷計算。但是當有數以億計組y與x,用for迴圈則顯得效率低下。遇到這一問題,是由於我在計算多年ndvi序列趨勢,每一年的ndvi會出現隨機位置與個數的無效值(0值)。

經過探索,在健忘主義這篇部落格啟發下,找到了上述問題解決辦法。下面分享程式設計實現思路

通過改寫健忘主義這篇部落格,利用numpy 陣列提供的求和平方等函式,設定操作在axis=0上對列進行求和等運算。通過陣列運算提高操作效率。

函式輸入陣列x,y需要提前進行處理,在下節函式呼叫中說明。

def

lrg_ols

(x,y)

:'''

calculate slope and intercept by ols

refer to

parameters

----------

x :

type

n*m ndarray

description.

each column stands for a independent variable series, eg. x1,x2,x3,...,xn.

which "x1,x2,x3,...,xn" is 1,2, 3 ...n insequence. x can be created by

x = np.arange(1,n+1).reshape(n,1)

x = np.broadcast_to(x,(n,m))

y :

type

n*m ndarray

description.

each column stands for a dependent variable series, eg. y1 y2 y3...yn.

note the y's dimensions must be the same as x's

returns

-------

k : type

1*m ndarray

description.

corresponding slopes

b : type

1*m ndarray

description.

corresponding intercept

'''x_size = np.count_nonzero(x, axis=0)

# x_size should be equal y_size

# xyproduct = np.multiply(x,y) #element-wise produt of x and y

# xxproduct = np.multiply(x,x)

x_mean = np.

sum(x,axis=0)

.reshape(1,

-1)/ x_size

y_mean = np.

sum(y,axis=0)

.reshape(1,

-1)/ x_size

zi = np.

sum(x*y,axis=0)

.reshape(1,

-1)- x_size * x_mean * y_mean

mu = np.

sum(x*x,axis=0)

.reshape(1,

-1)- x_size * x_mean * x_mean

k = zi / mu

b = y_mean - k * x_mean

# 計算決定係數

y_pred = x*k + b

y_pred[np.where(x==0)

]=0

ssr = np.

sum(np.square(y_pred - y_mean)

,axis=0)

.reshape(1,

-1)# 回歸平方和

sse = np.

sum(np.square(y - y_pred)

,axis=0)

.reshape(1,

-1)# 殘差平方和

sst = ssr + sse # 總偏差平方和

r2 = ssr / sst

return k,b,r2,x_size

輸入陣列x,y。因變數y整理成二維陣列,每一列是乙個因變數時序;自變數整理成與x維度相同的陣列,每一列是乙個自變數陣列。# 然後進行資料篩選,將因變數無效值處賦值為0,並將對應自變數處賦值為0。

shp = data.shape        

# reshape後成為每一列是乙個時序

data = data.reshape(shp[0]

,-1)

# 構造自變數序列,1,2 ... n,

x = np.arange(

1,shp[0]

+1).reshape(shp[0]

,1)x = np.repeat(x,shp[1]

*shp[2]

,axis=1)

# 資料篩選,將負值賦值為0

cond = np.where(data<0)

data[cond]=0

x[cond]=0

k,b,r2,xsize = lrg_ols(x,data)

一元線性回歸模型

在回歸模型裡,線性回歸絕對是最簡單的,但這並不妨礙它成為回歸問題上的佼佼者。對於絕大部分的資料分析場景,線性回歸是我們的首選。歸其原因,有幾點 模型簡單且適用於大資料。訓練起來也非常快,資源消耗也少。線性回歸的評估標準?一種最簡單的方法就是測量真實值和 值之間的差異,也叫做誤差。假設一條線很好地擬合...

SPSS一元線性回歸

回歸分析 是資料分析中最基礎也是最重要的分析工具,絕大多數的資料分析問題,都可以使用回歸的思想來解決。回歸分析的任務就是 通過研究自變數x和因變數y的相關關係,嘗試去解釋y的形成機制,進而達到通過x去 y的目的。相關性 因果性 y為因變數 x為自變數 回歸分析的使命 1 識別重要變數 識別並判斷,哪...

一元線性回歸模型

按西瓜書公式寫的,比較簡陋,但可以執行幫助理解 import math d 65 6 50,5 120,15 98 12 51,6 66 8 70,10 78 11 75,10 120,8 45 7 該資料集表示 體重,血糖值 體重為x 血糖值為標記 一元線性回歸試圖求得g ax b使g擬合f 輸入...