单变量线性回归

  • 思路
  • 代码



题目:您将使用一个变量实现线性回归来预测食品车的利润。假设你是一家特许经营餐厅的首席执行官,并且正在考虑在不同的城市开设一家新的门店。该连锁店已经在各个城市都有了卡车,你也有了来自城市的利润和人口数据。您希望使用这些数据来帮助您选择下一个要扩展到哪个城市。

思路

①已知单变量线性回归的假设函数为:

单变量回归预测 单变量回归分析spss_机器学习


②为了衡量该函数的好坏,我们会引进一个代价函数,来评估函数的预测与真实值之间的差异,为了避免讨论函数的值,我们将采用平方差来衡量误差。

代价函数:

单变量回归预测 单变量回归分析spss_线性回归_02


③利用梯度下降法来求解参数值

单变量回归预测 单变量回归分析spss_机器学习_03


单变量回归预测 单变量回归分析spss_单变量回归预测_04

代码

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()

绘制出的结果:利润和人口的散点分布图

单变量回归预测 单变量回归分析spss_线性回归_05

#在x中插入一列x_0=1
data.insert(0,'$x_0$',1) # 在 data 第 0 列插入列名为 x_0 值为 1 的列

运行如下:

单变量回归预测 单变量回归分析spss_单变量回归预测_06

#通过切片操作获取输入向量和输出向量:
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

单变量回归预测 单变量回归分析spss_单变量回归预测_07


单变量回归预测 单变量回归分析spss_迭代_08


此时X和y的数据结构为DataFrame,需要转换为np.array类型方便计算

X = X.values 		
y = y.values

通过_.shape查看数组的维数,从而设置theta的维数

单变量回归预测 单变量回归分析spss_单变量回归预测_09


代价函数

#代价函数
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次后

单变量回归预测 单变量回归分析spss_迭代_10


绘制曲线图使代价函数可视化

fig,ax = plt.subplots()			#创建绘图实例
ax.plot(np.arange(iters),costs)
ax.set(xlabel='iters',
  	ylabel='cost',
  	title='cost vs iters')
plt.show()

单变量回归预测 单变量回归分析spss_单变量回归预测_11


绘制迭代后拟合的直线 ,并与原始数据在同一坐标轴

#拟合直线可视化
# 创建绘图实例
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()

单变量回归预测 单变量回归分析spss_回归_12


最终拟合的坐标

print(theta)

单变量回归预测 单变量回归分析spss_单变量回归预测_13