线性回归1.0.1

  Oh my god!居然有人看我的博文!所以,我加上了注释,并做了一点修改。

#include <iostream>
using namespace std;

double w = 0.0001;           // 最小误差     
double r = 0.00001;          // 步长(学习效率)
double a = 1.0,b = 0.0;      // 权重,偏置值

// 数学模型
double f(double x)
{
    double res;
    
    res = a*x + b;           
    
    return res;
}

// 训练
void df(double x,double y)
{   
    double t1,t2;            // t1:a增加r时,预测值与实际值的差距;t2:b增加r时,预测值与实际值的差距  
    int n;                   // 改变符号的作用
    
    // 用max函数代替了绝对值函数(主要是想不起来了)
    // 重复修改权重与偏置值直到预测值与实际值的差距小于最小误差
    while(max((f(x) - y),(y - f(x))) > w)      
    {
        cout << "errors:" << max((f(x)-y),(y-f(x))) << " a:" << a << " b:" << b << endl;
        
        if(f(x) < y)         // 预测值比正确值小
        {
            n = 1.0;         // 权重,偏置值要增加
        }
        else                 // 预测值比正确值大
        {
            n = -1.0;        // 权重,偏置值要减少
        }
        
        t1 = max(((f(x)+x*r*n) - y),(y - (f(x)+x*r*n))); 
        t2 = max(((f(x)+r*n) - y),(y - (f(x)+r*n))); 

        // 更快的接近真实值
        if(t1 < t2)         
        {
            a += r*n;
        }   
        else
        {
            b += r*n;
        }
    }

    cout << "Train over!" << endl;      
}

int main()
{
    string s;          
    double x,y;
    
    // 重复进行训练与预测,输入over结束
    while(true)
    {
        cin >> s;
        if(s == "in")
        {
            cin >> x >> y;
            df(x,y);
        }
        else if(s == "out")
        {
            cin >> x;       
            cout << f(x) << endl;
        }
        else if(s == "over")
        {
            return 0;
        }
        else
        {
            cout << "Error";
        }
    }
}

训练:

输入格式

in x y

预测:

输入格式

out x

控制台会输出预测的y。

我的思路是否正确,恳请大佬指教。最主要是我看到的教程,一开始就在讲之后可能遇见的问题,我看得一愣一愣的,只能靠自己的理解写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值