我很早就对人工智能是很是感兴趣的。记得我大学的毕业论文,就是使用遗传算法解决了一个经典的寻路问题。 我一直对人类经典的思想是很是敬畏和崇拜的,好比传统的计算机数据结构算法问题,例如经典的排序算法或者动态规划思想,把一些看似复杂的问题居然用短短十几行甚至一个 for 循环就能解决,这令我感觉到了一种美学,也同时对人类的伟大思想而赞叹。python
但传统的计算机算法其实仍是经过,人来编写代码,人来经过完整的、解决问题的思路来解决问题。但若是机器能有本身的思想,若是它本身就能“学习”到解决问题的方法,岂不是很是 cool 的一件事。算法
但以我目前的认知来看,如今的人工智能是更像是一种工具,一种“数学工具”,一种“统计学工具”,它是从大量数据里总结出了一种“规律”,用来解决实际问题。它离电脑真正有思想还相距甚远,甚至以目前来看,两者可能并非一回事。可能让机器具备思惟,还须要在其余学科上进行突破好比人的认知机制,脑科学进行突破。哈哈扯远了。markdown
先来介绍本身的一些简单认识。数据结构
有一类几何对象,好比直线、平面、立方体,看上去都是有棱有角的,都是“直”的,在数学中称为线性 框架
要处理它们相关的问题就很是简单。好比在高中就学过,两根直线能够用两个线性方程来表示,想求它们交点的话:机器学习
联立出二者的方程组,求出该方程组的解就能够获得交点函数
(1)咱们所处的世界、宇宙太复杂了,不少现象都没法理解,更谈不上用数学去描述;工具
(2)有一些符合特定条件的复杂问题,能够转化为简单的线性问题。线性问题就能够彻底被理解,彻底能够被数学所描述oop
以我目前的认知来看,机器学习主要的任务有两类。 第一就是分类任务,好比学习
也就是说,分类的结果是,人为预先定义的结果范围里的一种
而第二类任务就是回归任务,而它得出的结果是一个连续数字的值,而非类别。 例如
这是我目前的浅显理解。机器学习目前我以为是一种数学工具。经过喂给机器大量的学习资料,而后机器运行一个机器学习算法,训练出了一个模型。而后再向机器丢入问题,机器经过这个模型运算得出结果。
好比我收集到了有 x, y 的两组数据(好比年龄和身高),我想要知道这两组变量是否有线性关系。那么我先以一个变量为 x 轴,另外一个变量为 y 轴画出这样一副散点图。
那么我就能够找出这样的一条直线。这条直线的特征是:尽量的离全部离散点最近,也能够表述成,每一个离散点离直线距离的差值之和最小。 那么我就能够很好的根据我算出的这条直线,由已知的 x 值,来预测的未知的 y 值。 假如说 x, y 有线性关系的话,那么预测的效果仍是很不错的。因此线性回归的主要任务是,找出这条直线。
咱们先从单变量线性回归开始理解,即假设 x 只有一个特征(好比一氧化氮浓度),y 是房价。 根据前文提到的感性理解,咱们的目标就是找到最佳的直线方程:
其实就是求参数 a 和 b 的过程。 那其实咱们的目标就是,使得根据每个 x 点,使得
最小。这个方程叫作损失函数。 你可能想问为何是差的平方和最小?而不是差的绝对值和最小或者差的 3 或者 4 次方最小? 差的平方和最小在数学中叫作最小二乘法,这里给出一个连接 www.zhihu.com/question/24…,这里再也不细究。
因此一类机器学习算法的基本思路是: 经过肯定问题的损失函数,而后最优化损失函数,来得到机器学习的模型。 怎么求得这个损失函数的最小值,即求 a 和 b 的值。则须要对 a 和 b 分别进行求导。导数为 0 的点则为极值点。 如今咱们对 a 进行求导(复合函数的链式求导法则):
化简一下:
根据一样的过程得出 a,化简过程省略:
而后 python 实现一下: 简单来讲我须要定义两个方法。
这里须要注意一下:这里采用了向量化代替了循环去求 a。 咱们看到,a 的分子分母实际上用循环也能够求, 可是实际上,a 的分子分母其实能够当作向量的点乘(即向量 a 里的每个份量乘以向量 b 里的每个份量)。 这样作有两个好处:
当把这个 a 和 b 的参数求出以后,咱们就得出了一个模型(在这个例子中是 y=ax+b),而后咱们就能够进行预测了,把 x 带入这个方程中,就能够得出预测后的这个 y 值。
理解了单变量线性回归以后,咱们就开始须要解决,当特征为多个的时候,怎么进行预测? 也就是多元线性回归。 咱们能够理解一下,多元线性回归实际要求的是这样的一个方程
即每个特征前面都有一个常数系数,再加一个常数(截距)。 这里咱们把这些系数整理成一个(列)向量
而后咱们为了方便起见,设置一个 x0, x0 恒等于 1,那么咱们最终就化简成了下面两个向量的点乘
而后把全部的 x 向量(样本)组合成一个矩阵,将 theta 整理成一个列向量。那么 y(向量)就是全部 x 向量的预测值。这里用到了矩阵和向量的乘法(哈哈忘了的话得复习一下线性代数)。
那么根据最小二乘法,咱们的目标就是使得
最小。也就是要对整个矩阵进行求导,具体推导过程省略,这里给出最终 theta 的解:
也就是咱们经过数学推导,直接求出了参数的数学解,然而通常而言,可以直接得出参数数学解的机器学习方法仍是比较少的,有可能还须要借助其余方法好比梯度降低才可以求出参数。
接下来根据这个数学解进行实现。
这个波士顿房价数据集是 sklearn(一个机器学习框架)自带的数据集
其实我看到这个数据集时也懵了,这个例子是带咱们预测房价吗?预测明天深圳的房价? 我以为是能够这样理解,经过收集一些特征(学习资料)以下图和波士顿某些地区的平均房价(目标结论),来推测出你或者房地产商卖房子时应该怎么订价比较划算。或者说经过这个数据集来理解,哪一个因素对于房价影响更大。
该数据集包含马萨诸塞州波士顿郊区的房屋信息数据,来自 UCI 机器学习知识库(数据集已下线),于 1978 年开始统计,包括 506 个样本,每一个样本包括 12 个特征变量和该地区的平均房价。
能够看到,研究者但愿找出影响房价的重要因素,好比环境因素(一氧化氮浓度),位置因素(到波士顿 5 个中心区域的加权距离)等等(不过我相信影响中国房价因素要比这复杂的多)
通过求解得出了(或者说学习到了)各个参数的值,而后若是地产商想要订价的话,能够收集这些特征,而后使用模型的 predict 方法能够得出一个房价的参考值。
而后咱们也能够看到,哪些因素对于房价是正相关的,哪些是负相关的。而后参数越大,越影响房价,这就是线性回归法对于结果的可解释性(有些机器学习方法是不支持的)。