[从0开始机器学习]1.一元一次函数线性回归

本博主博客:ζั͡ ั͡雾 ั͡狼 ั͡✾的博客

专栏:机器学习

专栏:爬虫

专栏:OpenCV图像识别处理

专栏:Unity2D


⭐本节课理论视频:

吴恩达P1-P4:机器学习理论概述

吴恩达P5-P11:线性回归算法原理

⭐推荐其他人笔记:【吴恩达机器学习笔记详解】第二章 线性回归的过程

机器学习通过文字描述是难以教学学会的,每一节课我会推荐这个理论的网课,一定要看上面的理论视频!一定要看上面的理论视频一定要看上面的理论视频!所以我只是通过代码实现,并通过注释形式来详细讲述每一步的原因,最后通过画图对比的新式来看结果比较。

⭐机器学习推荐博主:GoAI

如果你什么都不懂机器学习,那我推荐GoAI的入门文章:机器学习知识点全面总结_GoAI的博客-CSDN博客_机器学习笔记

[从0开始机器学习]1.一元一次函数线性回归_第1张图片

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()

拟合了几次都比较好

[从0开始机器学习]1.一元一次函数线性回归_第2张图片

[从0开始机器学习]1.一元一次函数线性回归_第3张图片

 [从0开始机器学习]1.一元一次函数线性回归_第4张图片

你可能感兴趣的:(机器学习笔记,机器学习,python,梯度下降法,一元一次,线性回归)