农业电商网站建设方案,玩具租赁系统网站开发与实现,滨州网站开发,电子网站建文章目录前言一、单变量线性回归1.导入必要的库2.读取数据3.绘制散点图4.划分数据5.定义模型函数6.定义损失函数7.求权重向量w7.1 梯度下降函数7.2 最小二乘法8.训练模型9.绘制预测曲线10.试试正则化11.绘制预测曲线12.试试sklearn库二、多变量线性回归1.导入库2.读取数据3.划分…
文章目录前言一、单变量线性回归1.导入必要的库2.读取数据3.绘制散点图4.划分数据5.定义模型函数6.定义损失函数7.求权重向量w7.1 梯度下降函数7.2 最小二乘法8.训练模型9.绘制预测曲线10.试试正则化11.绘制预测曲线12.试试sklearn库二、多变量线性回归1.导入库2.读取数据3.划分数据4.定义假设函数5.定义损失函数6.定义梯度下降函数7.训练模型8.运用sklearn绘图总结前言
线性回归是一种通过属性的线性组合来进行预测的线性模型 其目的是找到一条直线或者一个平面或者更高维的超平面使得预测值与真实值之间的误差最小化。
一、单变量线性回归
1.导入必要的库
导入pandas、numpy和matplotlib.pyplot库
import pandas as pd #导入pandas库
import numpy as np #导入numpy库
import matplotlib.pyplot as plt #导入matplotlib.pyplot库
plt.rcParams[font.sans-serif][SimHei] #用来正常显示中文标签
plt.rcParams[axes.unicode_minus]False #用来正常显示负号2.读取数据
使用pandas库的read_csv()函数读取数据文件数据文件中包含了人口和收益两列数据
datapd.read_csv(rd:线性回归/regress_data1.csv) #读取数据3.绘制散点图
使用data.plot()函数绘制散点图展示人口与收益之间的关系
data.plot(kindscatter,x人口,y收益) #绘制散点图
plt.xlabel(人口,fontsize10) #横坐标
plt.ylabel(收益,fontsize10) #纵坐标
plt.title(人口与收益之间的关系) #标题
plt.show() #画图4.划分数据
这里是为了方便后面计算将一列全为1的列插入到数据中 将数据分为训练集和测试集这里只使用了训练集
data.insert(0,ones,1) #插入列便于后面计算
col_numdata.shape[1] #训练特征个数
mdata.shape[0] #训练标签个数
Xdata.iloc[:,:col_num-1].values #训练集的特征
ydata.iloc[:,col_num-1].values #训练集的标签
yy.reshape((m,1)) 5.定义模型函数
定义h(X,w)函数用来计算模型预测值这里采用的是线性模型
def h(X,w):return Xw6.定义损失函数
定义cost(X,y,w)函数用来计算模型误差
def cost(X,y,w):return np.sum(np.power(h(X,w)-y,2))/(2*m)7.求权重向量w
7.1 梯度下降函数
定义函数gradient_descent(X,y,w,n,a)用来执行梯度下降算法更新权重向量w并返回最终的权重向量和误差列表
def gradient_descent(X,y,w,n,a):twcost_lst[]for i in range(n):errorh(X,w)-yfor j in range(col_num-1):t[j][0]w[j][0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))wtcost_lst.append(cost(X,y,w))return w,cost_lst7.2 最小二乘法
定义函数least_square(X,y)用来执行最小二乘法直接求出权重向量w但是当n10000时由于时间复杂度太大将导致程序运行超时
def least_square(X,y):wnp.linalg.inv(X.TX)X.Tyreturn w8.训练模型
调用gradient_descent()函数训练模型并输出误差随迭代次数变化的图像用来观察模型的学习效果 其中迭代次数越大训练效果越好学习率适中既不可太大也不可过小
n10000 #迭代次数越多越好
a0.003 #学习率适中不能太大也不能太小
wnp.zeros((col_num-1,1)) #初始化权重向量
w,cost_lstgradient_descent(X,y,w,n,a) #调用梯度下降函数
plt.plot(range(n),cost_lst,r-)
plt.xlabel(迭代次数)
plt.ylabel(误差)
plt.show()9.绘制预测曲线
使用训练好的权重向量w绘制预测曲线并将其与原始数据一起绘制在图像上用来观察模型的预测效果
xnp.linspace(data[人口].min(),data[人口].max(),50) #预测特征
y1w[0,0]*1w[1,0]*x #预测标签
plt.scatter(data[人口],data[收益], label训练数据) #训练集
plt.plot(x,y1,r-,label预测线) #预测集
plt.xlabel(人口,fontsize10)
plt.ylabel(收益,fontsize10)
plt.title(人口与收益之间的关系)
plt.show()10.试试正则化
使用L2正则化岭回归防止过拟合
def gradient_descents(X,y,w,n,a,l):twcost_lst[]for i in range(n):errorh(X,w)-yfor j in range(col_num-1):t[j][0]w[j][0]-((a/m)*(np.sum(error.ravel()*X[:,j].ravel())2*l*w[j,0]))wtcost_lst.append(cost(X,y,w))return w,cost_lst
n10000 #迭代次数越多越好
a0.003 #学习率适中不能太大也不能太小
l1 #λ
wnp.zeros((col_num-1,1))
w,cost_lstgradient_descents(X,y,w,n,a,l)
plt.plot(range(n),cost_lst,r-)
plt.xlabel(迭代次数)
plt.ylabel(误差)
plt.show()11.绘制预测曲线
使用训练好的权重向量w绘制预测曲线并将其与原始数据一起绘制在图像上用来观察模型的预测效果
xnp.linspace(data[人口].min(),data[人口].max(),50)
y1w[0,0]*1w[1,0]*x
plt.scatter(data[人口],data[收益], label训练数据)
plt.plot(x,y1,r-,label预测线)
plt.xlabel(人口,fontsize10)
plt.ylabel(收益,fontsize10)
plt.title(人口与收益之间的关系)
plt.show()12.试试sklearn库
import pandas as pd #导入pandas库
import numpy as np #导入numpy库
import matplotlib.pyplot as plt #导入matplotlib.pyplot库
import sklearn #导入sklearn库
from sklearn import linear_model
plt.rcParams[font.sans-serif][SimHei] #用来正常显示中文标签
plt.rcParams[axes.unicode_minus]False #用来正常显示负号
# 2.读取数据使用pandas库的read_csv()函数读取数据文件。数据文件中包含了人口和收益两列数据。
datapd.read_csv(rd:线性回归/regress_data1.csv) #读取数据
data.insert(0,ones,1) #插入列
col_numdata.shape[1] #列数
mdata.shape[0] #行数
# 5.划分数据将数据分为训练集和测试集这里只使用了训练集。
Xdata.iloc[:,:col_num-1].values #训练集的特征
ydata.iloc[:,col_num-1].values #训练集的标签
y.reshape((m,1))
modlinear_model.LinearRegression()
mod.fit(X,y)
Ymod.predict(X)
plt.scatter(X[:,1],y,markero,colorb)
plt.plot(X,Y,marker,colorr)
plt.xlabel(人口)
plt.ylabel(收益)
plt.show()二、多变量线性回归
1.导入库
import pandas as pd #导入pandas库
import numpy as np #导入numpy库
import matplotlib.pyplot as plt #导入matplotlib.pyplot库
plt.rcParams[font.sans-serif][SimHei] #用来正常显示中文标签
plt.rcParams[axes.unicode_minus]False #用来正常显示负号2.读取数据
dataspd.read_csv(rd:/线性回归/regress_data2.csv) #读取数据
datas(datas-datas.mean())/datas.std() #正则化3.划分数据
datas.insert(0,ones,1) #插入列
col_numdatas.shape[1] #训练特征个数
mdatas.shape[0] #训练标签
Xdatas.iloc[:,:col_num-1].values #训练特征
ydatas.iloc[:,col_num-1].values #训练标签
yy.reshape((m,1)) 4.定义假设函数
def h(X,w):return Xw5.定义损失函数
def cost(X,y,w):return np.sum(np.power(h(X,w)-y,2))/(2*m)6.定义梯度下降函数
def gradient_descent(X,y,w,n,a):twcost_lst[]for i in range(n):errorh(X,w)-yfor j in range(col_num-1):t[j,0]w[j,0]-((a/m)*np.sum(error.ravel()*X[:,j].ravel()))wtcost_lst.append(cost(X,y,w))return w,cost_lst7.训练模型
n1000 #迭代次数
a0.01 #学习率
wnp.zeros((col_num-1,1)) #初始化特征向量w
w,cost_lstgradient_descent(X,y,w,n,a)
plt.plot(range(n),cost_lst,r-)
plt.xlabel(迭代次数)
plt.ylabel(误差)
plt.show()8.运用sklearn绘图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
plt.rcParams[font.sans-serif] [SimHei]
plt.rcParams[axes.unicode_minus] False
# 读取数据
datas pd.read_csv(rd:线性回归/regress_data2.csv)
datas (datas - datas.mean()) / datas.std()
X datas.iloc[:, :-1].values
y datas.iloc[:, -1].values.reshape(-1, 1)
# 多项式回归
poly PolynomialFeatures(degree2)
X_poly poly.fit_transform(X)
mod linear_model.LinearRegression()
mod.fit(X_poly, y)
# 绘制拟合曲线
x1 np.linspace(datas[面积].min(), datas[面积].max(), 50)
x2 np.linspace(datas[房间数].min(), datas[房间数].max(), 50)
x1, x2 np.meshgrid(x1, x2)
X_grid np.column_stack((x1.flatten(), x2.flatten()))
X_grid_poly poly.fit_transform(X_grid)
y_pred mod.predict(X_grid_poly)
figplt.figure()
ax fig.add_subplot(projection3d)
ax.scatter(X[:,0], X[:,1], y, markero, colorb)
ax.plot_surface(x1, x2, y_pred.reshape(x1.shape), cmapcoolwarm)
ax.set_title(价格随面积与房间数的变化曲面)
ax.set_xlabel(面积)
ax.set_ylabel(房间数)
ax.set_zlabel(价格)
plt.show()总结
线性回归三大要素 假设函数 h(X,w)损失函数 cost(X,y,w)梯度下降/最小二乘函数求解权重向量w的函数 普通线性回归步骤 导入库读取数据划分数据假设函数模型函数损失函数梯度下降/最小二乘训练模型绘图预测 调用sklearn库进行线性回归的步骤 导入库读取数据调用sklearn库绘图