人工神经网络的主要作用是在我们自己不知道规律的情况下让它自己总结出规律,并且我们给它一个输入时它能给出一个合乎情理的输出。下面先上会用到的一个类 t_matrix(为什么不是CMatrix,这是因为我有时候把代码也放到安卓机上一个叫C4Droid的程序里执行,然后出错了修改,大家知道,手机切换大小写是比较麻烦的,所以我用t_来代替 t的意思就是类型的英文type,以后只要是自定义数据类型的都用t_作前缀)。不错,就是一个矩阵相关的类,从这一步你们就会发现这里面绝对是大量的矩阵运算。这个矩阵代码是通用的所以单独用一个文件来保存以便复用,代码如下(为方便在VS 2013里查看代码,成员的实现直接放在了类了,以后的类也会这么干):

#pragma once
#include"stdlib.h"
#include"math.h"
template<int row, int col>class t_matrix
{
public://row*col矩阵与col*col1矩阵相乘template< int col1>t_matrix<row, col1>operator*(const t_matrix<col, col1>&M)const{t_matrix<row, col1> ret;for (int i = 0; i < row; i++)for (int j = 0; j < col1; j++){ret.data[i][j] = 0;for (int k = 0; k < col; k++)ret.data[i][j] += data[i][k] * M.data[k][j];}return ret;}//t_matrix operator+(const t_matrix&M)const{t_matrix ret;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)ret.data[i][j] = data[i][j] + M.data[i][j];return ret;}t_matrix&operator+=(const t_matrix&M){for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)data[i][j] += M.data[i][j];return *this;}t_matrix operator-(const t_matrix&M)const{t_matrix ret;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)ret.data[i][j] = data[i][j] - M.data[i][j];return ret;}t_matrix&operator-=(const t_matrix&M){for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)data[i][j] -= M.data[i][j];return *this;}t_matrix operator*(const double val)const{t_matrix ret;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)ret.data[i][j] = data[i][j] * val;return ret;}friend t_matrix operator*(const double val, const t_matrix&M){t_matrix ret;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)ret.data[i][j] = M.data[i][j] * val;return ret;}//转置矩阵t_matrix<col, row>transpose()const{t_matrix<col, row>ret;for (int i = 0; i < col; i++)for (int j = 0; j < row; j++)ret.data[i][j] = data[j][i];return ret;}//矩阵的hadamard积t_matrix hadamard(const t_matrix&M){t_matrix ret;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)ret.data[i][j] = data[i][j] * M.data[i][j];return ret;}//矩阵的克罗内克积(张量积)template<int r, int c>t_matrix<row*r, col*c>kronecker(const t_matrix<r, c>&M)const{t_matrix<row*r, col*c>ret;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)for (int a = 0; a < r; a++)for (int b = 0; b < c; b++)ret.data[i*r + a][j*c + b] = data[i][j] * M.data[a][b];return ret;}//矩阵的每个元素平方的和double square(){double ret = 0;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)ret += data[i][j] * data[i][j];return ret;}
public://常数矩阵static t_matrix constant(double val){t_matrix ret;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)ret.data[i][j] = val;return ret;}//min到max的随机矩阵static t_matrix random(double min, double max){t_matrix<row, col>ret;double len = (max - min) / (double)RAND_MAX;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)ret.data[i][j] = min + (double)rand() *len;return ret;}
public:double data[row][col];
};

大家是不是发现这居然是个模板类,int类型的row、col分别是矩阵的行数和列数,都要求大于0,本来应该是unsigned int的,但是我用int习惯了就没用。为什么要用模板类呢?这主要是为了让VS2013在我们输入矩阵数据时能及时发现错误,因为矩阵的行和列是不尽相同的,不同行列的矩阵对大多数矩阵运算操作是不适用的,所以用了模板类让编译器来帮我们在输入时就检查,而不是运行后才发现错误。还有另一个原因就是模板类能提高性能,当然在我们的例子代码里性能什么的都是浮云,我们只要效果

大家会看到这个类里重载了许多运算符。如果对矩阵熟悉的话应该能猜出这些重载是干嘛的。下面简单说一下(以下函数都是简写):

operator*(t_matrix):两个矩阵的正常乘积。要求第一个矩阵的列与第二个矩阵的行相等,不然编译器会报错。(看看,这个操作就对行列数有要求)

operator*(double):一个标量与矩阵相乘。满足交换律。

operator+(t_matrix):两个矩阵相加。要求两矩阵的行数、列数分别相等。(又是一个行列数限制)

operator+=(t_matrix):(学过C的不知道这什么意思就先去看看基础吧。)

operator-(t_matrix):两矩阵相减。要求同operator+。

operator-=(t_matrix):(你们知道的)

transpose():返回本矩阵的转置矩阵。(就是把矩阵的行、列元素对换,(row,col)矩阵变成(col,row)矩阵)

hadamard():两矩阵的hadamard积。要求同operator+,计算方式与两矩阵相加相似,只是把里面的加法换成乘法。(我不知道hadamard的同文时什么)

kronecker():两矩阵的克罗内克积(也有称为张量积的)。这是以上这几个矩阵与矩阵操作中唯一一个对行列数没要求的操作。将第一个矩阵(row行col列)中的每一个元素与第二个矩阵(row1行col1列)相乘并摆放在大矩阵中该元素相对的位置,所以返回的大矩阵的行列数是(row*row1行col*col1列)。

下面是几个辅助的操作:

