【deep learning学习笔记】注释yusugomori的LR代码 --- LogisticRegression.cpp
模型实现代码,关键是train函数和predict函数,都很容易。
#include <iostream>
#include <string>
#include <math.h>
#include "LogisticRegression.h"
using namespace std; LogisticRegression::LogisticRegression(
int size, // N
int in, // n_in
int out // n_out
)
{
N = size;
n_in = in;
n_out = out; // initialize W, b
// W[n_out][n_in], b[n_out]
W = new double*[n_out];
for(int i=0; i<n_out; i++)
W[i] = new double[n_in];
b = new double[n_out]; for(int i=0; i<n_out; i++)
{
for(int j=0; j<n_in; j++)
{
W[i][j] = 0;
}
b[i] = 0;
}
} LogisticRegression::~LogisticRegression()
{
for(int i=0; i<n_out; i++)
delete[] W[i];
delete[] W;
delete[] b;
} void LogisticRegression::train (
int *x, // the input from input nodes in training set
int *y, // the output from output nodes in training set
double lr // the learning rate
)
{
// the probability of P(y|x)
double *p_y_given_x = new double[n_out];
// the tmp variable which is not necessary being an array
double *dy = new double[n_out]; // step 1: calculate the output of softmax given input
for(int i=0; i<n_out; i++)
{
// initialize
p_y_given_x[i] = 0;
for(int j=0; j<n_in; j++)
{
// the weight of networks
p_y_given_x[i] += W[i][j] * x[j];
}
// the bias
p_y_given_x[i] += b[i];
}
// the softmax value
softmax(p_y_given_x); // step 2: update the weight of networks
// w_new = w_old + learningRate * differential (导数)
// = w_old + learningRate * x (1{y_i=y} - p_yi_given_x)
// = w_old + learningRate * x * (y - p_y_given_x)
for(int i=0; i<n_out; i++)
{
dy[i] = y[i] - p_y_given_x[i];
for(int j=0; j<n_in; j++)
{
W[i][j] += lr * dy[i] * x[j] / N;
}
b[i] += lr * dy[i] / N;
}
delete[] p_y_given_x;
delete[] dy;
} void LogisticRegression::softmax (double *x)
{
double max = 0.0;
double sum = 0.0; // step1: get the max in the X vector
for(int i=0; i<n_out; i++)
if(max < x[i])
max = x[i];
// step 2: normalization and softmax
// normalize -- 'x[i]-max', it's not necessary in traditional LR.
// I wonder why it appears here?
for(int i=0; i<n_out; i++)
{
x[i] = exp(x[i] - max);
sum += x[i];
}
for(int i=0; i<n_out; i++)
x[i] /= sum;
} void LogisticRegression::predict(
int *x, // the input from input nodes in testing set
double *y // the calculated softmax probability
)
{
// get the softmax output value given the current networks
for(int i=0; i<n_out; i++)
{
y[i] = 0;
for(int j=0; j<n_in; j++)
{
y[i] += W[i][j] * x[j];
}
y[i] += b[i];
} softmax(y);
}
【deep learning学习笔记】注释yusugomori的LR代码 --- LogisticRegression.cpp的更多相关文章
- 【deep learning学习笔记】注释yusugomori的LR代码 --- LogisticRegression.h
继续看yusugomori的代码,看逻辑回归.在DBN(Deep Blief Network)中,下面几层是RBM,最上层就是LR了.关于回归.二类回归.以及逻辑回归,资料就是前面转的几篇.套路就是设 ...
- 【deep learning学习笔记】注释yusugomori的DA代码 --- dA.h
DA就是“Denoising Autoencoders”的缩写.继续给yusugomori做注释,边注释边学习.看了一些DA的材料,基本上都在前面“转载”了.学习中间总有个疑问:DA和RBM到底啥区别 ...
- 【deep learning学习笔记】注释yusugomori的RBM代码 --- 头文件
百度了半天yusugomori,也不知道他是谁.不过这位老兄写了deep learning的代码,包括RBM.逻辑回归.DBN.autoencoder等,实现语言包括c.c++.java.python ...
- [置顶]
Deep Learning 学习笔记
一.文章来由 好久没写原创博客了,一直处于学习新知识的阶段.来新加坡也有一个星期,搞定签证.入学等杂事之后,今天上午与导师确定了接下来的研究任务,我平时基本也是把博客当作联机版的云笔记~~如果有写的不 ...
- Deep Learning 学习笔记(8):自编码器( Autoencoders )
之前的笔记,算不上是 Deep Learning, 只是为理解Deep Learning 而需要学习的基础知识, 从下面开始,我会把我学习UFDL的笔记写出来 #主要是给自己用的,所以其他人不一定看得 ...
- 【deep learning学习笔记】Recommending music on Spotify with deep learning
主要内容: Spotify是个类似酷我音乐的音乐站点.做个性化音乐推荐和音乐消费.作者利用deep learning结合协同过滤来做音乐推荐. 详细内容: 1. 协同过滤 基本原理:某两个用户听的歌曲 ...
- Neural Networks and Deep Learning学习笔记ch1 - 神经网络
近期開始看一些深度学习的资料.想学习一下深度学习的基础知识.找到了一个比較好的tutorial,Neural Networks and Deep Learning,认真看完了之后觉得收获还是非常多的. ...
- paper 149:Deep Learning 学习笔记(一)
1. 直接上手篇 台湾李宏毅教授写的,<1天搞懂深度学习> slideshare的链接: http://www.slideshare.net/tw_dsconf/ss-62245351? ...
- Deep Learning 学习笔记——第9章
总览: 本章所讲的知识点包括>>>> 1.描述卷积操作 2.解释使用卷积的原因 3.描述pooling操作 4.卷积在实践应用中的变化形式 5.卷积如何适应输入数据 6.CNN ...
随机推荐
- Oracle Dedicated server 和 Shared server(专用模式 和 共享模式) 说明(转)
一. 官网说明 在DBCA 建库的时候,有提示让我们选择连接类型,这里有两种类型:专用服务器模式和共享服务器模式.默认使用专用模式.如下图: Oracle 官方文档对这两种文档的说明如下: Abou ...
- Swift实战-QQ在线音乐(第一版)
//一.*项目准备 1.QQ音乐App 界面素材:(我使用PP助手,将QQ音乐App备份,解压ipa文件 即可得到里面的图片素材) 2.豆瓣电台接口:"http://douban.fm/j/ ...
- AdbWinApi编译详解(本人亲历)
1. 从微软官方下载WDDK,比如:GRMWDK_EN_7600_1.ISO(http://download.microsoft.com/download/4/A/2/4A25C7D5-EFBE-41 ...
- BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )
BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...
- sencha touch(7)——list组件
1.list组件是一个很强大的组件.用于以一览表的形式或者列表的形式展示应用程序中的大量的数据.该组件使用XTemplate模版来显示数据,同时与数据仓库进行绑定.所以当数据仓库中的数据发生变化的时候 ...
- dll文件32位64位检测工具以及Windows文件夹SysWow64的坑(很详细,还有自动动手编程探测dll)
阅读目录 dll文件不匹配导致数据库无法启动 究竟是System32还是SysWow64 区分dll文件32位64位的程序让我倍感迷惑 再次判断究竟是System32还是SysWow64——意想不到的 ...
- WPF Multi-Touch 开发:惯性效果(Inertia)
原文 WPF Multi-Touch 开发:惯性效果(Inertia) 从上一篇实例可以发现在图片移动过程中如果将手指移开屏幕则图片会立刻停止,根据这种情况WPF 提供另外一种惯性效果(Inertia ...
- poj 3767 I Wanna Go Home
题意:n个点(从1-n编号) m条边 下面m行 u v dis 表示双向边u v的距离 n个点表示 每个点被势力1或2占据 这里保证1 城市由势力1占据,2城市由势力2占据 思路: 求2遍spfa() ...
- Android组件:Fragment切换后保存状态
之前写的第一篇Fragment实例,和大多数人一开始学的一样,都是通过FragmentTransaction的replace方法来实现,replace方法相当于先移除remove()原来所有已存在的f ...
- Ubuntu 安装启动Tomcat
首先下载ubuntu 的tar包 官网: http://tomcat.apache.org/download-80.cgi 安装启动 1 .下载对应的tar 2 .解压任意文件夹下,更改名字tomca ...