🐺本博主博客:ζั͡ ั͡雾 ั͡狼 ั͡✾的博客
🎀专栏:机器学习
🎀专栏:爬虫
🎀专栏:OpenCV图像识别处理
🎀专栏:Unity2D
⭐本节课理论视频:
⭐推荐其他人笔记:【吴恩达机器学习笔记详解】第二章 线性回归的过程
🐺机器学习通过文字描述是难以教学学会的,每一节课我会推荐这个理论的网课,一定要看上面的理论视频!一定要看上面的理论视频!一定要看上面的理论视频!所以我只是通过代码实现,并通过注释形式来详细讲述每一步的原因,最后通过画图对比的新式来看结果比较。
⭐机器学习推荐博主: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()
拟合了几次都比较好