`

梯度上升算法实现

阅读更多

 

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

 

转 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)  

 

 

 

 

 

 

 

分享到:
评论

相关推荐

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

    ### 梯度上升算法 梯度上升与梯度下降类似,但目标是寻找函数的局部最大值。它沿函数梯度的方向更新参数,而不是相反方向。因此,梯度上升的更新公式为:`参数 = 参数 + 学习率 * 梯度`。 **1. 算法步骤:** 1. ...

    基于梯度强化学习算法(Matlab代码实现)

    在本资源中,提供的是基于Matlab的梯度强化学习算法实现,这对于理解和实践这种算法提供了直观的平台。 在强化学习中,智能体通过与环境的交互来学习最优策略,以最大化长期奖励。传统的强化学习算法如Q-learning或...

    梯度下降算法matlab实现

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

    论文研究-RLAR:一种基于增强学习的自适应路由算法 .pdf

    本文提出了基于梯度上升算法实现的增强学习自适应路由算法RLAR,通过与多种现有路由算法对比,证实了RLAR能够有效提高网络路由性能。 在网络路由中应用增强学习,可以将路由问题建模成一种多智能体的增强学习问题。...

    C# 抓边算法 实现

    本篇文章将深入探讨如何使用C#语言结合最小二乘法来实现抓边算法。最小二乘法是一种优化技术,常用于解决线性回归、曲线拟合等问题,这里它被用来优化边缘检测。 首先,我们要理解边缘检测的重要性。在图像分析中,...

    文章【强化学习】Policy Gradient(策略梯度)算法详解中的代码资源

    算法的目标是通过梯度上升来更新参数,以提高期望回报G_t的期望值J(θ),即: \( J(\theta) = E_{\pi_\theta}[G_t] \) 其中,G_t是从时间步t开始到T的累积奖励。 3. 策略函数 常见的策略函数形式有确定性策略...

    聚类算法Kmeans与梯度算法Meanshift.docx

    总之,Kmeans和Meanshift是两种不同的聚类策略,Kmeans依赖于固定数量的聚类中心和最小化平方误差,而Meanshift则利用梯度上升寻找数据的局部密度峰值。它们在实际应用中各有优缺点,可以根据具体问题和数据特性选择...

    常见优化算法的matlab实现

    梯度上升法用于最大化目标函数,而梯度下降法则用于最小化。在MATLAB中,可以使用`gradient`函数来计算目标函数的梯度,进而更新参数。 2. **牛顿法**:牛顿法是基于二阶导数的优化算法,它通过迭代求解目标函数的...

    Logistic回归算法

    梯度上升算法是求解Logistic回归模型参数的一种优化方法,它通过逐步调整权重向量以减小损失函数,从而找到最大化似然估计的参数。在每次迭代中,权重向量沿着损失函数梯度的反方向增加,直到达到局部最优或全局...

    聚类算法Kmeans与梯度算法Meanshift.pdf

    相比之下,Meanshift算法是一种概率密度梯度估计方法,无需事先知道概率密度函数,而是直接寻找梯度上升的方向,从而找到数据的局部峰值,即数据的模态。这使得Meanshift在处理多模态分布时更为灵活。此外,Mean...

    论文研究-全增量式自然梯度Actor-Critic学习算法 .pdf

    在AC算法中,Critic根据TD(λ)学习算法更新值函数参数,并利用这些信息通过随机梯度下降或上升方向来更新策略参数。 在强化学习中,策略梯度方法可以调整策略参数θ。根据梯度来更新策略参数是策略梯度方法的核心。...

    java实现logistic回归算法

    训练过程中,你需要实现梯度上升法或优化算法,每次迭代更新权重。预测时,使用Sigmoid函数计算概率并根据阈值判断分类。 6. **实战应用与注意事项** - 实战中,可能需要结合实际问题调整模型,如正则化防止过拟合...

    基于 python用logistic回归,SVM,神经网络实现分类算法

    """随机梯度上升算法 Args: data (numpy.ndarray): 训练数据集 labels (numpy.ndarray): 训练标签 num_iteration (int): 迭代次数 """ for j in xrange(num_iteration): data_index = range(self.data_num)...

    强化学习算法-基于python的强化学习actor-critic算法实现

    通过梯度上升法更新策略网络的参数,目标是提高预期的累积奖励,即J(θ) = E[∑γt Rt],其中θ表示策略网络的参数,Rt是时间步t的奖励,γ是折扣因子。 2. **价值网络(Critic)**:价值网络用于估计策略网络在...

    强化学习算法-基于python的强化学习reinforce算法实现

    这个过程可能涉及到梯度上升,使得那些导致高回报的动作概率增加。 7. **重复以上步骤**:直到达到预设的训练步数或满足其他停止条件。 在源码中,可能会包含以下关键部分: - 策略网络的定义和初始化 - 与环境的...

    聚类算法Kmeans与梯度算法Meanshift (2).pdf

    Meanshift使用梯度上升法,通过迭代追踪数据分布的梯度来逼近数据的模态。相较于Kmeans,Meanshift更灵活,能处理具有多种分布模式的数据。在2006年的CVPR文章中,作者指出Meanshift实际上是牛顿拉夫逊算法的一种...

    聚类算法Kmeans与梯度算法Meanshift (4).docx

    Meanshift算法则是一种概率密度梯度上升方法,它不直接估计概率密度,而是通过寻找梯度方向来确定数据的聚集中心。这意味着Meanshift能处理多模态分布,寻找数据集中的多个峰值。与Kmeans相比,Meanshift更灵活,...

Global site tag (gtag.js) - Google Analytics