梯度上升算法实现

 

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

 

转 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 plain copy print ? 在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)  

 

 

 

 

 

 

 

机器学习实战》之五——Logistic回归 一、什么是回归 假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合的过程就称作回归。 利用Logisitc回归进行分类的主要思想是:根据现有的数据对分类边界线建立回归公式,以此进行分类。训练分类器时的做法就是寻找最佳拟合参数。 也就是说,logistic回归是先寻找给定的下面这个公式中的: 最佳拟合的参数,然后利用sigmoid函数进行分类。 二、sigmoi... 阅读详情

相关推荐

梯度下降和梯度上升相关算法的分析与实现

一直在看相关的视频和书本学习机器学习的相关东西,今年就开始写第一个机器学习的博客,注重于理论分析和具体的算法的python实现,强调本博客的所有的算法均可编程实现,而不仅只是个样子(鉴于很多博客的code只是样子)....本博客专注于小白学习,大佬勿喷 好了开始,申明本博客的下面的每个算法都是基于一个项目背景的,这个的联系数据集采用的是周志华老师西瓜里的习题的数据集: class wate

疯狂的菜鸟的博客 841

梯度上升、随机梯度 python代码

改自机器学习实战,python3。 from numpy import * def loadDataSet(): dataMat = []; labelMat = [] fr = open('testSet.txt') for line in fr.readlines(): lineArr = line.strip().split() #去掉首尾

jsh458046505的博客 1628

机器学习实战Logistic回归之马儿得疝气了,怎么办?

这个算法搞得我晚上十点打电话给弟弟,问Ln(x),1/x的导数公式。很惭愧,大学时被我用的出神入化、化成灰我都能认出的求导公式,我今天居然忘了;这时也要说说西市佳园的移动网络信号,真不怎么好。这次我重点学习Logistic回归,涉及到了最大似然函数最大化的优化解法。 优点:计算代价不高,易于理解和实现; 缺点:容易欠拟合,分类精度可能不高; 适用数据类型:数值型和标称型数据。 Logist

wyb_009的专栏 5167

梯度上升算法与随机梯度上升算法实现

1. 引言 上一篇日志中,我们最终推导出了计算最优系数的公式。 Logistic 回归数学公式推导 本文,我们就利用上一篇文章中计算出的公式来实现模型的训练和数据的分类。 2. 通过 python 实现 logistic 算法 有了上一篇日志中的公式,《机器学习实战》中的代码就非常容易理解了: # -*- coding:UTF-8 -*- # {...

居士的CSDN 6055

python系列-逻辑回归算法(logistic回归)之梯度上升算法理解及python实现

梯度上升与梯度下降算法python实现

sinat_34117508的博客 1453

java实现梯度上升算法_机器学习之PCA与梯度上升

主成分分析(Principle Component Analysis,简称:PCA)是一种非监督学习的机器算法,主要用于数据的降维。PCA 基本原理以有2个特征的二维平面举例,如图:横轴表示特征1,纵轴表示特征2,其中4个点表示二维的特征样本。如果要对样本进行降维降到一维,可以将这些点映射到横轴、纵轴或者其它轴上如:映射到不同的轴后样本间间距会不一样,而要找的就是让样本间间距最大的轴。假定这个轴方...

weixin_28895791的博客 371

Logistic回归,梯度上升算法理论详解和实现

经过对Logistic回归理论的学习,推导出取对数后的似然函数为 现在我们的目的是求一个向量,使得最大。其中 对这个似然函数求偏导后得到 根据梯度上升算法有 进一步得到 我们可以初始化向...

weixin_30326745的博客 157

java实现梯度上升算法_第7章 PCA与梯度上升法 学习笔记上

目录7-1 什么是PCA 降维后 同理去掉特征一,降维则为 那个方案更好呢,右边的,在x轴上点集间距离大,有更好的区分度 将点映射到这条斜线上,数据点变为,其整体与原来变化不大,从二维降到了一维,这时无论是映射到xy上间距大好 方差样本的疏密 所有的样本减去整体样本的均值 dmean后式子化简为这样 X是向量,demean后为零 w是单位方向向量 主成分分析法有很强的数学原理...

weixin_28717969的博客 197

reconfigurable_organisms中的优化器架构:从遗传算法梯度上升实现原理

