自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(143)
  • 资源 (7)
  • 收藏
  • 关注

原创 现代C++技术研究(8)---完美转发

这个其实也就是std::forward和std::move的区别,std::move一律强转为右值引用,而std::forward只是转发,把右值或右值引用强转为右值引用,把左值和左值引用强转为左值引用。3)在模板函数中,通过Universal Reference的隐式类型推导得到的右值引用,编译器不会触发移动构造,必须要通过std::move或者std::forward或者static_cast显示类型转换为右值引用,编译器才会触发移动构造。《深入理解C++11》

2023-06-03 18:37:23 600

原创 现代C++技术研究(7)---std::move的使用场景

使用std::move就是为了把入参强转为右值,通常这样做是为了触发移动构造函数的调用,大部分场景都是OK的,但是,如果入参是常量,不要加std::move,因为加了也不会调用移动构造函数;如果入参是临时对象,也不要加std::move,因为不加也会调用移动构造函数。这个也容易理解,移动构造函数可能会修改入参,因为定义为常量,不能修改,所以不能调用移动构造函数,但是拷贝构造函数的入参是可以接受常量的。支持移动语义,是现代C++的主要语言特性之一,std::move本质上就是把一个变量强转成右值引用。

2023-05-21 21:08:43 1002

原创 现代C++技术研究(6)---编译器自动生成移动构造函数的条件

一般来说,编译器会自动生成的移动构造函数,足够满足我们的使用需求,但是有些场景编译器不会自动生成移动构造函数,这会影响我们编写代码的性能。总结一下:当用户自定义移动构造函数,或移动赋值运算符,或拷贝构造函数,或拷贝赋值运算符,或析构函数时,编译器不会自动生成移动构造函数和移动赋值运算符,这时,只要通过default方式定义默认的移动构造函数和移动赋值运算符,编译器就会自动生成默认的移动构造函数和移动赋值运算符,就可以解决这个问题了。可以看到,编译器实际生成的是拷贝构造函数,没有生成移动构造函数。

2023-05-19 22:55:24 835

原创 现代C++技术研究(5)---什么是通用引用(Universal Reference)

通用引用(Universal Reference)是Scott Meyers首先提出的名词,实际上就是指编译时需要进行类型推导的右值引用形式的表达式,现在,很多人认为,更加标准的名称应该叫转发引用(Forwarding Reference)。C++ 98没有右值引用,右值引用是C++11引入的新特性。在C++98中,常量左值引用,可以绑定左值或右值,到C++11也依然如此,因此,把常量左值引用叫做通用引用貌似更合适一些。那么,如何区分通用引用和右值引用呢。3)可以绑定左值(右值引用是不能绑定左值的)

2023-04-15 21:08:29 350

原创 现代C++技术研究(4)---引用折叠规则

可以看出,对于TR的类型定义或者ResultType的类型定义,只要出现左值引用,那么类型推导结果一定是左值引用,在没有左值引用的情况下,如果出现右值引用,那么类型推导结果会是右值引用。C++11对类型推导遵守所谓引用折叠规则(reference collapsing)。《深入理解C++11:C++11新特性解析与应用》

2023-04-15 08:49:24 108

原创 现代C++技术研究(3)---模板类型推导(3)

本文讨论模板函数的输入参数是数组的场景。如果,把T(&)[N]改成T(&&)[N],编译会失败,原因是这个不是通用引用,而是右值引用。可以看到,推导的结果,T是数组,而ParamType是数组的引用。传入的数组是左值,因此T和ParamType相同,都是数组的引用。这种情况,T和ParamType相同,但退化为指针。

2023-04-09 21:03:31 52

原创 现代C++技术研究(2)---模板类型推导(2)

1)当ParamType是一个通用引用时,传入左值参数,模板的类型推导ParamType结果是左值引用,且ParamType和T相同,传入右值参数,模板的类型推导ParamType结果是右值引用,但ParamType和T是不同的,T去掉引用。可以看到,推导出的类型,T和ParamType是相同的,并且后面的const被去掉了,注意,前面的const属性是不能去掉的。可以看到,对于左值,T和ParamType类型相同,对于右值,T去引用,而ParamType是右值引用。

2023-04-09 09:21:19 403

原创 现代C++技术研究(1)---模板类型推导(1)

第一种情况:ParamType是引用或者指针,但不是通用引用(Universal Reference)。小结:对于ParamType是引用或者指针,但不是通用引用的场景,模板参数T会去掉引用或者指针。代码中通过std::is_same模板函数来验证T和ParamType的类型推导结果。对于指针,与引用的情况类似。