square():返回本矩阵的每个元素平方的和。(可以用矩阵与它的转置矩阵相乘达到同样的效果,但是为了性能(其实是为了偷懒)和理解,给它单独做了一个函数

static constant(double):返回一个矩阵,这个矩阵的每个元素都相同。

static random(double min,double max):返回一个矩阵,这个矩阵的每个元素都是[min,max]间的随机数

唯一的变量

data[row][col]:保存矩阵数据并给外部访问。(本来想重载operato[]来访问的,后来想想算了(因为我代码里都用了好多,懒得去ctrl+H替换))

有了这些操作我们的接下来的工作将会少写很多代码。好了,真正的人工神经网络下一篇blog开始



菜鸟学人工神经网络(C++11实现)零:矩阵类相关推荐

  1. 人工神经网络的结构基本上分为两类

    神经网络有哪些主要分类规则并如何分类? 神经网络模型的分类. 人工神经网络的模型很多,可以按照不同的方法进行分类.其中,常见的两种分类方法是,按照网络连接的拓朴结构分类和按照网络内部的信息流向分类. ...

  2. python神经网络训练效果差_Python与人工神经网络(11)——为什么深度神经网络很难训练...

    之前十期,我们彻头彻尾的介绍了神经网络技术,然而用到的都是只有一个隐藏层的.那种有多个隐藏层的神经网络,叫深度神经网络,比如这种: 在神经网络中,比较浅的隐藏层会处理一些比较简单的任务,比较深的层会处 ...

  3. 人工神经网络技术及应用,人工神经网络实际应用

    1.什么是神经网络,举例说明神经网络的应用 我想这可能是你想要的神经网络吧! 什么是神经网络: 人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(N ...

  4. 机器学习03:人工神经网络

    机器学习03:人工神经网络 人工神经元 人工神经元的结构 激活函数的选择 激活函数为什么是非线性的 常见的激活函数 神经网络 隐藏层的作用 使用代码训练神经网络 人工神经元 人工神经元的结构 人工神经 ...

  5. 人工神经网络及其应用,人工神经网络的实现

    人工智能在游戏中的应用有什么? 1.现代电脑游戏简介电子游戏从1971年诞生以来,越来越受到人们的喜爱.随着现代计算机.网络.虚拟现实.人工智能等技术的发展,游戏的拟人化越来越逼真. 高度的拟人化使得 ...

  6. 人工神经网络(ANN)

    本文将主要参考Tom M.Mitchell的<机器学习>一书说明一下人工神经网络,组织结构是这样的:先讨论人工神经网络最基本的组成单元:感知器和sigmoid单元,然后介绍由这些基本组成的 ...

  7. 人工智能人工神经网络,神经元网络 人工智能

    美国和日本的哪所大学人工智能,计算机专业比较好 美国无疑是MIT最好,其次是斯坦福.卡内基梅隆.加州大学伯克利分校.华盛顿大学.德州大学奥斯丁分校.宾州大学.康奈尔等.日本我知道东京大学,早稻田大学这 ...

  8. 系统学习机器学习之神经网络(十二) --人工神经网络总结

    本来这篇还缺个RBM,但RBM在DBN中使用,暂时放在深度学习那里.这里看到一篇非常好的总结,保存下来. 转自:http://blog.csdn.net/fengbingchun/article/de ...

  9. 人工智能和神经网络区别,人工神经网络有哪几种

    人工智能的分类包括哪些呀? 人脑计算机对接技术项目名称:小发猫 人工智能领域六大分类: 1.深度学习: 深度学习是基于现有的数据进行学习操作,是机器学习研究中的一个新的领域,机在于建立.模拟人脑进行分 ...

最新文章

  1. [导入]Java线程的深入探讨
  2. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 密码强化、网络安全强化...
  3. 获取某一日期所在月份的第一天日期或最后一天日期
  4. 【Android】 Android adb常见问题整理
  5. 转先验概率、最大似然估计、贝叶斯估计、最大后验概率
  6. java cookie安全_cookie的安全性问题
  7. 图像处理之积分图应用二(快速边缘保留滤波算法)
  8. EXCEL工作表保护密码破解 宏撤销保护图文教程
  9. 为什么android手机内存不够,安卓手机老是内存不足怎么解决
  10. SQL Server抛出异常信息 RAISERROR
  11. 【最全,带注释版】雷赛运动控制卡库函数C#导出
  12. VeriSign SSL证书产品及服务_VeriSign证书|SSL证书|EVSSL证书|服务器证书|数字证书
  13. 【FinE】债券久期和凸性
  14. decimal 和 numeric
  15. 你知道我国一共赠送了多少只熊猫给外国吗?来看看这个数据可视化项目
  16. python代码示例大全 下载-python基础代码大全
  17. 更改ubuntu默认文件管理器为deepin
  18. 报错:Module parse failed: ‘return‘ outside of function (4:1) You may need an appropriate loader
  19. Windows Support Tools
  20. python中哪些是无序_关于无序集合:无序集合 – 在python中设置

热门文章

  1. TCP/IP中的TTL
  2. 惠普打印机驱动服务器系统安装教程,Hp打印机驱动怎么安装,详细图文版教程...
  3. java界面——可视化窗口入门级
  4. Linux下进程状态转换,Linux进程状态转换图
  5. Hadoop详解以及历史版本介绍
  6. 【行业首发】蛙色VR全景作品支持对接飞猪旅行
  7. 链路聚合技术及其配置
  8. POI操作excel基础用法详解
  9. 状态报告:Ceylon TypeScript Loader GSoC项目
  10. 如何在手机上完成日语翻译中文