一元線性回歸再簡單不過了,實現的方式多種多樣。呼叫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 輸入...