• 机器学习-线性回归 二维问题


    线性回归算法是基于已知样本并在已知样本数据范围内预测的一种监督学习算法

    线性回归的特点:目标预测的是连续的数值

    二维问题中,在训练样本中,需要学习映射函数f(x) 表达y

    设f(x) = ax+b, 用一条直线来拟合样本数据

    三位问题中,设预测函数 h(θ) = θ0+θ1*x1+θ2*x2

    则在n为问题中,预测函数为:h(θ)=\sum(ci*xi )=y

    为了评估预测结果的准确度,通过Gradient Descent(梯度下降算法),最小化损失函数,来确定参数值,最终将参数带入计算。

    损失函数= J(θ)=1/2m * \sum [hθ(χ(i))-y(i)]^2

    while(min_θj>θj){ //一直重复,知道求出来的

            θj :=θj-α*(σ/σθj)J(θ)

    },其中损失函数求偏导的步骤为:

    θj′: = θj+(𝑦𝑖-hθ(𝑋𝑖))𝑋𝑗𝑖

    =[ 1/2𝑚 * θ𝑗𝑋𝑖+θ0−𝑦𝑖^2]′   (对θj进行求导)

    误差:真实值和预测值之间存在的差异ε            对于每个样本: y(i) = θ^Tx(i)+ε(i)

    误差ε(i)是独立具有相同的分布,并且服从均值为0方差为θ^2的高斯分布(大部分数据方差分布趋向于0 )

    损失函数:把模型关于单个样本预测值与真实值的差称为损失

    通过使损失函数最小,来寻找最优权重参数

    最小二乘法表示:  J(θ) = 1/2 𝑘=0𝑚𝑦𝑖−θT𝑥(𝑖)2

    目标函数:J(θ) = 1/2 (Xθ-y)^T * (Xθ-y)

    对θ求偏导:

    令 偏导为0,即𝑋𝑇*𝑋θ=𝑋𝑇y  =>  θ=(𝑋𝑇𝑋)−1𝑋𝑇y      (不一定成立)

    梯度下降算法

    按照目标函数学习,朝着这个方向一步步完成迭代优化

    注:梯度下降公式中 i 是对所有样本进行迭代,j是当前第j个参数位置对应的xj

    学习率:对结果产生巨大影响

    批量梯度下降:容易得到最优解,但需要考虑所有样本,速度较慢

    随机梯度下降:每次找一个样本,迭代速度快,但不一定每次都向收敛方向
    θj′: = θj+(y^i-hθ(X^i))*Xj^i
    随机梯度下降:每次找一个样本,迭代速度快,但不一定每次都向收敛方向
    θj′: = θj+(y^i-hθ(X^i))*Xj^i

    小批量梯度下降:每次更新选择一小部分数据训练

    θj′: = θj-α110𝑘=𝜄𝜄+9hθ(𝑋𝑘)−𝑦𝑖𝑋𝑗𝑖   𝑋𝑗𝑖 为第j个参数对应的样本所有𝑋𝑗的数据

     直到θj迭代到最低点即为最优解参数,将θj与测试数据代入预测函数得到预测标签

    则损失函数可简化为:J(w) = (a*w^2 - 2bw + c)/m

    代码实现:

    1. list_x = [ 1.5, 2.5, 3.0, 4.5, 5.0, 5.5, 6.5, 8.5, 9.0, 9.5, 10.5, 12.0, 13.0, 14.5, 15.0, 16.5, 16.5, 18.0, 19.0,20.5]
    2. list_y = [ 4.0, 8.0, 9.0, 13.5, 15.0, 16.0, 19.0, 25.0, 27.0, 28.0, 32.0, 35.5, 38.5, 43.0, 45.0, 49.5, 50.0, 54.5, 57.5,61.0]
    3. print("训练样本X: ",list_x)
    4. print("训练样本Y: ",list_y)
    5. def max_k():
    6. max_k = 0.0
    7. for i in range(0,len(list_x)):
    8. temp_k = list_y[i]/list_x[i]
    9. if(temp_k>max_k):
    10. max_k = temp_k
    11. return max_k
    12. max_k = max_k()
    13. print(max_k)
    14. list_e = []
    15. list_w = []
    16. step = 0.1
    17. def costFunction(): #最小二乘法
    18. a = 0 b = 0 c = 0
    19. for i in range (0,20):
    20. a += list_x[i]*list_x[i]
    21. b += list_x[i]*list_y[i]
    22. c += list_y[i]*list_y[i]
    23. return a,b,c
    24. a,b,c = costFunction() # 计算损失函数系数项
    25. def gradientDescent():
    26. w = 0.0
    27. n = len(list_x)
    28. while(w
    29. e = (a*pow(w,2)-2*b*w+c)/2
    30. list_e.append(e)
    31. list_w.append(w)
    32. w+=step
    33. print("权值列表: ", list_w)
    34. print("代价函数列表: ", list_e)
    35. print("最小代价值位置: ", list_e.index(min(list_e)))
    36. print("最小代价值参数: ", list_w[list_e.index(min(list_e))])
    37. return list_w[list_e.index(min(list_e))]
    38. result = gradientDescent()
    39. def test():
    40. input_x = 11.0
    41. input_y = result*input_x
    42. print("测试样本: ",input_x)
    43. print("测试结果: ",input_y)
    44. test()

  • 相关阅读:
    季涨约3~8%,DRAM合约价大幅回升 | 百能云芯
    CSS必学:元素之间的空白与行内块的幽灵空白问题
    docker系列(9) - docker-compose
    【配电网】基于MATLAB的Newton-Raphson法电力系统潮流计算
    函数绘图仪 MathGrafix 12.1 Crack
    第七天项目实战一
    Java并发编程——线程间通信
    阿里云OSS上传文件超时 探测工具排查方法
    人民艺术家梁永和丹青传情新时代
    vue3 setup语法糖 搜索
  • 原文地址:https://blog.csdn.net/qq_37504771/article/details/125126087