zoukankan      html  css  js  c++  java
  • 梯度下降求解最小二乘

    最近烫金学长正在学习机器学习,我也抽闲时间上了会车~
    github
    (以下都是自己根据末尾文章不理解的地方瞎记录.

    梯度下降法

    求解一元线性

    梯度下降求解算法是一种迭代算法,即在求最小二乘的时候
    朝向梯形负方向(梯形正方向定义为增长速度最快)按照一定步长迭代下降
    直到符合我们的预期要求
    (步长也就是定义的学习率

    我们使用机器学习就是拟合我们所需要的方程,使它尽可能的符合预期的"模仿方程式"
    即对于一个一元线性方程,我们代入训练数据,使它每个数据点与预期点的差异越小就好啦~
    即对于y=ax+b,我们可以求ax+b-y作为代价函数(我们评判学习结果的依据模型)
    根据一系列的转换,我们可以得到下面关于一元方程偏导

    偏导公式结果

    然后就是使用代码翻译公式

    # encoding: utf-8
    from sklearn import linear_model
    
    alpha = 0.01
    # 精度设定
    epsilon = 1e-8
    # 目标函数y=2x+1
    x = [1., 2., 3., 4., 5., 6., 7., 8., 9.]
    y = [3., 5., 7., 9., 11., 13., 15., 17., 19.]
    
    # scikit-learn的求解方法
    def solve_by_scikit():
        # 使用scikit-learn求解
        # reg = linear_model.SGDClassifier(loss="hinge", penalty="l2")
        # reg.fit(x, y)
        print("暂无")
    
    
    # 采用梯度下降法求解一元线性回归
        def solve_by_gradient():
        # 获取循环的长度
        m = len(x)
        a, b, sse2 = 0, 0, 0
        while True:
            grad_a, grad_b = 0, 0
            for i in range(m):
                # 求(a*x(i)+b-y[i])的a,b偏导
                # 这里使用common感觉更好,公式相同处
                common = a * x[i] + b - y[i]
                grad_a += x[i] * common
                grad_b += common
    
                grad_a = grad_a / m
                grad_b = grad_b / m
    
                # 梯形下降(梯形负方向,速度下降最快)迭代求符合最小值的a,b
                # alpha设置迭代步长,即学习率
                a -= alpha * grad_a
                b -= alpha * grad_b
    
                sse = 0
                for j in range(m):
                    sse += (a * x[j] + b - y[j]) ** 2 / (2 * m)
                # 拟合结果判断相差绝对值
                if abs(sse2 - sse) < epsilon:
                    break
                else:
                    sse2 = sse
            print('{0} * x + {1}'.format(a, b))
    
    def main():
        try:
            print("scikit模拟结果:")
            solve_by_scikit()
            print("梯形下降模拟结果:")
            solve_by_gradient()
        except BaseException as e:
            print("
    =>错误: ", e)
    
    if __name__ == "__main__":
        main()
    

    结果

    求解多元

    待研究

    PS:机器学习方便还是很要求数学基础的,可以说都是数学问题~

    参考文章:梯度下降从放弃到入门
    梯度下降小结

  • 相关阅读:
    后端程序员之路 58、go wlog
    后端程序员之路 57、go json
    后端程序员之路 56、go package
    后端程序员之路 55、go redis
    后端程序员之路 54、go 日志库
    后端程序员之路 53、A Tour of Go-3
    后端程序员之路 52、A Tour of Go-2
    后端程序员之路 51、A Tour of Go-1
    后端程序员之路 50、Go语言开发环境
    后端程序员之路 49、SSDB
  • 原文地址:https://www.cnblogs.com/bay1/p/10982522.html
Copyright © 2011-2022 走看看