类的新增功能默认构造在原有的C++类中,会有6个默认的成员函数,分别是构造函数、析构函数、拷贝构造、赋值重载、取地址重载、const取地址重载
最重要并且经常用的是前四个,后两个用处不大
所谓默认成员函数是当构建一个类的时候,我们不写这些函数,编译器会帮我们生成一个默认的
在C++11中,又新增了移动构造函数和移动赋值重载,这两个我们在上一篇中有详细解释
但是生成的规则会有不同
当你没有显式的写析构、拷贝构造和赋值重载时,编译器会自动生成默认的移动构造和移动赋值重载
默认生成的移动构造函数,对于内置类型会执行按字节拷贝,对于自定义类型,就需要看这个类型是否定义移动构造,有的话就直接调用,没有的话就调用拷贝构造
移动赋值重载和上面的移动构造完全类似
但是当我们自己写了移动构造或者移动赋值,编译器就不会生成拷贝构造和赋值重载了
类成员变量初始化C++11允许在类定义的时候给成员变量缺省值,默认生成的构造函数会使用这些缺省值进行构造,例如
1234567class Date{private: int _year = 1970; int _month = 1; in...
右值引用和移动语义左值引用和右值引用所谓的引用就是给变量起别名,那么左值引用和右值引用的区别其实就在于左值和右值
左值与左值引用左值表示的是一个数据的表达式,比如说变量的名字,或者是解引用的指针,我们可以获取左值的地址,并且可以对左值赋值,左值可以出现在赋值符号的左边,而右值不行
const的左值不能赋值但是可以取地址,左值引用就是给左值取引用,左值引用依然是左值
例如
1234567891011121314int main(){ // 左值 int a = 1; int* pa = &a; const int b = 2; // 左值引用 int& ra = a; int*& rpa = pa; const int& b = b; int& rpaval = *pa; return 0;}
这些用法是我们可以容易理解的
右值与右值引用右值的本质上也是数据的表达式,但是与左值有不同,例如字面常量,表达式的返回值,函数的返回值(非左值引用返回),右值可以...
k近邻算法k近邻算法是经典的监督学习算法,我们这里主要介绍k近邻算法的基本内容和如何应用
算法原理k近邻算法的基本原理其实很简单
首先k近邻算法是一个分类算法,在我们进行分类之前,需要先定义“距离”,或者我们可以形象的理解为样本点之间的相似程度
训练集是已经准备好的,也已经完全分好了类别,接下来拿出每一个需要分类的测试点,找到训练集中和他最近的k个点,也就是最相似的k个点,如果这k个点都属于同一个类别,我们就有把握认为这个测试点也是这个类别的了
这个过程完成其实算法也就结束了,更加形象的说法可能是投票,比如说这个人有多少分像自己,然后取出最高的k个得分,如果这k个得分是同一类,就说明这个人是这一类的
k近邻算法是一种基于实例的学习,也是惰性学习的代表,没有显示的训练过程,因为我们一开始就没有对训练集做处理,而是直接使用,所以训练时间为0。与之对应的是急切学习,就是需要从训练集中建模
其次这个过程实际上是属于少数付出多数的,那么k值的选取和距离的定义就显得尤为重要
接下来我们会对这几个规则进行介绍
k值的选取正如我们之前所说,k值的选取对分类的准确性有很大影响,当k比较小时,模型对...
C++11简介C++11可以说是C语言演变成C++之后第二个重大的标准了,上一个重大的标准是C++98
C++11相较于C++98带来了数量非常非常多的变化,新特性,对C++03进行了很多修正,甚至让C++11变得很不“C++”
但是C++11能更好的用于系统开发和库开发,语法也更进一步泛化,简单化,稳定,安全
这里介绍一些比较实用的语法特性
统一的列表初始化需要注意这里的列表初始化和类的初始化列表不要混淆
花括号初始化在C++98中,我们可以使用花括号对数组和结构体进行统一的初始值的设定
12345678910111213struct S{ int _a; int _b;};int main(){ int arr[] = {1,2,3}; int arr[5] = {0}; S s = {1,2}; return 0;}
C++11就更像是把花括号括起来的数据作为了一种新的容器,把这种容器再作用于所有的内置类型和自定义类型的初始化,就像使用v...
线性回归线性回归(Linear Regression)模型是最简单的线性模型之一,很具代表性
概念我们在高中时代其实就学过使用最小二乘法进行线性回归分析
这实际上是统计学部分的内容,会有大量的自变量,或者说解释变量,还有就是对应的因变量,也就是输出结果,回归分析就是找出他们对应的关系,并且使用某个模型描述出来,这样一来给出新的变量,就能利用模型实现预测
这也就是我们一开始介绍机器学习说明的过程,给出输入和输出,找到一个模型T能够很好的拟合这些数据,从而使用T就能预测结果了
从几何层面,回归就是找到具有代表性的直线、曲线、甚至是面,来进行拟合
回归的种类有很多,一元和多元,那么一元其实就是线性回归。我们这里先讨论线性回归,而且我们假设因变量和自变量之间是满足线性关系的,也就是$y=w_0+w_1x$
这里的$w_0$和$w_1$我们称之为回归系数,我们需要拟合的,求出来的就是这两个权值,一个经典的示意图是这样的
这里的每一个点就是实际的数据,红色的线是我们拟合出来的,很容易可以看得到,有些点离线近,有些点离线远,我们使用残差(Residual)来描述这里的远和近,也就是...
sklearn与经典机器学习算法sklearn在学习的过程中,除了需要深入理解底层原理时,其实就需要避免重复的造轮子的过程,Python的强大的库就是一个非常好玩的功能
既能避免重复造轮子,还能快速的调用对应的api来使用功能
在机器学习领域的scikit-learn是一个非常常用的机器学习框架,我们将使用sklearn来说实现经典的机器学习算法
sklearn简介sklearn是一款07年至今的机器学习开源项目,基于NumPy和SciPy,提供了很多用于数据挖掘和分析的工具和接口
sklearn主打一个只做机器学习,不轻易支持新的算法,他的好处就是非常稳定
我们可以用几行代码就完成机器学习的七个步骤
数据处理读取数据并进行预处理,归一化、标准化、正则化等内容
分割数据数据随机分割成三组,训练集、验证集(可以没有)、测试集
训练模型针对选取好的特征,使用训练数据来构建模型,拟合数据,寻找最优的模型参数
这里的拟合数据主要是使用各种机器学习算法来学习数据中的特征,拟合出损失函数最小的参数
验证模型接入验证集给模型,我们将模型在验证集上的表现作为参数优化和选择的依据,常用的方法有Ho...
性能评估机器学习的模型有很多,我们在选择的时候就需要对各个模型进行对比,这时候就需要一个靠谱的标准,能够评估模型的性能
这里的性能不是说算的有多快,而是说预测的结果和真实情况进行比较的来的结果
误差在我们对训练的结果进行分析之前,首先需要思考模型训练过程中是否可能有误差的产生,因为这同样会影响结果和对模型选择产生比较大的影响
误差主要会出现在数据集的三个部分,分别是训练集、测试集、新样本
训练集——训练误差
测试集——测试误差
新样本——泛化误差
所谓的训练误差指的是训练集本身存在缺陷,从而模型提取的错误的特征信息,例如一个只认识红色苹果的模型,遇到绿色苹果时,他就不认为这是苹果了
一般情况下拿到一个数据集,会将其分成两部分,分别作为训练集和测试集,那么对于训练完成的模型,此时测试集也相当于是一个新样本
训练模型的时候,一开始训练误差和测试误差都会比较高,但是训练次数越多,训练误差会越来越小,但是测试误差可能会变大,而且模型的复杂度也会随之提升
这样的现象我们分别称之为欠拟合和过拟合
欠拟合和过拟合欠拟合的概念很好理解,其实就是由于数据量不够大,模型的准确率不够多,也就是一开...
非监督学习与监督学习相反,非监督学习的训练数据集是完全没有标签的数据,他本质上所做的工作都是聚类的
给定数据之后,聚类能从中学习到什么,就完全取决于数据本身的特性的,简单说就是自动给数据贴标签
比较有名的非监督学习蒜贩有K均值聚类(K-Means Clustering)、层次聚类(Hierarchical Clustering)、主成分分析(Principal Components Analysis,PCA)、DBSCAN、深度信念网络(Deep Belief Net)等
半监督学习半监督学习其实是使用最多的一种了,就像我们人生的学习过程一样,不是所有的东西都有人来教,总有需要自己去理解总结的时候
他的形式化的定义如下
给定一个来自于某个位置分布的有标记实例集合${(x_1,y_1),(x_2,y_2),\dots,(x_k,y_k)}$这里$x_i$是输入数据,而$y_i$是标签;然后还有一个未标记的示例集合$U={x_{k+1},x_{k+2},\dots,x_{k+u}}$那么这里的u就是未标记的数据个数
我们希望模型通过学习得到某个函数,通过他能够准确的对未标记...