线性回归——以一道等差数列的题为例

对于一组 xi 和 yi 计算线性回归方程的公式如下:
在这里插入图片描述
题目大意:给定一个数列,将其变成等差数列,修改的代价是在这里插入图片描述
求最小代价
在这里插入图片描述
直接套用上面的线性回归方程公式即可。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
const long long N = 3e5 + 5;
using namespace std;

namespace GTI //快读模板
{
    char gc(void)
    {
        const long long S = 1 << 16;
        static char buf[S], *s = buf, *t = buf;
        if (s == t) t = buf + fread(s = buf, 1, S, stdin);
        if (s == t) return EOF;
        return *s++;
    }
    long long gti(void)
    {
        long long a = 0, b = 1, c = gc();
        for (; !isdigit(c); c = gc())
            b ^= (c == '-');
        for (; isdigit(c); c = gc())
            a = a * 10 + c - '0';
        return b ? a : -a;
    }
}
using GTI::gti;

long long num[N];

signed main()
{
    long long T;
    T = gti();
    while (T--)
    {
        long long n = gti();
        long long sxy = 0, sx = 0, sy = 0, sx2 = 0;
        long double b, a, ans = 0;
        for (long long i = 1; i <= n; i++)
        {
            num[i] = gti();
            sxy += i * num[i];
            sx += i;
            sy += num[i];
            sx2 += i * i;
        }
        b = ((long double)n * sxy - (long double)sx * sy) / ((long double)n * sx2 - (long double)sx * sx);
        a = (long double)sy / n - b * sx / n;
        long double ai = a;
        for (long long i = 1; i <= n; i++)
        {
            ai += b;
            ans += (num[i] - ai) * (num[i] - ai);
        }
        printf("%.10lf\n", ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值