包含python實現最小角度回歸的詞條

本文目錄一覽:

如何用python實現含有虛擬自變量的回歸

利用python進行線性回歸

理解什麼是線性回歸

線性回歸也被稱為最小二乘法回歸(Linear Regression, also called Ordinary Least-Squares (OLS) Regression)。它的數學模型是這樣的:

y = a+ b* x+e

其中,a 被稱為常數項或截距;b 被稱為模型的回歸係數或斜率;e 為誤差項。a 和 b 是模型的參數。

當然,模型的參數只能從樣本數據中估計出來:

y’= a’ + b’* x

我們的目標是選擇合適的參數,讓這一線性模型最好地擬合觀測值。擬合程度越高,模型越好。

那麼,接下來的問題就是,我們如何判斷擬合的質量呢?

這一線性模型可以用二維平面上的一條直線來表示,被稱為回歸線。

模型的擬合程度越高,也即意味着樣本點圍繞回歸線越緊密。

如何計算樣本點與回歸線之間的緊密程度呢?

高斯和勒讓德找到的方法是:被選擇的參數,應該使算出來的回歸線與觀測值之差的平房和最小。用函數表示為:

這被稱為最小二乘法。最小二乘法的原理是這樣的:當預測值和實際值距離的平方和最小時,就選定模型中的兩個參數(a 和 b)。這一模型並不一定反映解釋變量和反應變量真實的關係。但它的計算成本低;相比複雜模型更容易解釋。

模型估計出來後,我們要回答的問題是:

我們的模型擬合程度如何?或者說,這個模型對因變量的解釋力如何?(R2)

整個模型是否能顯著預測因變量的變化?(F 檢驗)

每個自變量是否能顯著預測因變量的變化?(t 檢驗)

首先回答第一個問題。為了評估模型的擬合程度如何,我們必須有一個可以比較的基線模型。

如果讓你預測一個人的體重是多少?在沒有任何額外信息的情況下,你可能會用平均值來預測,儘管會存在一定誤差,但總比瞎猜好。

現在,如果你知道他的身高信息,你的預測值肯定與平均值不一樣。額外信息相比平均值更能準確地預測被預測的變量的能力,就代表模型的解釋力大小。

上圖中,SSA 代表由自變量 x 引起的 y 的離差平方和,即回歸平方和,代表回歸模型的解釋力;SSE 代表由隨機因素引起的 y 的離差平方和,即剩餘平方和,代表回歸模型未能解釋的部分;SST 為總的離差平方和,即我們僅憑 y 的平均值去估計 y 時所產生的誤差。

用模型能夠解釋的變異除以總的變異就是模型的擬合程度:

R2=SSA/SST=1-SSE

R2(R 的平方)也被稱為決定係數或判定係數。

第二個問題,我們的模型是否顯著預測了 y 的變化?

假設 y 與 x 的線性關係不明顯,那麼 SSA 相對 SSE 佔有較大的比例的概率則越小。換句話說,在 y 與 x 無線性關係的前提下,SSA 相對 SSE 的佔比越高的概率是越小的,這會呈現一定的概率分布。統計學家告訴我們它滿足 F 分布,就像這樣:

如果 SSA 相對 SSE 佔比較大的情況出現了,比如根據 F 分布,這個值出現的概率小於 5%。那麼,我們最好是拒絕 y 與 x 線性關係不顯著的原始假設,認為二者存在顯著的線性關係較為合適。

第三個問題,每個自變量是否能顯著預測因變量的變化?換句話說,回歸係數是否顯著?

回歸係數的顯著性檢驗是圍繞回歸係數的抽樣分布(t 分布)來進行的,推斷過程類似於整個模型的檢驗過程,不贅言。

實際上,對於只有一個自變量的一元線性模型,模型的顯著性檢驗和回歸係數的檢驗是一致的,但對於多元線性模型來說,二者就不能等價了。

利用 statsmodels 進行最小二乘回歸

#導入相應模塊

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: import statsmodels.api as sm

#將數據導入 pandas 的 dataframe 對象,第一列(年份)作為行標籤

In [4]: df=pd.read_csv(‘/Users/xiangzhendong/Downloads/vincentarelbundock-Rdatasets-1218370/csv/datasets/longley.csv’, index_col=0)

#查看頭部數據

In [5]: df.head()

Out[5]:

GNP.deflator      GNP  Unemployed  Armed.Forces  Population  Year  \

1947          83.0  234.289       235.6         159.0     107.608  1947

1948          88.5  259.426       232.5         145.6     108.632  1948

1949          88.2  258.054       368.2         161.6     109.773  1949

1950          89.5  284.599       335.1         165.0     110.929  1950

1951          96.2  328.975       209.9         309.9     112.075  1951

Employed

1947    60.323

1948    61.122

1949    60.171