在可重构生物体设计领域,reconfigurable_organisms项目提供了一个完整的优化器架构,用于自动化设计具有特定功能的生物形态。本文将深入解析该项目的优化器系统,从基础的遗传算法到高级的梯度上升方法,帮助您理解如何通过这些算法设计出能够移动、执行任务的生物机器人。 ## 🔍 优化器架构概览 reconfigurable_organisms项目的优化器系统采用模块化设计,核心架构

gitblog_00030的博客 367

实现基于梯度上升法的PCA

实现基于梯度上升法的PCA 参考bobo老师的机器学习课程,进行总结回顾 目录 基于梯度上升法的PCA原理 实现基于梯度上升实现的PCA 用自制数据集验证手写的PCA 基于梯度上升法的PCA原理 PCA(Principal Component Analysis):主成分分析 可以用于数据降维,重新确定数据所在的空间的基,保留k个方差最大的基。 故我们要找到令数据方差最大的基 即寻找使样本空间...

weixin_44264662的博客 257

Logistic回归及梯度上升算法

开始学习机器学习算法的时候就接触了Logistic回归及梯度下降法,但是当时并没有深入去自己推导一下公式,写一写代码,现在学习xgboost的时候又碰到Logistic回归相关的知识,干脆自己推一遍,写一下代码吧。。 逻辑回归 逻辑回归可以用来进行回归与分类,两者仅有略微不同,主体算法是一样的,本文以分类进行讲解。如下图二分类问题,我们希望找到一个直线(高维空间为超平面)来将数据划分开。...

Summit的专栏 7827

python梯度上升算法_Python3《机器学习实战》学习笔记(六):Logistic回归基础篇之梯度上升算法...

Python版本: Python3.x运行平台: WindowsIDE: Sublime text3一、前言本文从Logistic回归的原理开始讲起,补充了书上省略的数学推导。本文可能会略显枯燥,理论居多,Sklearn实战内容会放在下一篇文章。自己慢慢推导完公式,还是蛮开心的一件事。二、Logistic回归与梯度上升算法Logistic回归是众多分类算法中的一员。通常,Logistic回归用于二...

weixin_39708502的博客 256

用python做逻辑回归梯度上升_机器学习之logistic回归的梯度上升算法

#coding=utf-8#logistic回归的梯度上升法fromnumpyimport*importmatplotlib.pyplotasplt#加载数据集defloadDataSet():dataMat=[];labelMat=[]fr=open('testSet.txt')forlineinfr.readlines():lineArr=line.strip().split()...

weixin_39878247的博客 147

机器学习——Logistic(逻辑)回归

本篇首先阐述Logistic回归的定义,然后介绍一些最优化算法,其中包括基本的梯度上升法和一个改进的随机梯度上升法,这些最优化算法将用于分类器的训练。尽管逻辑回归的名称中包含“回归”,但它实际上是用于分类的,特别是二分类问题。逻辑回归通过计算输入特征的线性组合,使用Sigmoid函数将输出值压缩0和1之间,表示某个类别发生的概率。通过设定一个阈值(如0.5),可以将概率转换为类别输出。逻辑回归通常用于估计对象属于某一类别的概率,这是一个典型的分类任务。

m0_73531849的博客 1956

机器学习(四):Logistic回归

文章目录算法介绍算法示例总结 算法介绍 logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(...

LTC_1234的博客 442

逻辑回归算法:随机梯度方法和梯度上升方法实现鸢尾花数据集分类

随机梯度方法和梯度上升方法实现鸢尾花数据集分类 将鸢尾花数据集划分为测试集和训练集,利用花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征识别鸢尾花的种类 from numpy import * from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split def sigm...

z345436330的博客 891

logistic回归原理解析--一步步理解

https://blog.csdn.net/feilong_csdn/article/details/64128443logistic回归,又叫对数几率回归(从后文中便可此名由来)。首先给大家强调一点,这是一个分类模型而不是一个回归模型!下文开始将从不同方面讲解logistic回归的原理,随后分别使用梯度上升算法和随机梯度上升算法将logistic回归算法应用到实例中。一、logistic回归和线...

lgb_love的专栏 7万+

python怎么输出logistic回归系数_机器学习实战笔记(Python实现)-04-Logistic回归

---------------------------------------------------------------------------------------本系列文章为《机器学习实战》学习笔记,内容整理自书本,网络以及自己的理解,如有错误欢迎指正。-------------------------------------------------------------------...

weixin_39622150的博客 1862
上一篇: 递归构造决策树
下一篇: java ipc 实例
blackproof
博客等级 码龄17年 11粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值