#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include <cmath>

template <typename DataType>
double sigmoid(DataType z) {
    return 1.0/(1+exp((-1)*z));
}

template <typename DataType, typename WeightType>
double getMatResult(typename::std::vector<DataType> &data, typename::std::vector<WeightType> &weights) {
    double result=0.0;
    for(size_t i=0;i<data.size();++i) {
        result+=data.at(i)*weights.at(i);
    }
    return result;
}

template <typename DataType>
void DisplayData(typename::std::vector<std::vector<DataType> > &vv) {
    std::cout<<"the number of data: "<<vv.size()<<std::endl;
    for(size_t i=0;i<vv.size();++i) {
        for(typename::std::vector<DataType>::iterator it=vv[i].begin();it!=vv[i].end();++it) {
            std::cout<<*it<<" ";
        }
        std::cout<<std::endl;
    }
}

template <typename DataType, typename WeightType>
double CostFun(typename::std::vector<std::vector<DataType> > &vv, typename::std::vector<WeightType> &v_weights) {
    double J=0.0;
    typename::std::vector<DataType> v_x;
    for(size_t i=0;i<vv.size();++i) {
        v_x.clear();
        v_x.push_back(vv[i][0]);
        v_x.push_back(vv[i][1]);
        v_x.push_back(vv[i][2]);
        double z=getMatResult(v_x,v_weights);
        J=J+vv[i][3]*log2(sigmoid(z))+(1-vv[i][3])*log2(1-sigmoid(z));
    }
    J=-J/vv.size();
    return J;
}

int main() {
    std::ifstream infile_feat("train.data");
    std::string feature;
    float feat_onePoint;
    std::vector<float> lines;
    std::vector<double> v_weights;
    std::vector<std::vector<float> > lines_feat;
    lines_feat.clear();
    v_weights.clear();
    for(size_t i=0;i<3;++i) {
        v_weights.push_back(1.0);
    }
    while(!infile_feat.eof()) {
        getline(infile_feat, feature);
        if(feature.empty())
            break;
        std::stringstream stringin(feature);
        lines.clear();
        lines.push_back(1.0);
        while(stringin >> feat_onePoint) {
            lines.push_back(feat_onePoint);
        }
        lines_feat.push_back(lines);
    }
    infile_feat.close();
    std::cout<<"display train data: "<<std::endl;
    DisplayData(lines_feat);
    double res=CostFun(lines_feat, v_weights);
    std::cout<<"the value of cost function: "<<res<<std::endl;
    std::vector<double> v_x;
    while(true) {
        double grad0=0.0,grad1=0.0,grad2=0.0;
        for(size_t i=0;i<lines_feat.size();++i) {
            v_x.clear();
            v_x.push_back(lines_feat[i][0]);
            v_x.push_back(lines_feat[i][1]);
            v_x.push_back(lines_feat[i][2]);
            grad0+=(lines_feat[i][3]-sigmoid(getMatResult(v_x,v_weights)))*lines_feat[i][0];
            grad1+=(lines_feat[i][3]-sigmoid(getMatResult(v_x,v_weights)))*lines_feat[i][1];
            grad2+=(lines_feat[i][3]-sigmoid(getMatResult(v_x,v_weights)))*lines_feat[i][2];
        }
        grad0=grad0/lines_feat.size();
        grad1=grad1/lines_feat.size();
        grad2=grad2/lines_feat.size();

//0.03为学习率阿尔法
        v_weights[0]=v_weights[0]+0.03*grad0;
        v_weights[1]=v_weights[1]+0.03*grad1;
        v_weights[2]=v_weights[2]+0.03*grad2;

double res_new;
        res_new=CostFun(lines_feat,v_weights);
        if(std::abs(res_new-res)<0.0000000001)
            break;
        res=res_new;
    }
    for(size_t i=0;i<3;++i) {
        std::cout<<v_weights.at(i)<<" ";
    }
    std::cout<<std::endl;
    lines_feat.clear();
    infile_feat.open("test.data");
    while(!infile_feat.eof()) {
        getline(infile_feat, feature);
        if(feature.empty())
            break;
        std::stringstream stringin(feature);
        lines.clear();
        lines.push_back(1.0);
        while(stringin >> feat_onePoint) {
            lines.push_back(feat_onePoint);
        }
        lines_feat.push_back(lines);
    }
    infile_feat.close();
    std::cout<<"display test data: "<<std::endl;
    DisplayData(lines_feat);
    for(size_t i=0;i<lines_feat.size();++i) {
        v_x.clear();
        v_x.push_back(lines_feat[i][0]);
        v_x.push_back(lines_feat[i][1]);
        v_x.push_back(lines_feat[i][2]);
        res=getMatResult(v_x,v_weights);
        double lable=sigmoid(res);
        for(size_t j=0;j<4;++j) {
            std::cout<<lines_feat[i][j]<<" ";
        }
        if(lable>0.5)
            std::cout<<" 1"<<std::endl;
        else
            std::cout<<" 0"<<std::endl;
    }
    return 0;
}

