softmax regression in c++
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <numeric>
#include <fstream>
#include <sstream>
#include <functional>
double myfunction(double num) {
return exp(num);
}
template <typename T>
void softmax(const typename::std::vector<T> &v, typename::std::vector<T> &s) {
double sum=0.0;
transform(v.begin(), v.end(), s.begin(), myfunction);
sum=accumulate(s.begin(), s.end(), sum);
for(size_t i=0; i<s.size(); ++i)
s.at(i)/=sum;
}
template <typename T>
void hypothesis(const std::vector<std::vector<T> > &theta, const std::vector<T> &feature, std::vector<T> &prb) {
prb.clear();
double sum=0.0;
for(size_t i=0; i<theta.size(); ++i) {
double inner=0.0;
inner=inner_product(theta.at(i).begin(), theta.at(i).end(), feature.begin(), inner);
inner=exp(inner);
sum+=inner;
}
for(size_t i=0; i<theta.size(); ++i) {
double inner=0.0;
inner=inner_product(theta.at(i).begin(), theta.at(i).end(), feature.begin(), inner);
inner=exp(inner);
prb.push_back(inner/sum);
}
}
double stringtodouble(const std::string& s) {
std::istringstream iss(s);
double num;
return iss>>num?num:0;
}
int indicator(const int &a, const int &b) {
if(a==b)
return 1;
else
return 0;
}
void print(int i) {
std::cout<<i<<" ";
}
double CostFunc(const std::vector<std::vector<double> > &vv_iris, const std::vector<std::vector<double> > &theta) {
double sum3=0.0;
for(size_t i=0; i<vv_iris.size(); ++i) {
double sum1=0.0;
int k;
for(size_t j=0; j<theta.size(); ++j) {
double inner=0.0;
int b=j+1;
int indi=indicator(vv_iris.at(i).back(), b);
if(indi)
k=j;
inner=inner_product(vv_iris.at(i).begin(), vv_iris.at(i).end()-1, theta.at(j).begin(), inner);
sum1+=exp(inner);
}
sum1=log(sum1);
double inner=0.0;
inner=inner_product(vv_iris.at(i).begin(), vv_iris.at(i).end()-1, theta.at(k).begin(), inner);
inner-=sum1;
sum3+=inner;
}
sum3/=vv_iris.size();
return -sum3;
}
void GetThetaGrad(const std::vector<std::vector<double> > &vv_iris, const std::vector<std::vector<double> > &theta, const int j, std::vector<double> &grad_theta) {
double sum=0.0;
for(size_t i=0; i<vv_iris.size(); ++i) {
double sum1=0.0;
for(size_t k=0; k<theta.size(); ++k) {
double inner=0.0;
inner=inner_product(vv_iris.at(i).begin(), vv_iris.at(i).end()-1, theta.at(k).begin(), inner);
inner=exp(inner);
sum1+=inner;
}
double inner=0.0;
inner=inner_product(vv_iris.at(i).begin(), vv_iris.at(i).end()-1, theta.at(j).begin(), inner);
inner=exp(inner);
sum1=(-1)*inner/sum1;
int b=j+1;
int indi=indicator(vv_iris.at(i).back(), b);
sum1+=indi;
std::vector<double> v_temp(theta.front().size(), 0);
transform(vv_iris.at(i).begin(), vv_iris.at(i).end()-1, v_temp.begin(), std::bind1st(std::multiplies<double>(), sum1));
for(size_t l=0; l<theta.front().size(); ++l) {
grad_theta.at(l)+=v_temp.at(l);
}
}
for(size_t i=0; i<grad_theta.size(); ++i) {
grad_theta.at(i)=(-1)*grad_theta.at(i)/vv_iris.size();
}
}
void ReadDataFromCsv(std::string &filename, std::vector<std::vector<double> > &lines_feat) {
std::ifstream vm_info(filename.c_str());
std::string lines, var;
std::vector<double> row;
lines_feat.clear();
while(!vm_info.eof()) {
getline(vm_info, lines);
if(lines.empty())
break;
std::istringstream stringin(lines);
row.clear();
row.push_back(1);
while(std::getline(stringin, var, ',')) {
if(var=="Iris-setosa")
var="1";
else if(var=="Iris-versicolor")
var="2";
else if(var=="Iris-virginica")
var="3";
double value=stringtodouble(var);
row.push_back(value);
}
lines_feat.push_back(row);
}
}
template <class DataType>
void ReadMatFromFile(std::string &filename, std::vector<std::vector<DataType> > &lines_feat) {
std::ifstream vm_info(filename.c_str());
std::string lines;
DataType var;
std::vector<DataType> row;
lines_feat.clear();
while(!vm_info.eof()) {
getline(vm_info, lines);
if(lines.empty())
break;
std::replace(lines.begin(), lines.end(), ',', ' ');
std::stringstream stringin(lines);
row.clear();
while(stringin >> var) {
row.push_back(var);
}
lines_feat.push_back(row);
}
}
template <class T>
void Display2DVector(std::vector<std::vector<T> > &vv) {
for(size_t i=0;i<vv.size();++i) {
for(typename::std::vector<T>::const_iterator it=vv.at(i).begin();it!=vv.at(i).end();++it) {
std::cout<<*it<<" ";
}
std::cout<<"\n";
}
std::cout<<"--------the total rows of the 2DVector is "<<vv.size()<<std::endl;
std::cout<<"--------the total cols of the 2DVector is "<<vv.front().size()<<std::endl;
}
int main() {
std::string file("Iris.csv"), weight("theta.csv");;
std::vector<std::vector<double> > vv_iris;
std::vector<std::vector<double> > theta;
ReadDataFromCsv(file, vv_iris);
ReadMatFromFile(weight, theta);
Display2DVector(vv_iris);
Display2DVector(theta);
double old_cost=CostFunc(vv_iris, theta);
std::cout<<"the orignal cost: "<<old_cost<<std::endl;
for(;;) {
for(size_t i=0; i<theta.size(); ++i) {
std::vector<double> grad_theta(theta.front().size(), 0);
GetThetaGrad(vv_iris, theta, i, grad_theta);
for(size_t j=0; j<grad_theta.size(); ++j) {
theta.at(i).at(j)=theta.at(i).at(j)-0.05*grad_theta.at(j);
}
}
double new_cost=CostFunc(vv_iris, theta);
std::cout<<"new_cost: "<<new_cost<<std::endl;
if(fabs(new_cost-old_cost)<0.000000001)
break;
old_cost=new_cost;
}
Display2DVector(theta);
return 0;
}
softmax regression in c++的更多相关文章
- Softmax回归(Softmax Regression)
转载请注明出处:http://www.cnblogs.com/BYRans/ 多分类问题 在一个多分类问题中,因变量y有k个取值,即.例如在邮件分类问题中,我们要把邮件分为垃圾邮件.个人邮件.工作邮件 ...
- (六)6.10 Neurons Networks implements of softmax regression
softmax可以看做只有输入和输出的Neurons Networks,如下图: 其参数数量为k*(n+1) ,但在本实现中没有加入截距项,所以参数为k*n的矩阵. 对损失函数J(θ)的形式有: 算法 ...
- Deep Learning 学习随记(三)续 Softmax regression练习
上一篇讲的Softmax regression,当时时间不够,没把练习做完.这几天学车有点累,又特别想动动手自己写写matlab代码 所以等到了现在,这篇文章就当做上一篇的续吧. 回顾: 上一篇最后给 ...
- UFLDL实验报告1: Softmax Regression
PS:这些是今年4月份,跟斯坦福UFLDL教程时的实验报告,当时就应该好好整理的…留到现在好凌乱了 Softmax Regression实验报告 1.Softmax Regression实验描述 So ...
- ufldl学习笔记和编程作业:Softmax Regression(softmax回报)
ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量 ...
- 学习笔记TF024:TensorFlow实现Softmax Regression(回归)识别手写数字
TensorFlow实现Softmax Regression(回归)识别手写数字.MNIST(Mixed National Institute of Standards and Technology ...
- TensorFlow实战之Softmax Regression识别手写数字
关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2018年02月21日 23:10:04所撰写内容(http://blog.c ...
- R︱Softmax Regression建模 (MNIST 手写体识别和文档多分类应用)
本文转载自经管之家论坛, R语言中的Softmax Regression建模 (MNIST 手写体识别和文档多分类应用) R中的softmaxreg包,发自2016-09-09,链接:https:// ...
- TensorFlow(2)Softmax Regression
Softmax Regression Chapter Basics generate random Tensors Three usual activation function in Neural ...
- 逻辑回归与神经网络还有Softmax regression的关系与区别
本文讨论的关键词:Logistic Regression(逻辑回归).Neural Networks(神经网络) 之前在学习LR和NN的时候,一直对它们独立学习思考,就简单当做是机器学习中的两个不同的 ...
随机推荐
- [luoguP1266] 速度限制(spfa)
传送门 因为到某一没有限速的路径速度会有不同的可能,所以直接用 dis[i][j] 表示到第 i 个点速度为 j 时的最短时间,然后跑spfa. ——代码 #include <queue> ...
- BZOJ 1022: [SHOI2008]小约翰的游戏John【anti-SG】
Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...
- 【置换】G. Poker 2.0
https://www.bnuoj.com/v3/contest_show.php?cid=9146#problem/G [题意] 题意很简单,就是“鸽尾式”洗扑克,问洗m次各张牌的位置 [思路] 牌 ...
- python学习之-- importlib模块
importlib 模块 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外,importlib允许程序员 ...
- ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路
https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析 分层最短路 我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...
- Excel小tips - 如何实现多列成绩统一排名
本文参考:http://mp.weixin.qq.com/s/XR49hyG9Cods7rOcsM-tRg 如果有以下数据文件,需要进行成绩排名. 第一步:先在成绩列后边添加一列,用来显示名次.如下: ...
- leetCode 67.Add Binary (二进制加法) 解题思路和方法
Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...
- http协议的相关知识
因为如今的工作设计的Web开发,因此了解了一下Http协议.在阅读了这篇文章HTTP协议具体解释(真的非常经典)后,总结了相关经常使用知识并列在此处以方便以后的查询. HTTP协议的主要特点可概括例如 ...
- centos+nginx+php-fpm+php include fastcgi_params php页面能訪问但空白,被fastcgi_params与fastcgi.conf害慘了
今天在centos上折腾这块是发现老是訪问页面时,浏览器中提示是200 ok.且訪问html后缀却是正常出现内容. 可是訪问php后缀却返回空白页面,同一时候查看全部的log没有发现不论什么出错信息; ...
- 数据结构与算法问题 AVL二叉平衡树
AVL树是带有平衡条件的二叉查找树. 这个平衡条件必须保持,并且它必须保证树的深度是O(logN). 一棵AVL树是其每一个节点的左子树和右子树的高度最多差1的二叉查找树. (空树的高度定义为-1). ...