2023-04-08 22:49:19 50

原创 在linux下手工安装g++

最近又开始重新学习C++,准备在家里搞个C++开发环境,我以前安装过一个linux的虚拟机,redhat linux 7的版本,发现默认只安装了gcc,不能使用g++,然后搜索了一下网页,搞了好半天才安装好环境,整理一下,供参考。首先,我的环境上的gcc版本号是:gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28),系统是x86_64的linux。然后,需要获取rpm包,我的虚拟机不能上网,所以不能自动安装,需要手工下载后安装。找了几个网站,找到和我的gcc版本

2021-01-01 15:18:10 1475

原创 机器学习学习笔记(20)----CART回归树

上篇文章介绍了CART分类树的实现,CART分类树对于特征值是连续的场景是适用的,但是对于类标记是连续值的场景就不适用了,这时需要采用CART回归树。对于回归算法我们并不陌生,在决策树之前的算法我们学习的所有机器学习的算法都是回归类的算法。我们假设CART回归树的损失函数是: (1)是预测结果,是类标记的样本值。等式两边对求偏导,得到:(2)令,这时得到的最小值,可得: (3)可以看出就是的平均值,所以可以写成: (4)那么对于CART回归树,进行阈值切分的标准...

2020-12-13 19:39:23 744

原创 机器学习学习笔记(19)----CART分类树

参考资料:《Python机器学习算法:原理,实现与案例》 刘硕 著

2020-11-22 19:28:44 529 1

原创 机器学习学习笔记(18)----CART(Classification And Regression Tree)算法

C4.5算法虽然相对于ID3算法做了改进,但还是存在一些不足:1)C4.5算法使用了熵模型,以信息增益比作为特征的选择标准,每次划分子树的过程中会涉及很多对数计算,计算过程较为复杂。2)对于连续结果值的预测问题,C4.5算法无法处理。CART算法针对C4.5算法上述不足进行了改进。首先,CART算法使用基尼系数作为特征选择标准。基尼系数的概念是由意大利统计学家和经济学家Corrado Gini在1922年提出。假设数据集有k个分类,其样本总数为,每个分类的样本个数分别为,则一个样本属于第

2020-11-14 11:01:23 330

原创 机器学习学习笔记(17)----C4.5算法

ID3算法主要有两个问题:1)选择划分特征时,ID3算法使用信息熵量化数据集的混乱程度,容易优先选取取值种类较多的特征;2)ID3算法不能处理连续的特征值。C4.5算法针对这两点做了改进:1)针对问题1,使用信息增益比替代信息增益;2)针对问题2,基于熵属性离散化方法,将连续值离散化。除了这两点改进以外,C4.5算法和ID3算法几乎一样。首先看一下信息增益比的概念:按照《机器学习学习笔记(14)----决策树》的定义,信息熵增益:对于训练样本集上的任意属性,属性关于集合的

2020-08-23 20:11:30 295

原创 机器学习学习笔记(16)----使用Matplotlib绘制决策树