逻辑回归 C++的更多相关文章

  1. 逻辑回归 Logistic Regression

    逻辑回归(Logistic Regression)是广义线性回归的一种.逻辑回归是用来做分类任务的常用算法.分类任务的目标是找一个函数,把观测值匹配到相关的类和标签上.比如一个人有没有病,又因为噪声的 ...

  2. 用R做逻辑回归之汽车贷款违约模型

    数据说明 本数据是一份汽车贷款违约数据 application_id    申请者ID account_number 账户号 bad_ind            是否违约 vehicle_year  ...

  3. 逻辑回归(LR)总结复习

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 最基本的LR分类器适合于对两分类(类0,类1)目标进行分类:这个模型以样 ...

  4. scikit-learn 逻辑回归类库使用小结

    之前在逻辑回归原理小结这篇文章中,对逻辑回归的原理做了小结.这里接着对scikit-learn中逻辑回归类库的我的使用经验做一个总结.重点讲述调参中要注意的事项. 1. 概述 在scikit-lear ...

  5. 逻辑回归LR

    逻辑回归算法相信很多人都很熟悉,也算是我比较熟悉的算法之一了,毕业论文当时的项目就是用的这个算法.这个算法可能不想随机森林.SVM.神经网络.GBDT等分类算法那么复杂那么高深的样子,可是绝对不能小看 ...

  6. 逻辑回归(Logistic Regression)

    转载请注明出自BYRans博客:http://www.cnblogs.com/BYRans/ 本文主要讲解分类问题中的逻辑回归.逻辑回归是一个二分类问题. 二分类问题 二分类问题是指预测的y值只有两个 ...

  7. 逻辑回归算法的原理及实现(LR)

    Logistic回归虽然名字叫"回归" ,但却是一种分类学习方法.使用场景大概有两个:第一用来预测,第二寻找因变量的影响因素.逻辑回归(Logistic Regression, L ...

  8. 感知器、逻辑回归和SVM的求解

    这篇文章将介绍感知器.逻辑回归的求解和SVM的部分求解,包含部分的证明.本文章涉及的一些基础知识,已经在<梯度下降.牛顿法和拉格朗日对偶性>中指出,而这里要解决的问题,来自<从感知器 ...

  9. stanford coursera 机器学习编程作业 exercise 3(逻辑回归实现多分类问题)

    本作业使用逻辑回归(logistic regression)和神经网络(neural networks)识别手写的阿拉伯数字(0-9) 关于逻辑回归的一个编程练习,可参考:http://www.cnb ...

  10. Theano3.3-练习之逻辑回归

    是官网上theano的逻辑回归的练习(http://deeplearning.net/tutorial/logreg.html#logreg)的讲解. Classifying MNIST digits ...

随机推荐

  1. JS——for

    打印两行星星: <script> for (var i = 0; i < 2; i++) { for (var j = 0; j < 10; j++) { document.w ...

  2. 检索COM类工厂中CLSID 为 {000209FF-0000-0000-C000-000000000046}的组件时失败, 原因是出现以下错误: 80070005

    主要问题原因是Word权限配置问题 解决方案: 控制面板-管理工具-组件服务-计算机-我的电脑-DCOM配置 在列表中找到microsoft word97-2003 document 右键选择属性,选 ...

  3. 4星|《JAC写给外贸公司老板的企管书》:善总结爱学习、有业绩的老外贸的经验谈

    作者从事外贸10余年,作出了业绩,也善总结.爱学习.爱分享.本书是作者在外贸行业的从业经验集.有一些战略方面的,比如开发小语种市场,大部分都是战术方面的操作细节(比如如何做营销),应该是非常适合从业者 ...

  4. codeforces_731D_(前缀和)(树状数组)

    D. 80-th Level Archeology time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  5. Eclipse安装egit Github教程

    网址:http://download.eclipse.org/egit/updates 教程: http://jingyan.baidu.com/article/4853e1e529483c1909f ...

  6. 关于react框架的一些细节问题的思考

    目录 setState到底是同步的还是异步的? 如何在子组件中改变父组件的state? context的运用,避免“props传递地狱” 组件类里有私有变量a,它到底改放在this.a中还是this. ...

  7. ARM异常中断返回的几种情况

    在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下:   重要基础知识:R15(PC)总是 ...

  8. UpLoadify在IE下兼容问题

    一.在IE9.IE10不能点击的问题解决 解决方法:进入uploadify的js文件中,搜索SWFUpload.prototype.getFlashHTML,找到它对应的语句,将方法全部替换为以下内容 ...

  9. java中一个数组不能放不同数据类型的值

    在java中,数组不能放不同数据类型的值. 方法一: 多态 定义数组类型的时候定义为父类,而存进数组为父类的子类 public class test2 { public static void mai ...

  10. 水图(牛客练习赛(DFS搜索))

    题意: 小w不会离散数学,所以她van的图论游戏是送分的 小w有一张n个点n-1条边的无向联通图,每个点编号为1~n,每条边都有一个长度小w现在在点x上她想知道从点x出发经过每个点至少一次,最少需要走 ...