线性回归 —— python
目錄
一、基本概念
二、概念的數(shù)學(xué)形式表達(dá)
三、確定w和b
1.讀取或輸入數(shù)據(jù)
2.歸一化、標(biāo)準(zhǔn)化
2.1 均值
2.2 歸一化
2.3 標(biāo)準(zhǔn)化
3.求解w和b
1.直接解方程
2.最小二乘法(least square method)求解:
4. 評估回歸模型
四、sklearn中的線性回歸
1.對數(shù)據(jù)進(jìn)行解析
2.對原始值和預(yù)測值進(jìn)行繪圖
3.繪制殘差圖
一、基本概念
線性(linear):
指量與量之間按比例、成直線的關(guān)系,在空間和時間上代表規(guī)則和光滑的運(yùn)動,一階導(dǎo)數(shù)為常數(shù)
非線性(non-linear):
指不按比例、不成直線的關(guān)系,代表不規(guī)則的運(yùn)動和突變,一階導(dǎo)數(shù)不為常數(shù)。
一個線性的例子:
數(shù)據(jù):工資和年齡(2個特征)
目標(biāo):預(yù)測銀行會貸款給我多少錢(標(biāo)簽)
考慮:工資和年齡都會影響最終銀行貸款的結(jié)果,那么他們各自有多大的影響呢?(參數(shù))
通俗的解釋:
x1,x2就是我們的兩個特征(年齡、工資),y是銀行最終會借給我們多少錢
找到最合適的一條線(想象一個高維)來最好的擬合我們的數(shù)據(jù)點(diǎn)
數(shù)學(xué)形式來了
二、概念的數(shù)學(xué)形式表達(dá)
給定數(shù)據(jù)集:
數(shù)據(jù)的矩陣形式:
?線性模型(linear model)試圖學(xué)得一個通過屬性組合的線性組合來進(jìn)行預(yù)測的函數(shù),即
用向量形式寫成:???
線性回歸(linear regression)試圖學(xué)得一個線性模型以盡可能準(zhǔn)確地預(yù)測實(shí)值輸出標(biāo)記
三、確定w和b
對離散屬性:
若屬性間存在“序”關(guān)系,可通過連續(xù)化將其轉(zhuǎn)化為連續(xù)值。
若屬性間不存在“序”關(guān)系,則轉(zhuǎn)化為k維向量。
1.讀取或輸入數(shù)據(jù)
#導(dǎo)入相關(guān)庫 numpy pandas import pandas import numpy #如果沒有請安裝哦,如下 # pip install pandas # pip install numpy有庫了,我們才可以導(dǎo)入數(shù)據(jù)哇
首先我們先看看csv數(shù)據(jù)的導(dǎo)入
import pandas as pd文件 data = pd.read_csv(r'路徑', encoding='gbk') #讀取csv數(shù)據(jù)方式 pd.read_csv # encoding='gbk' 定義編碼方式 常用只有兩種 utf8 和 gbk 按需定義即可#下面這種讀取是顯示沒有第一列的數(shù)據(jù) index_col=0 python中第0列也就是實(shí)際的第1列 #reset_index(drop=True) True表示執(zhí)行此刪除命令 data= pd.read_csv(r"路徑", encoding='gbk', index_col=0).reset_index(drop=True)?讀取數(shù)據(jù)后得分出和為X,何為Y
X = data.iloc[:,0:4] # 0到3列所有的數(shù)據(jù)也就是實(shí)際的1到4列 Y = data.iloc[:, 5] # 第5列所有的數(shù)據(jù)也就是實(shí)際的第6列?接下來我們看看自己建立矩陣的數(shù)據(jù)讀取方式
import numpy as np a = np.array([1,2,3]) print(a) b = np.array([[1,2],[2,3]]) print(b)返回:
?
?說到矩陣了,就順便說一下
創(chuàng)建矩陣的相關(guān)知識:mat() 創(chuàng)建矩陣array() 將列表轉(zhuǎn)換為數(shù)組,可選擇顯式指定dtypearange() range的numpy版,支持浮點(diǎn)數(shù)linspace() 類似arange(),第三個參數(shù)為數(shù)組長度zeros() 根據(jù)指定形狀和dtype創(chuàng)建全0數(shù)組ones() 根據(jù)指定形狀和dtype創(chuàng)建全1數(shù)組empty() 根據(jù)指定形狀和dtype創(chuàng)建空數(shù)組(隨機(jī)值)eye() 根據(jù)指定邊長和dtype創(chuàng)建單位矩陣2.歸一化、標(biāo)準(zhǔn)化
2.1 均值
# 在這里我們可以直接用numpy中的mean函數(shù)計算 numpy。mean()順便介紹一下其他的numpy中的相關(guān)常用函數(shù):
sum 求和
cumsum 求前綴和
mean 求平均數(shù)
std 求標(biāo)準(zhǔn)差
var 求方差
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引
?要想確定w和b,首先要視情況決定是否需要對數(shù)據(jù)進(jìn)行歸一化或標(biāo)準(zhǔn)化
2.2 歸一化
#范圍歸一化 此方法只適用一維數(shù)據(jù) import numpy as np data = np.asarray([1,5,3,8,4]) for x in data:x = float(x - np.min(data))/(np.max(data)- np.min(data))print(x) # sklearn中的范圍歸一化函數(shù)MinMaxScaler函數(shù)可適用多維數(shù)據(jù) from sklearn import preprocessing import numpy as np X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) min_max_scaler = preprocessing.MinMaxScaler() x = min_max_scaler.fit_transform(X)2.3 標(biāo)準(zhǔn)化
#標(biāo)準(zhǔn)化 import numpy as npcc = np.array([[1,2,3],[4,5,6]]) #創(chuàng)建矩陣 print(cc) #輸出矩陣cc_mean = np.mean(cc, axis=0) #axis=0,表示按列求均值 ——— 即第一維,每一列可看做一個維度或者特征 cc_std = np.std(cc, axis=0) #xis=0,表示按列求標(biāo)準(zhǔn)差 cc_zscore = (cc-cc_mean)/cc_std #直接計算,對數(shù)組進(jìn)行標(biāo)準(zhǔn)化,一定要注意維度 print(cc_zscore) #輸出結(jié)果 #sklearn中的標(biāo)準(zhǔn)化 from sklearn.preprocessing import StandardScalerscaler = StandardScaler() cc_zscore = scaler.fit_transform(cc) print(cc_zscore) #輸出結(jié)果3.求解w和b
1.直接解方程
N = data.shape[0] X_mean = np.mean(X) #求均值 X_mean = np.array(X_mean) #轉(zhuǎn)為數(shù)組 Y_mean = np.mean(Y) #求均值 Y_mean = np.array(Y_mean) #轉(zhuǎn)為數(shù)組A = np.dot(X.T,X)-N*np.dot(X_mean.T,X_mean) C = np.dot(X.T,Y)-N*np.dot(X_mean.T,Y_mean) B = np.dot(np.linalg.inv(A),C) #系數(shù) BB = Y_mean - np.dot(X_mean,B.T) #常數(shù) YY = np.dot(X,B.T)+BB #Y的估計值2.最小二乘法(least square method)求解:
把數(shù)據(jù)集D表示為一個m*(d+1)大小的矩陣X,其中每行對應(yīng)于一個示例,改行前d個元素對應(yīng)于示例的d個屬性值,最好一個元素恒置為1,即
x = np.array([[1,5,8],[2,5,8],[1,4,6]]) Y = np.array([2,5,3]) b = np.ones(3) X = np.insert(x, 3, values=b, axis=1)當(dāng)X^TX 為滿秩矩陣(full-rank matrix) 或正走矩陣(positive definite matrix) 時,令
得到
w=np.dot(np.dot(np.linalg.inv(np.dot(X.T,X)),X.T),Y)?其中(X^TX)^-l是矩陣(X^TX)的逆矩陣.令xi = (xi ,l) ,則最終學(xué)得的多元線性回歸模型為
4. 評估回歸模型
#離差平方和 S = np.var(Y) #回歸平方和 U = np.var(YY) #剩余平方和 Q = S - U #復(fù)可決系數(shù) R2 = U/S #負(fù)相關(guān)系數(shù) R = np.sqrt(U/S) #回歸均方 # n= X_mean 的個數(shù) UU = U/n #剩余均方 # N= Y的個數(shù) QQ = Q/(N-n-1) #剩余標(biāo)準(zhǔn)差 s = np.sqrt(QQ) #方程顯著性檢驗值 F = UU/QQ四、sklearn中的線性回歸
1.對數(shù)據(jù)進(jìn)行解析
from sklearn import linear_model import numpy as np import pandas as pd #使用最小二乘線性回歸進(jìn)行擬合,導(dǎo)入相應(yīng)的模塊 lr=linear_model.LinearRegression() data = pd.read_csv(r'D:\桌面\A.csv', encoding='gbk') X = data.iloc[:,0:4] Y = data.iloc[:, 5] X_train,X_test,Y_train,Y_test=train_test_split(X, Y, test_size=0.2, random_state=0) lr.fit(X_train,Y_train) #擬合 y=lr.predict(X) #得到預(yù)測值集合y coef=lr.coef_ #獲得該回該方程的回歸系數(shù)與截距 intercept=lr.intercept_ print("預(yù)測方程回歸系數(shù):",coef) print("預(yù)測方程截距:",intercept) score=lr.score(X_test,Y_test) #對得到的模型打分 print('模型的預(yù)測分',score)2.對原始值和預(yù)測值進(jìn)行繪圖
from matplotlib import pyplot as plt plt.plot(range(1,len(Y)+1),Y) plt.plot(range(1,len(Y)+1),y) plt.show()3.繪制殘差圖
err = y - Y #求殘差 plt.plot(range(1,len(Y)+1),err) plt.show()總結(jié)
以上是生活随笔為你收集整理的线性回归 —— python的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 山东大学 2020级数据库系统 实验一
- 下一篇: pyqt5生成py的文件为什么是c 语言