C++实现

  • 代码实现

“linear_regression.h”

//单变量线性回归模型
struct elem_var1
{double x, y;           //训练集元素数据:自变量、因变量
};class var1_lin_reg
{
public:var1_lin_reg(const elem_var1* p, int size, double rate);     //初始化~var1_lin_reg();                                             //析构double cost_fuction();                                       //返回当前预测方程对应代价函数的值void update();                                               //同时更新方程参数void find();                                                 //最小化代价函数,找到收敛点时对应的方程参数void get_par(double &_par1, double &_par0);                  //获得当前方程的参数double est_val(double x);                                    //使用拟合后的回归方程进行预测private:const elem_var1 * tran_set;        //训练集int setsize;                       //训练集数据量double par1, par0;                 //单变量线性回归方程:h(x)=par1*x+par0double learn_rate;                 //学习速率
};

“linear_regression.cpp”

//单变量线性回归
var1_lin_reg::var1_lin_reg(const elem_var1* p, int size, double rate)
{//参数列表:训练集数组地址,训练集数据量,学习速率setsize = size;           //获取训练集大小tran_set = p;             //指针指向训练集数组learn_rate = rate;        //设置学习速率par1 = 0;                 //线性回归方程参数初始化为0par0 = 0;
}var1_lin_reg::~var1_lin_reg()
{tran_set = NULL;setsize = 0;
}double var1_lin_reg::cost_fuction()
{//假设函数为h(x)=kx+bdouble hx, sum = 0;for (int i = 0;i < setsize;i++){hx = par1 * tran_set[i].x + par0;sum += (hx - tran_set[i].y)*(hx - tran_set[i].y);}return (sum / 2.0 / setsize);
}void var1_lin_reg::update()
{//两参数(par0和par1)同时更新(关键是对微分项的处理)double hx, sum0 = 0, sum1 = 0;for (int i = 0;i < setsize;i++){hx = par1 * tran_set[i].x + par0;sum0 += hx - tran_set[i].y;sum1 += (hx - tran_set[i].y)*tran_set[i].x;}sum0 = learn_rate * sum0 / (double)setsize;sum1 = learn_rate * sum1 / (double)setsize;par0 -= sum0;par1 -= sum1;
}void var1_lin_reg::find()
{//寻找代价函数最小化时对应的单变量线性回归函数的参数(代价函数收敛点)double cost_pre, cost_last;cost_pre = cost_fuction();update();                      //更新参数cost_last = cost_fuction();while (cost_pre != cost_last){//寻找收敛点cost_pre = cost_last;update();cost_last = cost_fuction();}//获得假设函数最优拟合时的参数
}void var1_lin_reg::get_par(double &_par1,double &_par0)
{//获取回归方程参数_par1 = par1;_par0 = par0;
}double var1_lin_reg::est_val(double x)
{//返回预测值find();               //获得假设函数最优拟合时的参数  double hx;hx = par1 * x + par0; //计算估计值return hx;
}

“主函数部分”

#include "linear_regression.h"using namespace std;int main()
{elem_var1 transet[200];memset(transet, 0, sizeof(transet));int size;double x;double par1, par0;cout << "请输入训练集容量:";cin >> size;cout << "请输入训练集数据:" << endl;for (int i = 0;i < size;i++){cout << "数据项" << i + 1 << ":  ";cin >> transet[i].x >> transet[i].y;}var1_lin_reg obj1(transet, size, 0.001);cout << "请输入待预测数据:";cin >> x;cout << "预测数据为:" << obj1.est_val(x) << endl;obj1.get_par(par1, par0);if(par0>0)cout << "h(x)=" << par1 << "*x+" << par0 << endl;else{if(par0<0)cout << "h(x)=" << par1 << "*x" << par0 << endl;elsecout << "h(x)=" << par1 << "*x" << endl;}return 0;
}

-运行结果
以吴恩达老师的ex1data1.txt数据集为例:
用octave数据可视化:

线性拟合应该还可以。。。。。。

