V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Richard14
V2EX  ›  程序员

有没有数学和算法好的朋友,计算线性回归用啥算法最快?

  •  
  •   Richard14 · 2023-11-12 14:18:13 +08:00 · 2823 次点击
    这是一个创建于 381 天前的主题,其中的信息可能已经有所发展或是发生改变。

    题目要求简单线性回归,也就是给一组二维坐标,比如[0,1],[2,2],[5,4]...等等,然后求出对应在直角坐标系里的回归的直线的斜率和截距即可。

    上网查了查,资料说有啥最小二乘法,牛顿法,梯度下降法等等,说实话公式一个也没看懂。初中数学给的那个线性回归公式倒是看懂了,算起来也挺简单的。从计算效率角度讲,具体算的时候用哪种方法比较快?

    17 条回复    2023-11-14 10:12:38 +08:00
    billlee
        1
    billlee  
       2023-11-12 14:48:50 +08:00
    你这个一维模型应该是最小二乘法快吧,不过一维模型真的需要考虑效率问题吗?不是随便算都行
    ranaanna
        2
    ranaanna  
       2023-11-12 14:48:53 +08:00
    这么简单的线性回归问题,当然是最小二乘法罗。以前做实验的时候数据少都是手工或者用计算器算的。用电脑算实在是完全不在话下,现在流行机器学习人工智能什么的,海量的线性回归都没有问题,更不要说这么简单的。那些高斯牛顿法梯度下降法什么的是用来求函数最小值问题的,当然就不限于线性问题了,用来处理非线性最小二乘问题比较合适。这么简单的问题就先不要考虑那种方法比较快了
    iorilu
        3
    iorilu  
       2023-11-12 14:50:58 +08:00
    线性回归, 直接调公式就出来啊, 不用迭代

    公式任何一个线性代数库都
    dayeye2006199
        4
    dayeye2006199  
       2023-11-12 14:57:59 +08:00   ❤️ 1
    (X^T X)^-1 X^T Y
    矩阵乘法直接撸就行
    LykorisR
        5
    LykorisR  
       2023-11-12 16:38:26 +08:00
    最小二乘法,Ax=b, x=(A^TA)^-1*A^Tb
    iOCZS
        6
    iOCZS  
       2023-11-12 17:07:25 +08:00
    数学计算的话,用最小二乘法就行了。
    写代码的话,梯度下降这种迭代思想容易写成代码。
    gpt5
        7
    gpt5  
       2023-11-12 17:14:40 +08:00   ❤️ 1
    一般来说,自己手写的,都不如调包快。
    特别是久经优化和考验的包。
    lithiumii
        8
    lithiumii  
       2023-11-12 17:43:15 +08:00 via Android
    只要结果的话矩阵运算最快,需要各种参数(什么 t 啊 p 啊 f 啊之类的)调包快
    ruxuan1306
        9
    ruxuan1306  
       2023-11-12 17:52:43 +08:00
    Excel-数据分析-回归

    ruxuan1306
        10
    ruxuan1306  
       2023-11-12 17:54:17 +08:00
    哦不好意思没注意,原来是在对比计算机运行的效率,不是人算出结果的效率
    jc89898
        11
    jc89898  
       2023-11-12 20:08:36 +08:00
    @dayeye2006199 你这个有很大的问题,一般都是近似法,直接计算 inverse 对大 matrix 根本不行
    t133
        12
    t133  
       2023-11-12 22:47:25 +08:00 via iPhone
    @jc89898 解线性方程可以用 CG 需要 vector matrix multiplication.
    也可以用 cholesky decomposition
    YsHaNg
        13
    YsHaNg  
       2023-11-13 06:39:29 +08:00
    svd 有 c 接口用 eigen 直接调用
    dun2
        14
    dun2  
       2023-11-13 09:44:30 +08:00
    python 走起..

    ```
    import numpy as np
    from sklearn.linear_model import LinearRegression

    x = np.array([0, 2, 5]).reshape(-1, 1)
    y = np.array([1, 2, 4])

    model = LinearRegression()

    model.fit(x, y)

    print(f"斜率:", model.coef_[0])
    print(f"截距:", model.intercept_)
    ```
    sakura6264
        15
    sakura6264  
       2023-11-13 14:24:47 +08:00
    最小二乘比较快吧。
    真特别追求效率可以把演算挪到 GPU 上
    vvhy
        16
    vvhy  
       2023-11-13 21:41:15 +08:00
    单变量线性回归,“初中方法”就好了啊,反正都是 O(n),区别不大,用最简单的就行了
    rogerer
        17
    rogerer  
       2023-11-14 10:12:38 +08:00 via iPhone
    最小二乘法因为涉及到矩阵运算 在高维的时候效率比较低
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3761 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:40 · PVG 18:40 · LAX 02:40 · JFK 05:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.