在上一篇文章《机器学习学习笔记(15)----ID3(Iterative Dichotomizer 3)算法》中,我们使用ID3算法生成了一棵决策树,但是看起来并不直观,本文我们把上篇文章中的计算结果绘制成一棵决策树。下面使用python的Matplotlib绘制决策树:import matplotlib.pyplot as pltfrom id3tree import ID3DecisionTreeclass TreePlotter: def __init__(self, tre

2020-08-09 09:38:08 455

原创 机器学习学习笔记(15)----ID3(Iterative Dichotomizer 3)算法

ID3(Iterative Dichotomizer 3)算法是决策树中最简单的算法,基于信息增益作为选择特征的标准。算法是一个递归调用的方法,通过调用ID3(S, X)返回一颗决策树。以下是ID3递归算法的伪代码:ID3(S,A)输入:训练数据S,特征子集如果 S中的所有样本都相同: 将该样本类作为该节点的类编号,返回叶子节点;如果(空集): 将S中样本数最多的类作为该节点的类编号,返回叶子节点;否则: 构造一个子节点T, 令 假设有...

2020-07-19 16:11:44 553

原创 机器学习学习笔记(14)----决策树

决策树一种树结构的机器学习模型。因为其决策过程就像一颗倒置的树,所以叫决策树。举个例子,我们假设去水果摊买水果,我们需要分辨水果的种类,这时可以通过如下的一个简单的决策过程:通过几个特征规则,我们可以构建一颗决策树,来确定水果的种类。从上图可以看出,树的叶节点就是最终的决策结果,根节点和非叶子节点用于根据某一特征来决策后面的分支路径。那么问题来了,我们怎么构造这样一棵决策树,哪个特征判据应该放在根节点,哪个特征判据应该放在叶子节?...

2020-07-12 10:53:28 296

原创 机器学习学习笔记(13)----岭回归(Ridge回归)

在《机器学习学习笔记(4)----线性回归的数学解析》,我们通过计算线性模型的损失函数的梯度,得到使得损失函数为最小值的的解析解,被称之为普通最小二乘法: (1)公式(1)能够求得的前提是是满秩矩阵,这样才能计算得到它的逆矩阵。但是在很多情况下,矩阵不可逆。特别是当样本数m很大时,m >> n时,矩阵基本上是不可逆的,因为矩阵中出现大量线性相关的行向量的几率很高。这时,我们直接去算公式(1)是算不出来结果的。为了解决这个问题,我们需要重新定义损失函数,在损失函数中引入范数项:..

2020-06-27 09:48:10 3994

原创 机器学习学习笔记(12)----特征缩放

在《机器学习学习笔记(11)----测试softmax回归》文章中,在对softmax模型进行训练时,我们使用了特征缩放技术。使用特征缩放来处理训练数据集的主要原因是:我在使用原始数据进行训练时发现,进行梯度下降迭代时,损失函数不收敛,无法达到训练效果,所以只好采用特征缩放技术对数据进行处理后再尝试,然后发现取得了良好效果。上篇文章对特征缩放的描述比较简单,这里还是要再仔细研究一下。首先了解几个统计学的基本概念:1,方差:1)总体方差2)样本方差2,标准差:就是方差的平方根。

2020-06-26 10:40:11 410

原创 机器学习学习笔记(11)----测试softmax回归

在《机器学习学习笔记(10)----softmax回归》文章中,我们计算出了softmax损失函数的梯度公式:,对于wr,梯度下降公式是:

2020-06-21 10:40:49 545

原创 机器学习学习笔记(10)----softmax回归

logistic回归解决的是二元分类问题,对于多元分类问题,需要通过softmax回归模型来解决。回顾一下logistic模型(《机器学习学习笔记(8)----logistic回归模型》),假设事件A发生的概率是p,那么:p=1/(1+exp(-wTx)) (1)其中:wT=(w0 w1 ..... wn),x=(x0 x1 ...... xn)T,x0=1,T表示矩阵的转置。如果对(1)式右边的分数表达式的分子和分母都乘以一个exp(w1Tx),得:p=exp(w1Tx)/(exp(w..

2020-06-07 21:02:36 280

原创 机器学习学习笔记(9)----测试logistic回归模型

在《机器学习学习笔记(8)----logistic回归模型》文章中,我们推导出了logistic回归模型的梯度计算的代数公式,为了便于编程计算,我们将其转换成矩阵形式,并得出logistic回归模型的梯度下降迭代公式:...

2020-05-31 14:50:13 1147

原创 机器学习学习笔记(8)----logistic回归模型

对于有监督学习,按照解决问题的类型可以分成两类:一类是回归问题,前面的文章我们讨论的都是通过线性回归模型解决回归问题,另外一类问题是分类问题,logistic回归模型就是用于解决二元分类问题。假设我们要预测一个事件A的概率,我们假设这个事件A发生的概率是p,那么该事件A不发生的概率就是1-p。对于表达式:p/(1-p) (1)如果p的结果大于等于0.5,那么表达式(1)的结果大于等于1,表明事件A发生的概率大于事件A不发生的概率。对表达式(1)取对数,得到:ln[p/(1-p)]...

2020-05-24 13:15:15 520

原创 机器学习学习笔记(7)----测试梯度下降方法

在上一篇文章中《机器学习学习笔记(6)----梯度下降》,我们推导了批量梯度下降方法,小批量梯度下降方法和随机梯度下降方法的数学公式,本文我们测试一下批量梯度下降方法和随机梯度下降方法的学习效果。首先,编写一份实现批量梯度下降方法的代码(gdlr.py,源码参考自《Python机器学习算法:原理,实现与案例》):import numpy as npclass GDLinearRegression: def __init__(self, n_iter=200, eta=1e-3, to

2020-05-20 20:00:32 485

原创 机器学习学习笔记(6)----梯度下降

有很多机器学习的模型的最优化参数不能像普通最小二乘法那样算出解析解,此时需要使用迭代优化方法。梯度下降优化方法是通过让w值沿着梯度下降的方向逐步迭代演进,从而使得损失函数最小化的过程。梯度下降的数学表达式:其中是步长,也叫学习率,学习率选的大,损失函数不收敛,选的小,收敛又太慢。:= 表示迭代运算。在《机器学习学习笔记(4)----线性回归的数学解析》中我们推导过线性回归模型的损失函数的梯度公式:把线性回归模型的梯度公式代入到梯度下降公式中:...

2020-05-17 08:07:11 218

原创 机器学习学习笔记(5)----测试最小二乘法

上一篇文章中《机器学习学习笔记(4)----线性回归的数学解析》,求最优的w的方法是普通最小二乘法(Ordinary Least Squares,OLS),最小二乘法的python实现相对简单(ols.py):import numpy as npclass OLSLinearRegression: def _ols(self, X, y): '''最小二乘法''' tmp = np.linalg.inv(np.matmul(X.T, X))

2020-05-13 21:00:01 798

原创 机器学习学习笔记(4)----线性回归的数学解析

预备知识,向量微积分:对向量求偏导数:1)y是标量函数,y=cTx=xTc(T是指矩阵的转置)2)y是向量函数,y=Ax3)y是标量函数,y=xTAx(T是指矩阵的转置,A是n*n矩阵)求向量x的偏导数线性回归的假设函数:线性回归的损失函数:现在可以将线性回归问题,转换成求最小值问题,即找到一个最优的w使得j(w)最小:...

