单变量线性回归
- 思路
- 代码
题目:您将使用一个变量实现线性回归来预测食品车的利润。假设你是一家特许经营餐厅的首席执行官,并且正在考虑在不同的城市开设一家新的门店。该连锁店已经在各个城市都有了卡车,你也有了来自城市的利润和人口数据。您希望使用这些数据来帮助您选择下一个要扩展到哪个城市。
思路
①已知单变量线性回归的假设函数为:
②为了衡量该函数的好坏,我们会引进一个代价函数,来评估函数的预测与真实值之间的差异,为了避免讨论函数的值,我们将采用平方差来衡量误差。
代价函数:
③利用梯度下降法来求解参数值
代码
1.先将数据集在表中绘制出
#导入库
import numpy as np # 科学计算库,处理多维数组,进行数据分析
import pandas as pd# 基于 NumPy 的一种解决数据分析任务工具
import matplotlib.pyplot as plt # 提供一个类似 Matlab 的绘图框架
#导入数据
data = pd.read_csv('D:\\BaiduNetdiskDownload\\01-linear regression\\ex1data1.txt',names=['population','profit']) # 读取文件,指定列名
#数据可视化
data.plot.scatter('population','profit',label='profit of population') # 绘制散点图
plt.show()
绘制出的结果:利润和人口的散点分布图
#在x中插入一列x_0=1
data.insert(0,'$x_0$',1) # 在 data 第 0 列插入列名为 x_0 值为 1 的列
运行如下:
#通过切片操作获取输入向量和输出向量:
cols = data.shape[1] # 获取 data 的列数
X = data.iloc[:,0:cols-1] # X 为 0~cols-1列,所有行
y = data.iloc[:,cols-1:cols] # y 为倒数第 1 列,所有行
得到的X、y
此时X和y的数据结构为DataFrame,需要转换为np.array类型方便计算
X = X.values
y = y.values
通过_.shape查看数组的维数,从而设置theta的维数
代价函数
#代价函数
def costFunction(X, y, theta):
inner = np.power(X @ theta - y, 2) # power(*,2)使向量(Xθ-y)每一项平方,返回仍为向量
J=np.sum(inner) / (2 * len(X)) # 求向量每一项之和,结果相当于(Xθ-y)自身的内积
return J
梯度下降法
def gradientDescent(X,y,theta,alpha,iters): # iters为梯度下降中的迭代次数
costs = [] # 将每次迭代的代价函数值保存在列表
for i in range(iters):
theta = theta - (X.T @ (X@theta - y) ) * alpha / len(X)
cost = costFunction(X,y,theta)
costs.append(cost)
if i % 100 == 0:
print(cost) #每迭代 100 次打印一次cost
return theta,costs
为学习率alpha和迭代次数iters附上初值
#给学习率alpha 和迭代次数iters赋上初值
alpha = 0.02
iters = 1000
theta,costs = gradientDescent(X,y,theta,alpha,iters) #返回迭代1000次后
绘制曲线图使代价函数可视化
fig,ax = plt.subplots() #创建绘图实例
ax.plot(np.arange(iters),costs)
ax.set(xlabel='iters',
ylabel='cost',
title='cost vs iters')
plt.show()
绘制迭代后拟合的直线 ,并与原始数据在同一坐标轴
#拟合直线可视化
# 创建绘图实例
fig,ax = plt.subplots()
#绘制拟合直线
x = np.linspace(y.min(),y.max(),100)
y_ = theta[0,0] + theta[1,0] * x
ax.plot(x,y_,'r',label='predict')
#绘制原始数据散点图
ax.scatter(X[:,1],y,label='training data')
#显示直线和散点图的标签
ax.legend()
#设置横纵轴名
ax.set(xlabel='populaiton',
ylabel='profit')
plt.show()
最终拟合的坐标
print(theta)