当前位置: 首页 > 知识库问答 >
问题:

使用梯度下降实现线性回归

尹欣怿
2023-03-14

我试图实现梯度下降的线性回归,如本文(https://towardsdatascience.com/linear-regression-using-gradient-descent-97a6c8700931)所述。我已经严格遵循了实现,但是经过几次迭代后,我的结果会溢出。我试图得到这个结果大约: y=-0.02x 8499.6。

代码

package main

import (
    "encoding/csv"
    "fmt"
    "strconv"
    "strings"
)

const (
    iterations = 1000
    learningRate = 0.0001
)

func computePrice(m, x, c float64) float64 {
    return m * x + c
}

func computeThetas(data [][]float64, m, c float64) (float64, float64) {
    N := float64(len(data))
    dm, dc := 0.0, 0.0
    for _, dataField := range data {
        x := dataField[0]
        y := dataField[1]
        yPred := computePrice(m, x, c)
        dm += (y - yPred) * x
        dc += y - yPred
    }

    dm *= -2/N
    dc *= -2/N
    return m - learningRate * dm, c - learningRate * dc
}

func main() {
    data := readXY()
    m, c := 0.0, 0.0
    for k := 0; k < iterations; k++ {
        m, c = computeThetas(data, m, c)
    }
    fmt.Printf("%.4fx + %.4f\n", m, c)
}

func readXY() ([][]float64) {
    file := strings.NewReader(data)

    reader := csv.NewReader(file)
    records, err := reader.ReadAll()
    if err != nil {
        panic(err)
    }
    records = records[1:]
    size := len(records)
    data := make([][]float64, size)
    for i, v := range records {
        val1, err := strconv.ParseFloat(v[0], 64)
        if err != nil {
            panic(err)
        }
        val2, err := strconv.ParseFloat(v[1], 64)
        if err != nil {
            panic(err)
        }
        data[i] = []float64{val1, val2}
    }
    return data
}

var data = `km,price
240000,3650
139800,3800
150500,4400
185530,4450
176000,5250
114800,5350
166800,5800
89000,5990
144500,5999
84000,6200
82029,6390
63060,6390
74000,6600
97500,6800
67000,6800
76025,6900
48235,6900
93000,6990
60949,7490
65674,7555
54000,7990
68500,7990
22899,7990
61789,8290`

在这里,它可以在围棋场上工作:https://play.golang.org/p/2CdNbk9_WeY

我需要修正什么才能得到正确的结果?

共有1个答案

古棋
2023-03-14

为什么公式只适用于一个数据集而不适用于另一个数据集?

除了sascha的评论之外,这里还有另一种看待梯度下降应用问题的方法:该算法不能保证迭代产生比前一次更好的结果,因此它不一定会收敛到一个结果,因为:

  • mc中的梯度dmdc彼此独立处理<根据dm在下降方向上更新code>m,同时根据dc在下降方向上更新c-但是,对于某些曲面z=f(m,c),轴mc之间方向上的梯度可以与mc本身具有相反的符号,因此,当更新mc中的任何一个时,更新两者都会偏离最佳值
 类似资料:
  • 我正在学习机器学习/线性回归的Coursera课程。下面是他们如何描述用于求解估计OLS系数的梯度下降算法: 因此,他们对系数使用,对设计矩阵(或他们称之为特征)使用,对因变量使用。它们的收敛准则通常是RSS梯度的范数小于容差ε;也就是说,他们对“不收敛”的定义是: 我很难让这个算法收敛,我想知道在我的实现中是否忽略了一些东西。下面是代码。请注意,我还通过statsmodels回归库运行了我在其中

  • 我试图在java中实现线性回归。我的假设是θ0θ1*x[i]。我试图计算θ0和θ1的值,使成本函数最小。我正在用梯度下降来找出值- 在 在收敛之前,这种重复是什么?我知道这是局部最小值,但我应该在while循环中输入的确切代码是什么? 我对机器学习非常陌生,刚开始编写基本的算法以获得更好的理解。任何帮助都将不胜感激。

  • 我试图在MatLab中实现一个函数,该函数使用牛顿法计算最佳线性回归。然而,我陷入了一个问题。我不知道如何求二阶导数。所以我不能实施它。这是我的密码。 谢谢你的帮助。 编辑:: 我用一些纸和笔解决了这个问题。你所需要的只是一些微积分和矩阵运算。我找到了二阶导数,它现在正在工作。我正在为感兴趣的人分享我的工作代码。

  • 我用JavaScript实现了一个非常简单的线性回归和梯度下降算法,但是在查阅了多个源代码并尝试了几件事情之后,我无法使它收敛。 数据是绝对线性的,只是数字0到30作为输入,x*3作为正确的输出来学习。 这就是梯度下降背后的逻辑: 我从不同的地方取了公式,包括: 乌达城深度学习基金会纳米学位的练习 吴恩达的线性回归梯度下降课程(也在这里) 斯坦福CS229讲义 我从卡内基梅隆大学找到的其他PDF幻

  • 好的,那么这个算法到底意味着什么呢? 据我所知: i) 阿尔法:梯度下降的步骤有多大。 ii)现在,∑{hTheta[x(i)]-y(i)}:指给定θ值的总误差。 误差是指预测值{hTheta[x(i)]}与实际值之间的差值。[y(i)] σ{hTheta[x(i)]-y(i)}给出了所有训练示例中所有误差的总和。 结尾的Xj^(i)代表什么? 在为多元线性回归实现梯度下降时,我们是否在执行以下操

  • 在机器学习课程https://share.coursera.org/wiki/index.php/ML:Linear_Regression_with_Multiple_Variables#Gradient_Descent_for_Multiple_Variables中,它说梯度下降应该收敛。 我正在使用scikit学习的线性回归。它不提供梯度下降信息。我已经看到了许多关于stackoverflow