在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。
您希望使用这些数据来帮助您选择将哪个城市扩展到下一个城市
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
读取数据 可以先查看数据的结构类型
data = pd.read_csv('D:\yuxin\data_sets\ex1data1.txt',header=None,names=['people','profets'])
注意:Python中可以用numpy的load函数读取数据,也可以用pandas的read函数读取,区别在于numpy读取的数据以array的形式而pandas以dataframe的形式,也就是在pandas中是matrix而不是array,但两者可以利用函数互相转化。
dataframe的优势是可以对数据进行很多操作,例如缺失值处理、合并或截取数据等。但是要想进行矩阵运算,先需要把dataframe转化为矩阵,例如x = x.values,再进行运算。但在array中就可以直接操作,注意这里的乘法和array通用,也是.dot()或者@
X = data['people']
y = data['profets']
X = X.values.reshape(97,1)
y = y.values.reshape(97,1)
data.shape,X.shape,y.shape
打印出数据的形状,便于接下来的计算
((97, 2), (97, 1), (97, 1))
由于是二维数据 可以作一个简单的图看出其对应的关系
plt.figure(0)
plt.scatter(X,y)
正规方程解法
在输入矩阵X插入一列1
X_one = np.insert(X,0,values=1,axis=1)
len(X_one)
97
正规方程可以得到下面求解参数的式子,这里的参数由两个。具体推导可以参考
https://blog.csdn.net/qq_43468729/article/details/84671596
theta1 = np.linalg.inv(X_one.T @ X_one) @ X_one.T@y
theta1
array([[-3.89578088],
[ 1.19303364]])
x_lam = np.arange(min(X),max(X))
y_lam = theta1[1]*x_lam + theta1[0]
plt.plot(x_lam,y_lam)
plt.scatter(X,y)
梯度下降法
定义损失函数
def cost(X,y,theta):
j = np.sum((X@theta.T-y)**2)/(2*len(X))
return j
定义梯度下降函数
def gradient(X,y,theta,a,n):
for i in range(n):
theta1 = theta -(a/len(X))*((X@theta.T -y).T @X)
theta = theta1
return theta1[0]
确定学习率和迭代次数,一般到1000次 梯度下降就能得到最优解
theta0 =np.array([0,0]).reshape(1,2)
a = 0.01
n = 100000
计算初始的代价
cost(X_one,y,theta0)
32.072733877455676
求解最优化的参数
theta = gradient(X_one,y,theta0,a,n)
theta
array([-3.89578088, 1.19303364])
x_lam1 = np.arange(min(X),max(X))
y_lam1 = theta[1]*x_lam + theta[0]
plt.plot(x_lam1,y_lam1)
plt.scatter(X,y)
predict = theta[1]*X +theta[0]
predict1 = theta1[1]*X + theta1[0]
看一看预测值与真实值的误差
np.std(y -predict),np.std(y-predict1)
(2.992313946087602, 2.9923139460876023)
优化以后的代价
cost(X_one,y,theta.reshape(1,2)),cost(X_one,y,theta1.reshape(1,2))
(4.476971375975179, 4.476971375975179)
方法对比:
梯度下降:需要选择学习率,需要多次迭代,当特征数量n大时也能较好适用,适用于各种类型的模型
正规方程:不需要选择学习率,一次计算得出 ,如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为O(n3),通常来说当n小于10000 时还是可以接受的,但只适用于线性模型,不适合逻辑回归模型等其他模型