吴恩达机器学习之单变量线性回归实现部分相关推荐

  1. 吴恩达机器学习2——单变量线性回归

    吴恩达机器学习2--单变量线性回归 监督学习工作模式 训练集中同时给出了输入输出,即人为标注的"正确结果"喂给学习算法,得到一个函数h,h 可以根据输入的x得到一个y,因此h是x到 ...

  2. 吴恩达机器学习1——单变量线性回归、梯度下降

    目录 吴恩达机器学习第一周 一.什么是机器学习? 二.机器学习的分类 1. 监督学习 2. 非监督学习 3. 监督学习和非监督学习的举例 三.单变量线性回归(**Linear Regression w ...

  3. 吴恩达机器学习之单变量线性回归理论部分

    理论部分 1.方程形式 在进行数据处理过程中,有时数据图像可拟合成单变量线性函数,即 2.如何拟合 此时,我们虽知道拟合函数的形式,但如何拟合仍是个问题,怎样拟合可以最接近实际数据情况呢? 最小二乘法 ...

  4. 吴恩达机器学习训练1:线性回归(多变量)

    吴恩达机器学习训练1:线性回归(多变量) 本小节为练习1中选做题,为多变量(多特征参数)的线性回归计算. 还是预测房价的例子,假设已经两个特征参数,分别是房子的尺寸和卧室的数量,在数据的第一列和第二列 ...

  5. Linear Regression 吴恩达机器学习实验一(线性回归)

    Linear Regression with one variable 实验要求 """ 在这部分练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润. 假设你是一 ...

  6. 吴恩达机器学习笔记 —— 5 多变量线性回归

    http://www.cnblogs.com/xing901022/p/9321045.html 本篇主要讲的是多变量的线性回归,从表达式的构建到矩阵的表示方法,再到损失函数和梯度下降求解方法,再到特 ...

  7. 吴恩达机器学习ex5:正则化线性回归和方差与偏差

    1.正则化线性回归 1.1.数据集的可视化 训练数据集:X表示水位变化的历史记录,y表示流出大坝的水量: 交叉验证数据集:Xval,yval: 测试数据集:Xtest,ytest: 其中,训练数据集1 ...

  8. 用懊悔法学习吴恩达机器学习【2】-----线性回归的梯度下降

    以下英文文档皆出自课程配套笔记 课9 代价函数二 这一课时考虑使用两个参数来描述代价函数.此时等价函数是一个碗形,碗底点为最小值,将碗形用等高线表示,等高线中心就是代价函数的最小值.所以距离等高线中心 ...

  9. 吴恩达机器学习(六)线性回归的梯度下降

    文章目录 1.先导知识 2.线性回归的梯度下降 1.先导知识 之前学习的内容: 2.线性回归的梯度下降 我们要做的是将梯度下降法应用到最小化平方差代价函数, 我们解决过的梯度下降问题之一就是它容易陷入 ...

最新文章

  1. 微软洪小文:制造业是最先享受AI成果的领域
  2. OPENCV已知内参求外参
  3. 如何生成表_SPSS简单操作 | 如何生成交叉表?
  4. python爬虫requests-Python爬虫之requests介绍
  5. iOS应用跳转qq指定联系人聊天
  6. Boost:双图bimap与mi_bidirectional地图的测试程序
  7. python通过内置函数测试对象类型_Python的内置函数
  8. ListT.Find用法学习
  9. 高德,百度,Google地图定位偏移以及坐标系转换
  10. FPGA常用FIFO简介
  11. 智慧树omg期末测试答案_智慧树求职omg第十五章节测试答案
  12. 泛函分析笔记(十七) 弱偏导数
  13. 断章取义:时光不负有心人
  14. LDO和BUCK降压稳压器对比
  15. 技术之路如何成长而不迷茫
  16. 和平精英电脑版服务器未响应,和平精英电脑版为什么卡顿 电脑版卡顿解决方法...
  17. 2021年江苏省高考成绩查询时间,2021年江苏高考成绩什么时候出来 公布时间
  18. XML中配置网易云歌手详情滑动效果
  19. mac壁纸文件夹没有怎么办?mac动态壁纸怎么设置
  20. php解析视频_【教程】php实现百度网盘视频解析

热门文章

  1. 第18章 Redis数据结构常用命令
  2. 在频域上,随机接入前导占用()个资源块对应的带宽
  3. linux安装配置nginx
  4. NYOJ-71-独木舟上的旅行
  5. C语言之do_while输出菱形
  6. UOJ276 [清华集训2016] 汽水 【二分答案】【点分治】【树状数组】
  7. APPIUM+Python+HTMLTestRunner(转)
  8. ie6的png24问题
  9. 软件工程设计之四则运算
  10. Leetcode - 广度优先遍历专题