一、线性回归
1、分类:0/1问题,预测结果为0或1;
2、回归:预测结果不是类别而是一个具体的值。
3、
高斯分布即正态分布:
什么样的参数可以使其与x结合后与其真实值最接近 :
极大似然估计法,使其最大时,拟合度更好。
为目标函数,要使其最小
是求导。 对于线性回归y=a+bx的解为:
所以python实现为:
import numpy as np
x=np.array([1,3,2,1,3])
y=np.array([14,24,18,17,27])
def train(x,y):
if len(x)!=len(y):
return
numerator = 0
denominator = 0
x_mean=np.mean(x)
y_mean=np.mean(y)
for i in range(len(x)):
numerator+=(x[i]-x_mean)*(y[i]-y_mean)
denominator+=np.square(x[i]-x_mean)
print("分母:",denominator,"分子:",numerator)
b=numerator/denominator
a=y_mean-b*x_mean
return a,b
def predict(x,a,b):
return a+b*x
a,b=train(x,y)
print('Line is:y = %2.0fx + %2.0f'%(b,a))
x_test = np.array([1,2,3])
y_test = np.zeros((1,len(x_test)))
for i in range(len(x_test)):
y_test[0][i] = predict(x_test[i],a,b)
print("y=",y_test)
4、矩阵求导: https://blog.csdn.net/u012045426/article/details/52343676
二、逻辑回归:属于分类算法,经典的二分类问题,不属于回归。
x属于实数,y取【0,1】; 梯度下降:
三、KNN算法 https://www.cnblogs.com/ybjourney/p/4702562.html
方法:对于位置类别属性数据集中的点:
1、计算已知类别数据集中的点与当前点的距离。
2、按照距离依次排序。
3、选取与当前点距离最小的k个点。
4、确定前k个点所在类别的出现概率。
5、返回前k个点出现频率最高的类别作为当前点预测分类。
注意:KNN算法分类器不需要使用训练集进行训练,训练时间复杂度为0。但是KNN分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为n,那么KNN的分类复杂度为O(n)。
个人理解:在一定范围内,遍历各个点,该范围与类型相同最多的点一致,若预测新的一个点时,便可以以此判断它是否属于这个区域。
四、决策树
1、决策树的构造:
(1)信息增益(Gain(D,a)):信息增益越大,意味着用某个属性划分的“纯度提升”越大(信息增益越大越好),可用信息增益来进行决策树的划分属性的选择,信息增益=原始熵值-以某个属性划分后的熵值(对数目较多的属性有所偏好)。
(2)熵:复杂程度或混乱程度,熵越大越混乱,纯度越低。是度量样本集合纯度最常用的一个指标,计算公式:
。
(3)增益率:对数目较少的属性有所偏好。一般先从候选属性中选出信息增益高于平均水平的属性,再从中选择增益率最高的。计算公式:信息增益/自身熵值。(4)基尼指数(Gini):基尼指数越小,纯度越高。(与熵类似)
(5)剪枝处理:对付过拟合的手段。
①预剪枝:在决策树生成过程中,对每个结点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点(生成过程中提前停止)。
②后剪枝:先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若该叶结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点(生成后才开始裁剪)。
2、连续值处理:采用二分法对连续属性进行划分,使其离散化。
五、神经网络
1、激活函数:Sigmoid函数。
2、阶跃函数的特点:不连续、不光滑。
3、隐层/隐含层:输入层和输出层之间的一层神经元。
4、隐含层和输出层神经元都是拥有激活函数的功能神经元。
5、神经元之间不存在同层连接,也不存在跨层连接。
6、感知机:感知机是一类人造神经元,在许多神经网络中,主要的神经元模型sigmoid神经元。我们将很快的了解什么是sigmoid,但是想要知道为什么sigmoid要这么定义,就需要我们花点时间去了解感知机。感知机如何工作?一个感知机通过一些二进制的输入x1,x2,…x1,x2,…,然后产生一个二进制的输出:
在上图中,感知机有三个输入x1,x2,x3x1,x2,x3,通常它可以有更多或者更少的输入。Rosenblatt提出了一个简单的规则来计算输出,它用权重w1,w2…w1,w2…来表示各个输入对输出的重要性。神经元的输出,要么是0要么是1,由权重和∑jwjxj∑jwjxj的值是否小于或者大于某一阈值。和权重一样,阈值也是一个实数,它是神经元的一个参数。用代数式表达就是:
7、代价函数 在分类问题,我们知道使用交叉熵误差函数而不是平方和误差函数,会使得训练速度更快,同时也提升了泛化能力。对于二元分类问题来说,神经网络可以使用单一的logistics神经元作为输出,同时也可以使用两个softmax神经元作为输出。对于多分类问题,同样有两方面的思考:
7. 1. 对于类别之间有交集的多分类问题,我们可以将多分类看成多个相互独立的二元分类问题,这时我们使用logistics输出神经元,而误差函数采用交叉熵误差函数。
7.2. 对于类别之间互斥的多分类问题,通常使用softmax输出神经元,误差函数同样采用交叉熵误差函数下面我们将会介绍更加具有一般性的多分类的神经网络的损失函数。首先假设神经网络的输出单元有K个,而网络的第k个神经元的输出我们用表示,同时其目标用
表示,基于两种不同的考量角度,损失函数被给出.
8、类别之间有交集的多分类问题对于此类问题,我们可以将多分类看成多个相互独立的二元分类问题,每个输出神经元都有两种取值(t=0,1),并且输出神经元之间相互独立,故给定输入向量时,目标向量的条件概率分布为:
取似然函数的负对数,可以得到下面的误差函数:
9、类别之间互斥的多分类问题对于该问题,我们通常用"1-of-K"的表示方式来表示类别,从而网络的输出可以表示为:,因此误差函数为:
而网络输出的计算通常使用Softmax函数:
这里 表示第i个样本第k个输出单元的输出值,是一个概率值。对于正则化项,我们依然采用l2正则项,将所有参数(不包含bias项的参数)的平方和相加,也就是不把i=0时的参数加进入。
10、反向传播算法 绝大部分的训练算法都会涉及到用迭代的方式最小化误差函数和一系列的权值更新操作。具体来说,一般的训练算法可以分为两个阶段:
- 第一阶段:求解误差函数关于权值(参数)的导数。(bp)
- 第二阶段:用得到的导数进一步计算权值的调整量。(梯度下降等优化算法)反向传播(bp)算法主要应用第一阶段,它能非常高效的计算这些导数。
3 误差函数导数的计算
接下来我们将会学习到bp算法是如何计算误差函数导数的。
首先为了使得推导过程更加直观,我们将会使用一个简单的层次网络结构说明(这个层次网络有两层sigmoid隐层神经元、误差函数使用均方误差函数)。网络结构如图:
像前面提到的我们做如下符号约定:
首先考虑一个简单的线性模型,其中输出是输入变量的线性组合:
(1)给定一个特定的输入模式n(x, t),则其误差函数为:
(2)则这个误差函数关于参数的梯度为:
(3)此时误差函数的梯度可以表示为与链接的输出端相关联"误差信号"和与链接输入端相关联的变量的乘积。(交叉熵误差函数也有类似的结果!)
接下来计算神经网络中误差函数关于参数的梯度。首先,因为误差函数中只有加权求和项与参数,故可以通过链式求导法则得到:
(4)同上面线性函数的表示方式,我们通常引入新的符号:
(5)用其来表示与链接的输出端相关联"误差信号",此时误差函数关于参数的梯度可以写成:
(6)这个式子告诉我们:要求的导数 = 权值输出端单元的误差项
* 权值
输入端单元的激活值
。因为每个结点的激活值在前馈阶段已经得出,因此,为了计算导数,我们只需要计算网络中每个隐层结点和输出结点的"误差信息"即可。