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