2020-05-10 15:01:33 381

原创 机器学习学习笔记(3)----基本术语

数据:非结构型数据,比如图片,文本等。结构型数据,人工整理的二维数据表格,例如: 射门(次) 传球(次) 控球(次) 比赛结果 1 9 2 12 赢 2 4 30 9 平 3 6 14 8 输 以上表格代表某个球员参加比赛的统计数据,以及最后的比赛结果。...

2020-05-09 20:57:00 151

原创 机器学习学习笔记(2)----线性回归

线性回归算法据说是机器学习中的Hello World,相对简单,机器学习的具体算法主要有三步:1)为假设函数设定参数,通过假设函数画出一条直线,然后根据输入的点得到预测值。2)将测试值带入损失函数,计算出一个损失值。(关于损失函数的定义,以后再讨论)3)通过得到的损失值,利用梯度下降等优化方法,不断调整假设函数的参数,使得损失值最小。这个不断调整参数使得损失值最小化的过程就是线性回归的...

2020-05-05 10:32:48 365

原创 机器学习学习笔记(1)----基本概念和环境准备

人工智能的概念因为李世石输给了谷歌的Alfago而变得热门起来,我对这一领域一无所知,考虑到以后人工智能是科技发展的一个主流方向,如果能够对这一领域有所了解,对以后的工作和生活还是很有帮助的,于是到图书馆找了几本相关的书籍,先学习一下,看能否达到扫盲的目的。人工智能是一个很大的领域,我想缩小一下学习范围,只学习机器学习这一块(其实这一块已经很大了)。机器学习的定义如下:假设用性能度量P...

2020-05-02 20:29:43 302

转载 32位汇编语言学习笔记(45)--测试简单文件操作接口(完)

这是《Assembly Language step by step programming with linux》书中的最后一个程序,也是全书中的最复杂的一个程序。首先看一下这个程序使用的一些新的c接口:FILE *fopen( const char *filename, const char *mode );int fclose( FILE *stream );char

2015-01-18 09:38:19 1779

转载 32位汇编语言学习笔记(44)--显示命令行参数(3)