1950    61.187

1951    63.221

#設置預測變量和結果變量,用 GNP 預測 Employed

In [6]: y=df.Employed #結果變量

In [7]: X=df.GNP #預測變量

#為模型增加常數項,即回歸線在 y 軸上的截距

In [8]: X=sm.add_constant(X)

#執行最小二乘回歸,X 可以是 numpy array 或 pandas dataframe(行數等於數據點個數,列數為預測變量個數),y 可以是一維數組(numpy array)或 pandas series

In [10]: est=sm.OLS(y,X)

使用 OLS 對象的 fit() 方法來進行模型擬合

In [11]: est=est.fit()

#查看模型擬合的結果

In [12]: est.summary()

Out[12]:

#查看最終模型的參數

In [13]: est.params

Out[13]:

const    51.843590

GNP       0.034752

dtype: float64

#選擇 100 個從最小值到最大值平均分布(equally spaced)的數據點

In [14]: X_prime=np.linspace(X.GNP.min(), X.GNP.max(),100)[:,np.newaxis]

In [15]: X_prime=sm.add_constant(X_prime)

#計算預測值

In [16]: y_hat=est.predict(X_prime)

In [17]: plt.scatter(X.GNP, y, alpha=0.3) #畫出原始數據

#分別給 x 軸和 y 軸命名

In [18]: plt.xlabel(“Gross National Product”)

In [19]: plt.ylabel(“Total Employment”)

In [20]: plt.plot(X_prime[:,1], y_hat, ‘r’, alpha=0.9) #添加回歸線,紅色

多元線性回歸(預測變量不止一個)

我們用一條直線來描述一元線性模型中預測變量和結果變量的關係,而在多元回歸中,我們將用一個多維(p)空間來擬合多個預測變量。下面表現了兩個預測變量的三維圖形:商品的銷量以及在電視和廣播兩種不同媒介的廣告預算。

數學模型是:

Sales = beta_0 + beta_1*TV + beta_2*Radio

圖中,白色的數據點是平面上的點,黑色的數據點事平面下的點。平面的顏色是由對應的商品銷量的高低決定的,高是紅色,低是藍色。

利用 statsmodels 進行多元線性回歸

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: import statsmodels.api as sm

In [4]: df_adv=pd.read_csv(‘g.csv’,index_col=0)

In [6]: X=df_adv[[‘TV’,’Radio’]]

In [7]: y=df_adv[‘Sales’]

In [8]: df_adv.head()

Out[8]:

TV  Radio  Newspaper  Sales

1  230.1   37.8       69.2   22.1

2   44.5   39.3       45.1   10.4

3   17.2   45.9       69.3    9.3

4  151.5   41.3       58.5   18.5

5  180.8   10.8       58.4   12.9

In [9]: X=sm.add_constant(X)

In [10]: est=sm.OLS(y,X).fit()

In [11]: est.summary()

Out[11]:

你也可以使用 statsmodels 的 formula 模塊來建立多元回歸模型

In [12]: import statsmodels.formula.api as smf

In [13]: est=smf.ols(formula=’Sales ~ TV + Radio’,data=df_adv).fit()

處理分類變量

性別或地域都屬於分類變量。

In [15]: df= pd.read_csv(‘httd.edu/~tibs/ElemStatLearn/datasets/SAheart.data’, index_col=0)

In [16]: X=df.copy()

利用 dataframe 的 pop 方法將 chd 列單獨提取出來

In [17]: y=X.pop(‘chd’)

In [18]: df.head()

Out[18]:

sbp  tobacco   ldl  adiposity  famhist  typea  obesity  alcohol  \

row.names

1          160    12.00  5.73      23.11  Present     49    25.30    97.20

2          144     0.01  4.41      28.61   Absent     55    28.87     2.06

3          118     0.08  3.48      32.28  Present     52    29.14     3.81

4          170     7.50  6.41      38.03  Present     51    31.99    24.26

5          134    13.60  3.50      27.78  Present     60    25.99    57.34

age  chd

row.names

1           52    1

2           63    1

3           46    0

4           58    1

5           49    1

In [19]: y.groupby(X.famhist).mean()

Out[19]:

famhist

Absent     0.237037

Present    0.500000

Name: chd, dtype: float64

In [20]: import statsmodels.formula.api as smf

In [21]: df[‘famhist_ord’]=pd.Categorical(df.famhist).labels

In [22]: est=smf.ols(formula=”chd ~ famhist_ord”, data=df).fit()

分類變量的編碼方式有許多,其中一種編碼方式是虛擬變量編碼(dummy-encoding),就是把一個 k 個水平的分類變量編碼成 k-1 個二分變量。在 statsmodels 中使用 C 函數實現。

In [24]: est=smf.ols(formula=”chd ~ C(famhist)”, data=df).fit()

