吴恩达机器学习课后习题(线性回归一)

一、线性回归

实现简单线性回归,使用梯度下降算法对数据进行拟合,最终得出拟合的线性图像,并可以使用其他数据集进行预测。使用python 3.9,pycharm编译器。

二、实现线性回归

导入三种数据包。

import numpy as np #Numpy包内部集成了大量的数学函数库,np是给numpy起了个别名
import pandas as pd  # 分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算)
import matplotlib.pyplot as plt #绘图包

从文件中读取数据。

path = 'E:\\Pycharm\\workspace\\ex1_Andrew\\ex1data1.txt' #路径格式双\\
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
#header = 0是默认情况(即不标明,默认就是header = 0),表示以数据的第一行为列索引,若改names,则第一行数据会丢失(直接修改第一行数据)。
#header=None时,显示每一行数据,添加names,第一行数据不会丢失
#names为横向索引header的名字,可以是数字,如names=range(2,6)
df = pd.DataFrame(data)  #生成图表,pandas中方法,也可以直接用data
print(df.head()) #head函数默认输出五行

设计代价函数并初始化X,y,theta。

def computeCost(X,y,theta): #计算代价函数
    inner=np.power(((X*theta.T)-y),2) #X为输入矩阵,*theta的转置为假设函数,-y后整体平方;power函数计算幂
    return np.sum(inner)/(2*len(X))

data.insert(0,"ones",1) #在表中添加了一列数据,在第0列(最左)添加名为ones的值都为1的一列
cols=data.shape[1] #shape函数读取data中的二维的长度,即为数据的列数,此时共有三列,clos=3;shape[0]为行数
X=data.iloc[:,:-1] #X为数据中的所有行,以及除了最后一列,此时X中有ones列与population列,X是72*2的数据,列数等同于[0:2]
y=data.iloc[:,cols-1:cols] #y为最后一列数据,等同于[2:3]
X=np.matrix(X.values) #将X转换为矩阵,72*2
y=np.matrix(y.values) #将y转换为矩阵,72*1
theta=np.matrix(np.array([0,0])) #theta向量是两个值都初始化为0的一维向量,1*2,转置后为2*1
print("初始theta值的代价为:")
print(computeCost(X,y,theta)) #此时theta为初始自定义的值(0,0),计算出了此时输入的代价

实现梯度下降算法,并进行小预测。

def gradientDecent(X,y,theta,alpha,iters): #alpha为学习率,iters为设定迭代次数
    tempt=np.matrix(np.zeros(theta.shape)) #theta的维度的所有数据全部初始化为0
    parameters=int(theta.ravel().shape[1]) #ravel函数将theta的维度降为一维,shape[1]为列数
    cost=np.zeros(iters) #初始化代价,值为0的有iters个值的矩阵
    for i in range(iters):
        error=(X*theta.T)-y #预测值与实际值的误差,为72*1矩阵,放在大循环内小循环外,每次迭代后的theta进行了更新,error值随之变换。
        for j in range(parameters): #梯度下降重要步骤,根据公式将每个theta[j]的值下降一次
            term=np.multiply(error,X[:,j]) #error与第j列的向量对应位置相乘并最终求和,之前增加ones列用于与1相乘
            tempt[0,j]=theta[0,j]-((alpha/len(X))*(np.sum(term)))
        cost[i]=computeCost(X,y,tempt) #计算第i此迭代时此theta值的代价
        theta=tempt #将theta向量更新,进行下次迭代循环继续处理theta
    return theta,cost

alpha=0.01
iters=1500
g,cost=gradientDecent(X,y,theta,alpha,iters)
print("参数theta向量:")
print(g)
#已经做完了梯度下降,得出了参数值theta向量可以拟合假设函数的
predict1=(1,7)*g.T #g为1*2的参数向量,1*theta[0],7为population,*参数theta[1]得到预测值profit
print("预测值1:")
print(predict1)

做出拟合的预测函数图像。

#四、作图划线
x=np.linspace(data.Population.min(),data.Population.max(),100) #生成等差数列,100个等差点
f=g[0,0]+(g[0,1]*x) #f为假设函数,theta0+theta1*x
fig,ax=plt.subplots(figsize=(8,6)) #创建作图画布
ax.plot(x, f, 'r', label='Prediction') #画出线,红色,名为Prediction
ax.scatter(data.Population,data.Profit,label='training data') #scatter为散点图
ax.legend(loc=2) #在图上标明一个图例,用于说明每条曲线的文字显示,loc为第二象限
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

三、运行结果

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值