与前面的版本不同,这个是使用libc库版本的显示命令行参数程序,因为main函数并不是程序的入口点,而是由libc库的代码调用,所以命令行参数在栈上的位置有不同,先看示例程序:[SECTION .data] ; Section containing initialised data ArgMsg db "Argument %d: %s",10,0 [SECTION .b

2015-01-17 11:02:41 988

转载 32位汇编语言学习笔记(43)-- 生成随机数

此程序出自《Assembly Language step by step programming with linux》第12章,用于演示随机数函数的使用,共涉及两个随机数函数:void srand( unsigned int seed ); //设置随机数种子int rand( void ); //获取随机数先看程序:[SECTION .data] ; Section

2015-01-17 07:57:13 6480

转载 32位汇编语言学习笔记(42)--测试时间相关函数

此程序出自《Assembly Language step by step programming with linux》第12章,用于演示时间相关的libc库函数的使用,程序中使用了如下的libc库函数:time_t time( time_t *timer );char *ctime( const time_t *timer );double difftime( time_t

2015-01-15 07:10:58 901

转载 32位汇编语言学习笔记(41)--fgets等函数的使用

在《32位汇编语言学习笔记(13)--函数的调用》曾分析过c函数的调用过程,对于c函数的默认调用约定cdecl,要求函数参数的压栈顺序是从右向左,由调用方来清理栈。下面示例程序会使用libc库的几个函数:char *fgets( char *string, int n, FILE *stream );int printf( const char *format [, argumen

2015-01-13 07:41:05 1411

转载 32位汇编语言学习笔记(40)--在汇编代码中使用libc库函数

前面的汇编代码没有使用libc库函数,都是通过直接进行系统调用完成。《32位汇编语言学习笔记(21)--用NASM实现Hello World小程序》通过系统调用实现了一个HelloWorld小程序,我们要通过在汇编中调用libc函数实现一个新版本的HelloWorld小程序:SECTION .data ; Section containing initialised data

2015-01-12 07:32:54 1425

转载 32位汇编语言学习笔记(39)--显示环境变量

前面的程序显示了程序的命令行参数,在程序的栈中,在命令行参数字符指针的上面就是保存的环境变量的字符串指针,以下程序用于显示环境变量:SECTION .data ; Section containing initialised data ErrMsg db "Terminated with error.",10 ERRLEN equ $-ErrMsg SECTION .bs

2015-01-11 19:31:44 1005

转载 32位汇编语言学习笔记(38)--显示命令行参数(2)

showargs1程序是把命令行参数字符串的地址从栈中拷贝到全局数组变量里,然后把结果显示出来,showargs2程序对此进行了改进,直接从栈上读取命令行参数字符串的地址,而不再进行拷贝操作,程序大同小异:SECTION .data ; Section containing initialised data ErrMsg db "Terminated with error.",

2015-01-11 15:06:51 830

转载 32位汇编语言学习笔记(37)--显示命令行参数

这个程序出自《Assembly Language step by step programming with linux》第11章,用于显示程序的命令行参数,首先看代码:SECTION .data ; Section containing initialised data ErrMsg db "Terminated with error.",10 ERRLEN equ $-E

2015-01-11 12:10:21 1447

原创 32位汇编语言学习笔记(36)--repne scasb指令

repne scasb指令,用于扫描字符串,计算字符串的长度,如下两条指令:cldrepne scasb对应的等价指令是:scans:inc edi    dec ecx    je loopdone    cmp byte [edi-1],al    jne scansloopdone:下面看一个示例程序:section .data Edi

2015-01-11 10:34:10 15960

转载 32位汇编语言学习笔记(35)--显示ASCII表

这个程序出自《Assembly Language step by step programming with linux》第11章,首先需要先介绍几条指令:jcxz label,当cx寄存器等于0时,跳转。jecxz label,当ecx寄存器等于0时,跳转。loopnz label,ecx=ecx-1,当ecx寄存器不等于0时并且ZF标志位未被设置时跳转,如果ecx寄存器等于

2015-01-10 08:10:26 1540

g++离线安装包.zip

cpp-4.8.5-28.el7.x86_64.rpm gcc-4.8.5-28.el7.x86_64.rpm gcc-c++-4.8.5-28.el7.x86_64.rpm glibc-devel-2.17-222.el7.x86_64.rpm glibc-headers-2.17-222.el7.x86_64.rpm kernel-headers-3.10.0-862.el7.x86_64.rpm libmpc-1.0.1-3.el7.x86_64.rpm libstdc++-devel-4.8.5-44.el7.x86_64.rpm mpfr-3.1.1-4.el7.x8

2021-01-01

Pattern-Oriented Software Architecture, Volume 2

设计模式的经典著作,主要讲述并发和分布式模式

2011-03-23

Th ACE Programmers Guide

ACE程序员指南,ACE的经典著作之一,是由ACE的开发团队的3为核心开发人员编写。

2011-03-20

Effective Oracle by design

Oracle高效设计的英文版第一到第三章和该书配套的源代码

2011-03-20

Expert.Oracle.Database.Architecture.2nd.Edition

Toms Kyte的《Oracle9i&10g编程艺术》的第二版

2011-03-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除