`

梯度上升算法实现

阅读更多

 

机器学习实战中也详细描述了梯度上升算法,附件里是一些笔记,再贴一个还不错的帖子

 

转 http://blog.csdn.net/wyb_009/article/details/9205151

 

这个算法搞得我晚上十点打电话给弟弟,问Ln(x),1/x的导数公式。很惭愧,大学时被我用的出神入化、化成灰我都能认出的求导公式,我今天居然忘了;这时也要说说西市佳园的移动网络信号,真不怎么好。这次我重点学习Logistic回归,涉及到了最大似然函数最大化的优化解法。

优点:计算代价不高,易于理解和实现;

缺点:容易欠拟合,分类精度可能不高;

适用数据类型:数值型和标称型数据。

Logistic回归使用Sigmoid函数分类。当x为0时,Sigmoid函数值为0.5,随着x的增大,Sigmiod函数将逼近于1;随着x的减小,Sigmoid函数将逼近于0。详情请移步http://en.wikipedia.org/wiki/Sigmoid_function

如果用Logistic来预测呢?假设房价x和大小x1,户型x2,朝向x3这三个因素相关,x = w0 + w1*x1 + w2 * x2 + w3*x3,这里w0,w1, w2,w3是各个因素对最终房价的影响力的衡量,照常来说,房间大小x1对房价的决定性更大,那么w1会更大一些,朝向相对其他两个的影响因素更小一些,那么w3会小一些,这里假设朝向,户型和大小一样有相同的取值范围,当然,现实中朝向的取值不会多到和房子大小那么多。我们对每一个影响因素x都乘以一个系数w,然后这些计算出一个房价x,将x代入Sigmiod函数,进而得到一个取值范围在0---1之间的数,任何大于0.5的数据就被划分为一类,小于0.5的被划分为另一类。

下来看看这个函数:。这个函数很有意思,当真实值y为1时,这个函数预测值为1的概率就是Sigmoid概率,当真实值y为0时,这个函数预测值为0的概率为1-Sigmoid概率。于是这个函数代表了Sigmoid函数预测的准确程度。当我们有N个样本点时,似然函数就是这N个概率的乘积。我们要做的呢,就是找出合适的w(w0,w1,w2...)让这个似然函数最大化,也就是尽量让N个样本预测的准确率达到最高。ln(f(x))函数不会改变f(x)的方向,f(x)的最大值和ln(f(x))的的最大值应该在一个点,为了求的最大值,我们可以求的最大值。

 

 

好了,就是求最大值的问题,这次使用梯度上升法(梯度上升法是用来求函数的最大值,梯度下降法是用来求函数的最小值)。梯度上升法的的思想是:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻,这样梯度算子总是指向函数增长最快的方向:,a为每次上升移动的步长,是f(w)的导数。

下来呢,为了求的最大值,需要求这个函数的导数?然后让我们让预估的参数每次沿着导数的方向增加一定的步长a。

错误注解:上边求导错误,应该再乘以xi

于是w:=w+a(y-h(x)),y是真实分类值,x是真实属性值,h(x)是预测值,也即是h(x)= w0 + w1*x1 + w2 * x2 + w3*x3...

 

说了这多,下面来实现这个算法实现

 
  1. def grad_ascent(dataset, datalabel):  
  2.     weight = [1 for i in range(len(dataset[0]))]  
  3.     alpha = 0.01  
  4.     for k in range(500):  
  5.         errset = []  
  6.         for i in range(len(dataset)):  
  7.             sig = sigmoid(dataset[i], weight)  
  8.             errset.append(datalabel[i]-sig)  
  9.               
  10.         for i in range(len(dataset[0])):  
  11.             for j in range(len(dataset)):  
  12.                 weight[i] += alpha*dataset[j][i]*errset[j]   
  13.     return weight  
  14.       
  15. def rand_grad_ascent(dataset, datalabel):  
  16.     weight = [1 for i in range(len(dataset[0]))]  
  17.     alpha = 0.01  
  18.     for i in range(len(dataset)):  
  19.         sig = sigmoid(dataset[i], weight)  
  20.         err = datalabel[i] - sig  
  21.         for j in range(len(weight)):  
  22.             weight[j] += alpha*err*dataset[i][j]  
  23.               
  24.     return weight  


整体测试文件如下:

 

 

[python] view plaincopyprint?在CODE上查看代码片派生到我的代码片
 
  1. import math  
  2. def sigmoid(data, weight):  
  3.     z = sum([data[i]*weight[i] for i in range(len(data))])  
  4.     try:  
  5.         return 1.0/(1+math.exp(-z))  
  6.     except:  
  7.         if z > 0return 1.0  
  8.         elsereturn 0.0  
  9.       
  10. def logistic_classify(data, weight):  
  11.     prob = sigmoid(data, weight)  
  12.     if prob > 0.5return 1.0  
  13.     elsereturn 0.0  
  14.       
  15. def grad_ascent(dataset, datalabel):  
  16.     weight = [1 for i in range(len(dataset[0]))]  
  17.     alpha = 0.01  
  18.     for k in range(500):  
  19.         errset = []  
  20.         for i in range(len(dataset)):  
  21.             sig = sigmoid(dataset[i], weight)  
  22.             errset.append(datalabel[i]-sig)  
  23.               
  24.         for i in range(len(dataset[0])):  
  25.             for j in range(len(dataset)):  
  26.                 weight[i] += alpha*dataset[j][i]*errset[j]   
  27.     return weight  
  28.       
  29. def rand_grad_ascent(dataset, datalabel):  
  30.     weight = [1 for i in range(len(dataset[0]))]  
  31.     alpha = 0.01  
  32.     for i in range(len(dataset)):  
  33.         sig = sigmoid(dataset[i], weight)  
  34.         err = datalabel[i] - sig  
  35.         for j in range(len(weight)):  
  36.             weight[j] += alpha*err*dataset[i][j]  
  37.               
  38.     return weight  
  39.       
  40. def test(class_func):  
  41.     f_train = open('horseColicTraining.txt')  
  42.     f_test = open('horseColicTest.txt')  
  43.       
  44.     trainset, trainlabel = [], []  
  45.     for line in f_train.readlines():  
  46.         line_cur = line.strip().split('\t')  
  47.         trainset.append([1]+[float(line_cur[i]) for i in range(21)])  
  48.         trainlabel.append(float(line_cur[21]))  
  49.           
  50.     trainweight = class_func(trainset, trainlabel)  
  51.       
  52.     errnu, tolnum= 00  
  53.     for line in f_test.readlines():  
  54.         line_cur = line.strip().split('\t')  
  55.         pred_class = logistic_classify([1]+[float(line_cur[i]) for i in range(21)], trainweight)  
  56.         read_class = float(line_cur[21])  
  57.         if pred_class == read_class:  
  58.             #print "class succ"  
  59.             pass  
  60.         else:  
  61.             errnu += 1  
  62.             #print "class fail, read_class=%d, pred_class=%d" %(read_class, pred_class)  
  63.         tolnum += 1  
  64.           
  65.     print "totol num=%d, fail num = %d, rate = %f" % (tolnum, errnu, float(errnu)/tolnum)  
  66.       
  67. if __name__ == '__main__':  
  68.     test(grad_ascent)  
  69.     test(rand_grad_ascent)  

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    梯度下降和梯度上升算法的实现

    梯度下降和梯度上升的算法实现-----------------------------------------------------------------------

    梯度下降算法matlab实现

    梯度下降是迭代法的一种,可以...反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

    机器学习-Logistic回归

    机器学习中的Logistic回归算法的完整代码,包含梯度上升算法以及改进的随机梯度上升算法,包含了一个示例:从疝气病预测病马的死亡率。

    Python实现多元线性回归方程梯度下降法与求函数极值

    梯度下降法 梯度下降法的基本思想可以类比为一个下山的过程。...同理上山也是如此,只是这时候就变成梯度上升算法了 梯度下降 梯度下降的基本过程就和下山的场景很类似。 首先,我们有一个可微分的函数。这个

    使用对立变量法减少梯度土匪算法中的方差

    此外,我们实现了一种新的策略梯度算法,称为“反臂强盗”(AAB)。 在AAB中,梯度是通过坐标上升来估算的,其中,在每次迭代中,目标臂的梯度是通过以下方式估算的:1)构建一系列臂,该臂序列在估计梯度方面近似...

    BP神经网络算法MATLAB程序

    BP神经网络是一个前向网络,它利用误差反向传播算法对网络进行训练,结构简单,可塑性强。本例选择3层BP神经网络(隐层为1层)来逼近函数,单输入单输出,隐层包含7个神经元,预设精度为0.1,学习率设为0.1,循环...

    Logistic回归算法

    资源包含Logistic回归算法,以及一个应用实例:预测病马死亡率。可直接执行。

    python里反向传播算法详解

    这是流行的梯度下降算法。而偏导数给出了最大上升的方向。因此,关于反向传播算法,我们继续查看下文。 我们向相反的方向迈出了一小步——最大下降的方向,也就是将我们带到成本函数的局部最小值的方向。 图示演示: ...

    机器学习-P3 梯度下降

    梯度上升法:最大化一个效用函数 (不管在最低点哪一侧都会是,都会是下降的) 关于参数eta 并不是所有函数都有唯一的极值点 解决方法: 多次运行,随机化初始点 梯度下降法的初始值也是一个超参数 2,代码实现...

    机器学习、深度学习、人工智能三步走,人工智能必须知道的几种深度学习算法.pdf

    梯度下降的⽬标正是河流努⼒实现的⽬标 - 即到达从⼭上迈着扯着蛋的步⼦溜向⼭脚。 现在,如果⼭的地形是这样形成的,即在到达最终⽬的地(这是⼭麓的最低点)之前,河流不必完全停下来,那么这是我们所希望的理想...

    pytorch-deepdream:DeepDream算法的PyTorch实现(Mordvintsev等)。 此外,我还包括了park.py,以帮助您更好地理解算法背后的基本概念。

    简而言之,该算法通过进行梯度上升来最大化所选网络层的激活。 因此,从输入图像(例如“做梦”后左侧的图像)中,我们得到右侧的图像: 谁会说神经网络隐藏了这种创造力? :artist_palette: 为什么还有另一个...

    存储模型数学建matlab代码-PySparseLP:解决稀疏线性规划问题的python算法

    具有精确线搜索的双重梯度上升 源自chambolle pock的一阶原始对偶算法[2] 基于乘法器交替方向法的三种方法[3] 注意这些方法并不意味着是解决通用线性程序的有效方法。 它们是我执行的简单且非常幼稚的方法,同时探索...

    机器学习经典算法-logistic回归代码详解

    一、算法简要 我们希望有这么一种...gradAscent实现的batch-梯度上升,意思就是在每次迭代中所有数据集都考虑到了;而stoGradAscent0中,则是将数据集中的示例都比那里了一遍,复杂度大大降低;stoGradAscent1则是对

    Python利用逻辑回归分类实现模板

    Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升求解方程参数。 优点:计算代价不高,易于理解和实现。 缺点:容易欠拟合,分类精度可能不高。...

    跟着Leo机器学习实战:Logistic回归

    跟着Leo机器学习实战:Logistic回归 github ...Logistic回归梯度上升优化算法训练参数 from numpy import * ''' 创建数据数组,和label数组 ''' def loadDataSet(): dataMat = []; labelMat = [] fr

    基于受限玻尔兹曼机的电力信息系统多源日志综合特征提取

    随后采用对比散度快速学习方法优化网络权值, 利用随机梯度上升法最大化对数似然函数对RBM模型进行训练学习, 通过对规范化编码后的日志信息进行处理, 实现了数据降维并得到融合后的综合特征, 有效解决了日志数据异构...

    matlab代码做游戏-OGDA-last-iterate:OGDA-最后一次

    本文首次证明,在两人零和双线性游戏中,每个玩家的动作都被限制在一个多面体中,乐观梯度上升下降算法以线性收敛速率实现了最后迭代收敛。 这在恒定步长,任何初始点且不假设平衡是唯一的前提下成立(这是以前的...

    python代码实现逻辑回归logistic原理

    Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升求解方程参数。 优点:计算代价不高,易于理解和实现。 缺点:容易欠拟合,分类精度可能不高。...

    reversible-raytracer:完全可区分的图形射线追踪器

    $ THEANO_FLAGS='mode=FAST_RUN,floatX=float32' python optimize_brightness.pyor$ THEANO_FLAGS='mode=FAST_RUN,floatX=float32' python match_mirror.py结果在output/这个怎么运作优化通过梯度下降(或上升)进行...

Global site tag (gtag.js) - Google Analytics