吴恩达机器学习配套作业1.0单变量线性回归 python实现

在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。
您希望使用这些数据来帮助您选择将哪个城市扩展到下一个城市

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 时还是可以接受的,但只适用于线性模型,不适合逻辑回归模型等其他模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值