熱線電話:13121318867

登錄
首頁精彩閱讀使用Python進行線性回歸
使用Python進行線性回歸
2017-05-09
收藏

使用Python進行線性回歸

線性回歸是最簡單同時也是最常用的一個統計模型。線性回歸具有結果易于理解,計算量小等優點。如果一個簡單的線性回歸就能取得非常不錯的預測效果,那么就沒有必要采用復雜精深的模型了。
今天,我們一起來學習使用Python實現線性回歸的幾種方法:
    通過公式編寫矩陣運算程序;
    通過使用機器學習庫sklearn;
    通過使用statmodels庫。
這里,先由簡至繁,先使用sklearn實現,再講解矩陣推導實現。
1.使用scikit-learn進行線性回歸
設置工作路徑
#
import os
os.getcwd()
os.chdir('D:\my_python_workfile\Project\Writting')

加載擴展包

import pandas as pd
import numpy as np
import pylab as pl
import matplotlib.pyplot as plt

載入數據并可視化分析

這里,為了簡單起見,使用sklearn中自帶的數據集鳶尾花數據iris進行分析,探索『花瓣寬』和『花瓣長』之間的線性關系。

from sklearn.datasets import load_iris
# load data
iris = load_iris()
# Define a DataFrame
df = pd.DataFrame(iris.data, columns = iris.feature_names)
# take a look
df.head()
#len(df)

# correlation
df.corr()

  

# rename the column name

df.columns = ['sepal_length','sepal_width','petal_length','petal_width']
df.columns

Index([u'sepal_length', u'sepal_width', u'petal_length', u'petal_width'], dtype='object')

plt.matshow(df.corr())

由上面分析可知,花瓣長sepal length和花瓣寬septal width有著非常顯著的相關性。
下面,通過線性回歸進一步進行驗證。
# save image
fig,ax = plt.subplots(nrows = 1, ncols = 1)
ax.matshow(df.corr())
fig.savefig('./image/iris_corr.png')

建立線性回歸模型

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

lr = LinearRegression()
X = df[['petal_length']]
y = df['petal_width']
lr.fit(X,y)
# print the result
lr.intercept_,lr.coef_

(-0.3665140452167297, array([ 0.41641913]))

# get y-hat
yhat = lr.predict(X = df[['petal_length']])

# MSE
mean_squared_error(df['petal_width'],yhat)

# lm plot
plt.scatter(df['petal_length'],df['petal_width'])
plt.plot(df['petal_length'],yhat)

#save image
plt.savefig('./image/iris_lm_fit.png')

2.使用statmodels庫

#import statsmodels.api as sm
import statsmodels.formula.api as sm

linear_model = sm.OLS(y,X)

results = linear_model.fit()

results.summary()

OLS Regression Results 


3.使用公式推導
線性回歸,即是使得如下目標函數最小化:

使用最小二乘法,不難得到β的估計:

從而,我們可以根據此公式,編寫求解β^的函數。
from numpy import *

#########################
# 定義相應的函數進行矩陣運算求解。
def standRegres(xArr, yArr):
    xMat = mat(xArr)
    yMat = mat(yArr).T
    xTx = xMat.T * xMat
    if linalg.det(xTx) == 0.0:
        print "this matrix is singular, cannot do inverse!"
        return NA
    else :
        ws = xTx.I * (xMat.T * yMat)
        return ws

# test
x0 = np.ones((150,1))
x0 = pd.DataFrame(x0)
X0 = pd.concat([x0,X],axis  = 1)
standRegres(X0,y)

matrix([[-0.36651405],
        [ 0.41641913]])

結果一致。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