在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。您希望使用这些数据来帮助您选择将哪个城市扩展到下一个城市。
可视化显示预测后的结果和损失函数。
from cProfile import label
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def costfunction(X,y,theta):
"""
代价函数 返回损失函数的结果
X:特征矩阵
y: 标签
theta: 参数
"""
inner=np.power(((X*theta.T)-y),2)
return np.sum(inner)/(2*len(X))
def gradient(X,y,theta,alpha=0.01, iters=1000):
"""
梯度下降函数 返回进行iters迭代以后损失函数参数θ 和 每一次迭代时产生的结果
X:特征矩阵
y: 标签
theta: 参数
alpha:学习速率 默认0.01
iters:迭代次数 默认1000次
变量是θ,而不是X和y,意思是说,我们变化θ的值来使损失函数变化,而不是变化X和y的值。
"""
cost = []
for i in range(iters):
theta =theta - (alpha / len(X)) * (X * theta.T - y).T * X
cost.append(costfunction(X,y,theta))
return theta,cost
#导入数据并查看
path = 'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit']) #header=None告诉数据没有列索引 利用names指定列索引
# print(data.head())
#print(data.describe()) #查看数据统计
#数据可视化
fig,(ax1,ax2)=plt.subplots(1,2,figsize=(20,8),dpi=80)
ax1.scatter(data['Population'],data['Profit'],marker='o',c='red',label='Train data')
#在数据中加入一列 用于更新参数theta
data.insert(0, 'Ones', 1)
# 初始化X和y
cols = data.shape[1]
X = data.iloc[:,:-1]#X是data里的除最后列
y = data.iloc[:,cols-1:cols]#y是data最后一列
#代价函数使用的是numpy矩阵 需要对数据进行转换
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))#初始化theta为0
# print(costfunction(X,y,theta))#32.072733877455676
#进行梯度下降
iters=1500
final_theta, costs = gradient(X,y,theta,iters=iters)
# print(final_theta)#[[-3.24140214 1.1272942 ]]
# print(cost)
x = np.linspace(data.Population.min(), data.Population.max(), 100) #设置直线x坐标的数据集
y = final_theta[0, 0] + (final_theta[0, 1] * x) # 纵坐标,利润
ax1.plot(x, y, c='green', label='Prediction') #画直线
ax2.plot(np.arange(iters),costs)
ax1.legend(loc='best')
ax1.set_xlabel('Population')
ax1.set_ylabel('Profit')
ax1.set_title('Predicted Profit vs. Population Size')
ax2.set_xlabel('iters')
ax2.set_ylabel('cost')
ax2.set_title('cost function')
plt.show()