线性回归(最小二乘法、批量梯度下降法、随机梯度下降法、局部加权线性回归) C++
We turn next to the task of finding a weight vector w which minimizes the chosen function E(w).
Because there is clearly no hope of finding an anlytical solution to the equation ∂E(w)=0, we resort to
iterative numerical procedures.
On-line gradient descent, also known as sequential gradient descent or stochastic gradient descent, makes
an update to the weight vector based on one data point at a time.
One advantage of on-line methods compared to batch methods is that the former handle redundancy in the data
much more efficiently. Another property of on-line gradient descent is the possibility of escaping from local minima,
since a stationary point with respect to the error function for the whole data set will generally not be a stationary point
for each data point individually.
Another advantage of on-line learning is the fact that it requires much less storage than batch learning.
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cfloat>
#include <cmath>
double dis(double &train, double &query) {
double weight=exp(-0.5*pow(train-query, 2));
return weight;
}
/*最小二乘法*/
template <typename PairIterator>
bool GetLinearFit(PairIterator begin_it, PairIterator end_it, double& slope, double& y_intercept) {
if(begin_it==end_it) {
return false;
}
size_t n=end_it-begin_it;
double sum_x2=0.0,sum_y=0.0,sum_x=0.0,sum_xy=0.0;
for(PairIterator it=begin_it;it!=end_it;++it) {
sum_x2+=(it->first)*(it->first);
sum_y+=it->second;
sum_x+=it->first;
sum_xy+=(it->first)*(it->second);
}
slope=(n*sum_xy-sum_x*sum_y)/(n*sum_x2-sum_x*sum_x);
y_intercept=(sum_x2*sum_y-sum_x*sum_xy)/(n*sum_x2-sum_x*sum_x);
return true;
}
/*locally weighted linear regression(LWR)*/
template<typename PairIterator>
bool LWR(PairIterator begin_it, PairIterator end_it, double& slope, double& y_intercept) {
if(begin_it==end_it) {
return false;
}
/*x are the data points for each local regression model. They are usually (but not always) the data points in your sample.*/
double query=5.5;
size_t n=end_it-begin_it;
double J=0.0;
for(PairIterator it=begin_it;it!=end_it;++it) {
J+=(y_intercept+slope*(it->first)-it->second)*(y_intercept+slope*(it->first)-it->second)*dis(it->first, query);
}
J=J*0.5/n;
while(true) {
double temp0=0,temp1=0;
for(PairIterator it=begin_it;it!=end_it;++it) {
temp0+=(y_intercept+slope*(it->first)-it->second)*dis(it->first, query);
temp1+=(y_intercept+slope*(it->first)-it->second)*(it->first)*dis(it->first, query);
}
temp0=temp0/n;
temp1=temp1/n;
/*0.03为学习率阿尔法*/
y_intercept=y_intercept-0.03*temp0;
slope=slope-0.03*temp1;
double MSE=0.0;
for(PairIterator it=begin_it;it!=end_it;++it) {
MSE+=(y_intercept+slope*(it->first)-it->second)*(y_intercept+slope*(it->first)-it->second)*dis(it->first, query);
}
MSE=0.5*MSE/n;
if(std::abs(J-MSE)<0.00000001)
break;
J=MSE;
}
return true;
}
/*批量梯度下降法,Batch Gradient Desscent,BGD*/
template<typename PairIterator>
bool BatchGradientDescent(PairIterator begin_it, PairIterator end_it, double& slope, double& y_intercept) {
if(begin_it==end_it) {
return false;
}
size_t n=end_it-begin_it;
double J=0.0;
/*the initial cost function*/
for(PairIterator it=begin_it;it!=end_it;++it) {
J+=(y_intercept+slope*(it->first)-it->second)*(y_intercept+slope*(it->first)-it->second);
}
J=J*0.5/n;
while(true) {
double temp0=0,temp1=0;
for(PairIterator it=begin_it;it!=end_it;++it) {
temp0+=(y_intercept+slope*(it->first)-it->second);
temp1+=(y_intercept+slope*(it->first)-it->second)*(it->first);
}
temp0=temp0/n;
temp1=temp1/n;
/*0.03为学习率阿尔法*/
y_intercept=y_intercept-0.03*temp0;
slope=slope-0.03*temp1;
double MSE=0.0;
for(PairIterator it=begin_it;it!=end_it;++it) {
MSE+=(y_intercept+slope*(it->first)-it->second)*(y_intercept+slope*(it->first)-it->second);
}
MSE=0.5*MSE/n;
if(std::abs(J-MSE)<0.00000001)
break;
J=MSE;
}
return true;
}
/*随机梯度下降法,Stochastic Gradient Desscent,SGD*/
template<typename PairIterator>
bool StochasticGradientDescent(PairIterator begin_it, PairIterator end_it, double& slope, double& y_intercept) {
if(begin_it==end_it) {
return false;
}
size_t n=end_it-begin_it;
double J=0.0;
/*the initial cost function*/
for(PairIterator it=begin_it;it!=end_it;++it) {
J+=(y_intercept+slope*(it->first)-it->second)*(y_intercept+slope*(it->first)-it->second);
}
J=0.5*J/n;
while(true) {
double temp0=0,temp1=0;
for(PairIterator it=begin_it;it!=end_it;++it) {
temp0=(y_intercept+slope*(it->first)-it->second);
temp1=(y_intercept+slope*(it->first)-it->second)*(it->first);
/*0.03为学习率阿尔法*/
y_intercept=y_intercept-0.03*temp0;
slope=slope-0.03*temp1;
double MSE=0.0;
for(PairIterator it=begin_it;it!=end_it;++it) {
MSE+=(y_intercept+slope*(it->first)-it->second)*(y_intercept+slope*(it->first)-it->second);
}
MSE=0.5*MSE/n;
if(std::abs(J-MSE)<0.00000001)
break;
J=MSE;
}
break;
}
return true;
}
int main() {
std::ifstream in;
in.open("ex2x.dat");
if(!in) {
std::cout<<"open file ex2x.dat failed!"<<std::endl;
return 1;
}
std::vector<double> datax,datay;
double temp;
while(in>>temp) {
datax.push_back(temp);
}
in.close();
in.open("ex2y.dat");
if(!in) {
std::cout<<"open file ex2y.dat failed!"<<std::endl;
return 1;
}
while(in>>temp) {
datay.push_back(temp);
}
std::vector<std::pair<double, double> > data;
for(std::vector<double>::const_iterator iterx=datax.begin(),itery=datay.begin();iterx!=datax.end(),itery!=datay.end();iterx++,itery++) {
data.push_back(std::pair<double,double>(*iterx,*itery));
}
in.close();
double slope=0.0;
double y_intercept=0.0;
GetLinearFit(data.begin(),data.end(),slope,y_intercept);
std::cout<<"最小二乘法得到的结果:"<<std::endl;
std::cout<<"slope: "<<slope<<std::endl;
std::cout<<"y_intercept: "<<y_intercept<<std::endl;
slope=1.0,y_intercept=1.0;
BatchGradientDescent(data.begin(),data.end(),slope,y_intercept);
std::cout<<"批量梯度下降法得到的结果:"<<std::endl;
std::cout<<"slope: "<<slope<<std::endl;
std::cout<<"y_intercept: "<<y_intercept<<std::endl;
slope=1.0,y_intercept=1.0;
StochasticGradientDescent(data.begin(),data.end(),slope,y_intercept);
std::cout<<"随机梯度下降法得到的结果:"<<std::endl;
std::cout<<"slope: "<<slope<<std::endl;
std::cout<<"y_intercept: "<<y_intercept<<std::endl;
slope=1.0,y_intercept=1.0;
LWR(data.begin(),data.end(),slope,y_intercept);
std::cout<<"locally weighted linear regression 得到的结果:"<<std::endl;
std::cout<<"slope: "<<slope<<std::endl;
std::cout<<"y_intercept: "<<y_intercept<<std::endl;
return 0;
}
线性回归(最小二乘法、批量梯度下降法、随机梯度下降法、局部加权线性回归) C++的更多相关文章
- Locally Weighted Linear Regression 局部加权线性回归-R实现
局部加权线性回归 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. 线性回归容易出现过拟合或欠拟合的问 ...
- Locally weighted linear regression(局部加权线性回归)
(整理自AndrewNG的课件,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 前面几篇博客主要介绍了线性回归的学习算法,那么它有什么不足的地方么 ...
- 局部加权线性回归(Locally weighted linear regression)
首先我们来看一个线性回归的问题,在下面的例子中,我们选取不同维度的特征来对我们的数据进行拟合. 对于上面三个图像做如下解释: 选取一个特征,来拟合数据,可以看出来拟合情况并不是很好,有些数据误差还是比 ...
- 梯度下降&随机梯度下降&批梯度下降
梯度下降法 下面的h(x)是要拟合的函数,J(θ)损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数h(θ)就出来了.其中m是训练集的记录条数,j是参数的个数. 梯 ...
- matlab练习程序(局部加权线性回归)
通常我们使用的最小二乘都需要预先设定一个模型,然后通过最小二乘方法解出模型的系数. 而大多数情况是我们是不知道这个模型的,比如这篇博客中z=ax^2+by^2+cxy+dx+ey+f 这样的模型. 局 ...
- sklearn中实现随机梯度下降法(多元线性回归)
sklearn中实现随机梯度下降法 随机梯度下降法是一种根据模拟退火的原理对损失函数进行最小化的一种计算方式,在sklearn中主要用于多元线性回归算法中,是一种比较高效的最优化方法,其中的梯度下降系 ...
- NN优化方法对照:梯度下降、随机梯度下降和批量梯度下降
1.前言 这几种方法呢都是在求最优解中常常出现的方法,主要是应用迭代的思想来逼近.在梯度下降算法中.都是环绕下面这个式子展开: 当中在上面的式子中hθ(x)代表.输入为x的时候的其当时θ參数下的输出值 ...
- L20 梯度下降、随机梯度下降和小批量梯度下降
airfoil4755 下载 链接:https://pan.baidu.com/s/1YEtNjJ0_G9eeH6A6vHXhnA 提取码:dwjq 梯度下降 (Boyd & Vandenbe ...
- 监督学习:随机梯度下降算法(sgd)和批梯度下降算法(bgd)
线性回归 首先要明白什么是回归.回归的目的是通过几个已知数据来预测另一个数值型数据的目标值. 假设特征和结果满足线性关系,即满足一个计算公式h(x),这个公式的自变量就是已知的数据x,函数值h(x)就 ...
随机推荐
- [转]使用gdb调试异常
有时程序中有未捕获的异常会导致程序异常的行为甚至导致程序的直接退出. 这对服务器程序来说是不可接受的. 可以使用gdb的catch命令来帮助我们调试异常. 使用gdb捕获异常的扔出点(相当于在扔出异常 ...
- CAD创建一个新的图形文件
static void linea(void) { AcDbDatabase *pDb = new AcDbDatabase(true, false); AcGePoint3d pickPoint; ...
- Java中Math对象的属性与方法
Math.sqrt() ——————>计算平方根Math.cbrt()————————>计算立方根Math.pow(a, b)——————————>计算a的b次方Math.max( ...
- Python-暑期实训day 1
python基础: 一 编程语言 什么是编程语言? 上面提及的能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质.在编程的世界里,计算机更像是人的奴隶,人类 ...
- EF-Linq
一丶基本语法(from a in Table where a.id="001" select a).Tolist(); 隐式内连接from a in table1 join b i ...
- EAS之校验检查
先了解一下权限接口类提供的有关权限项检查的方法public boolean hasFunctionPermission(IObjectPK userPK,IObjectPK orgPK,String ...
- 如何在Ubuntu16.04 中安装Linux, Nginx, MySQL, PHP (LEMP 栈)
介绍 LEMP 栈是用来开发动态网页和web 应用程序的一系列软件集合,LEMP描述的是Linux操作系统,Nginx web 服务器,以及后端数据存储MySQL/MariaDB数据库和服务器端动态脚 ...
- Django REST framework - 认证
目录 认证 DRF 5种验证方式 如何确定身份验证? 设置身份验证方案 案例: 基于自定义Token认证 第一步: 定义一个用户表和一个保存用户Token的表 第二步: 定义一个登陆视图 第三步定义一 ...
- nagios新增监控集群、卸载监控集群批量操作
1.一定要找应用侧确认每台节点上需要监控的进程,不要盲目以为所有hadoop集群的zk.journal啥的都一样,切记! 2.被监控节点只需要安装nagios-plugin和nrpe,依赖需要安装xi ...
- 【Codeforces 467C】George and Job
[链接] 我是链接,点我呀:) [题意] 让你从1..n这n个数字中 选出来k个不相交的长度为m的区间 然后这个k个区间的和最大 求出这k个区间的和的最大值 [题解] 设dp[i][j]表示前i个数字 ...