In [26]: est.summary()

Out[26]:

處理交互作用

隨着教育年限(education)的增長,薪酬 (wage) 會增加嗎?這種影響對男性和女性而言是一樣的嗎?

這裡的問題就涉及性別與教育年限的交互作用。

換言之,教育年限對薪酬的影響是男女有別的。

#導入相關模塊

In [1]: import pandas as pd

In [2]: import numpy as np

In [4]: import statsmodels.api as sm

#導入數據,存入 dataframe 對象

In [5]: df=pd.read_csv(‘/Users/xiangzhendong/Downloads/pydatafromweb/wages.csv’)

In [6]: df[[‘Wage’,’Education’,’Sex’]].tail()

Out[6]:

Wage  Education  Sex

529  11.36         18    0

530   6.10         12    1

531  23.25         17    1

532  19.88         12    0

533  15.38         16    0

由於性別是一個二分變量,我們可以繪製兩條回歸線,一條是 sex=0(男性),一條是 sex=1(女性)

#繪製散點圖

In [7]: plt.scatter(df.Education,df.Wage, alpha=0.3)

In [9]: plt.xlabel(‘education’)

In [10]: plt.ylabel(‘wage’)

#linspace 的作用是生成從最小到最大的均勻分布的 n 個數

In [17]: education_linspace=np.linspace(df.Education.min(), df.Education.max(),100)

In [12]: import statsmodels.formula.api as smf

In [13]: est=smf.ols(formula=’Wage ~ Education + Sex’, data=df).fit()

In [18]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]0, ‘r’)

In [19]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]1, ‘g’)

以上兩條線是平行的。這是因為分類變量隻影響回歸線的截距,不影響斜率。

接下來我們可以為回歸模型增加交互項來探索交互效應。也就是說,對於兩個類別,回歸線的斜率是不一樣的。

In [32]: plt.scatter(df.Education,df.Wage, alpha=0.3)

In [33]: plt.xlabel(‘education’)

In [34]: plt.ylabel(‘wage’)

#使用*代表我們的回歸模型中除了交互效應,也包括兩個變量的主效應;如果只想看交互效應,可以用:代替,但通常不會只看交互效應

In [35]: est=smf.ols(formula=’Wage ~ Sex*Education’, data=df).fit()

In [36]: plt.plot(education_linspace, est.params[0]+est.params[1]0+est.params[2]education_linspace+est.params[3]0education_linspace, ‘r’)

In [37]: plt.plot(education_linspace, est.params[0]+est.params[1]1+est.params[2]education_linspace+est.params[3]1education_linspace, ‘g’)

參考資料:

DataRobot | Ordinary Least Squares in Python

DataRoboe | Multiple Regression using Statsmodels

AnalyticsVidhya | 7 Types of Regression Techniques you should know!

用python寫一個小程序,輸入坐標求線性回歸

你好:

上面的程序,請看如下代碼:

# -*- coding: cp936 -*-

end=input(“是否結束(y/n):”)

while end==”n”:

    print “Number of coordinates:2”

    xx=input(“x’s:”)

    yy=input(“y’s:”)

    a=float(list(xx)[0])

    b=float(list(xx)[1])

    c=float(list(yy)[0])

    d=float(list(yy)[1])

    print “第一個點是:(“+str(a)+”,”+str(c)+”)”

    print “第一個點是:(“+str(b)+”,”+str(d)+”)”

    x0=c-a

    y0=float(d-b)

    print “直線方程為:”,

    if x0==0:

        print “x=”,a

    else:

        print “y=%r(x-%r)+%r”%(y0/x0,a,c)

    print

python 嶺回歸

所求參數是alpha的函數,比如記為f(alpha), f(alpha)隨alpha的改變的軌跡就是嶺跡。

實際計算中可選非常多的alpha值,做出一個嶺跡圖,看看這個圖在取哪個值的時候變穩定了,

那就確定alpha值了,從而確定參數。

Ridge(alpha=1.0, fit_intercept=False)

model.fit(x,y)

這樣就等於你算的,因為你numpy是用增廣矩陣算的,所以應該將set fit_intercept=False

model.coef_

array([[ 1.06059732,  0.48614918,  0.44596739]])

python編寫程序,利用元組作為函數的返回值,求系列類型的最大值、最小值和元素個數

1、首先,定義一個數組,初值為0。

2、用for循環,控制輸入整數的個數。

3、將輸入的整數,保存在數組中。

4、用函數min判斷輸入整數的最小值,保存到變量中。

5、然後,用函數max判斷輸入整數的最大值,保存在變量中。

6、最後,輸出整數中的最小值和最大值。

7、運行程序,輸入三個一位整數,電腦會判斷出最小值和最大值。

原創文章,作者:OFRER,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/330904.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
OFRER的頭像OFRER
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論