本博主博客:ζั͡ ั͡雾 ั͡狼 ั͡✾的博客
专栏:机器学习
专栏:爬虫
专栏:OpenCV图像识别处理
专栏:Unity2D
⭐本节课理论视频:
吴恩达P1-P4:机器学习理论概述
吴恩达P5-P11:线性回归算法原理
⭐推荐其他人笔记:【吴恩达机器学习笔记详解】第二章 线性回归的过程
机器学习通过文字描述是难以教学学会的,每一节课我会推荐这个理论的网课,一定要看上面的理论视频!一定要看上面的理论视频!一定要看上面的理论视频!所以我只是通过代码实现,并通过注释形式来详细讲述每一步的原因,最后通过画图对比的新式来看结果比较。
⭐机器学习推荐博主:GoAI
如果你什么都不懂机器学习,那我推荐GoAI的入门文章:机器学习知识点全面总结_GoAI的博客-CSDN博客_机器学习笔记
import numpy as np
import matplotlib.pyplot as plt
#全局变量
#随机生成数据
x = np.array(range(20)) # x轴数据生成1-20的整数
k = np.random.randint(-10, 10)
y = k * x + np.random.random(1) + 5 # y轴生成随机倍数的数据x加随机数(-1到1)加常数
# 列表长度
M =len(x)
# 赋予变量初始点
O1 =1
O2 =1
# 学习率,在代价函数斜率线上移动的距离步子大小
A = 0.01
# 迭代次数
time = 10000
def H(x):#假设函数,假设是个线性函数,斜率和截距不知道,是要回归算的变量
# y=O1x+O2#大写O是参数
global O1,O2
return O1*x+O2
#代价函数L=求和((H(x)-y(x))^2),其中H是关于O1,O2的函数
#代价函数就是你估算的值与实际值的差的大小,使得代价函数最小,这样就能不断逼近结果
#使得代价函数最小,就要使得初始点在斜率线上不断往低处移动,呈现出O1,O2俩个参数的不断微小移动
# 固定公式格式,推导原理看吴恩达P11
def dL_O1():#代价函数对O1参数求导的平均值
global x,y,M
ans=0
for i in range(M):
ans+=(H(x[i])-y[i])*x[i]#由于O1的系数是x,所以求导后还要乘x
return ans/M
def dL_O2():#代价函数对O2参数求导的平均值
global x,y,M
ans=0
for i in range(M):
ans+=(H(x[i])-y[i])
return ans/M
def itreation(time):#迭代,使O1,O2的代价函数趋于最低点
global O1,O2,M,A
for i in range(time):
dO1=A*dL_O1()#一次迭代中,O1变化程度
dO2=A*dL_O2()#一次迭代中,O2变化程度
#同时变化,减法原因是正斜率使得O更小,负斜率使得O更大,不断往低处移动即代价函数最小
O1=O1-dO1
O2=O2-dO2
if(i%100==0):#每100次输出一次
print(f"迭代了{i}次,O1:{O1},O2:{O2}")
if __name__=="__main__":
print(x)
print(y)
itreation(time)
print(O1,O2)
#绘图
x1=np.linspace(min(x),max(x),10)
y1=O1*x1+O2
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,5))
axes[0].scatter(x,y,s=3)
axes[1].plot(x1,y1)
axes[1].scatter(x,y,s=3,color="red")
plt.show()
拟合了几次都比较好