Logistic回归,梯度上升算法的实现

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

转 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. for i in range(len(dataset[0])):
  10. for j in range(len(dataset)):
  11. weight[i] += alpha*dataset[j][i]*errset[j]
  12. return weight
  13. def rand_grad_ascent(dataset, datalabel):
  14. weight = [1 for i in range(len(dataset[0]))]
  15. alpha = 0.01
  16. for i in range(len(dataset)):
  17. sig = sigmoid(dataset[i], weight)
  18. err = datalabel[i] - sig
  19. for j in range(len(weight)):
  20. weight[j] += alpha*err*dataset[i][j]
  21. return weight

整体测试文件如下:

[python] view plaincopyprint?

  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 > 0: return 1.0
  8. else: return 0.0
  9. def logistic_classify(data, weight):
  10. prob = sigmoid(data, weight)
  11. if prob > 0.5: return 1.0
  12. else: return 0.0
  13. def grad_ascent(dataset, datalabel):
  14. weight = [1 for i in range(len(dataset[0]))]
  15. alpha = 0.01
  16. for k in range(500):
  17. errset = []
  18. for i in range(len(dataset)):
  19. sig = sigmoid(dataset[i], weight)
  20. errset.append(datalabel[i]-sig)
  21. for i in range(len(dataset[0])):
  22. for j in range(len(dataset)):
  23. weight[i] += alpha*dataset[j][i]*errset[j]
  24. return weight
  25. def rand_grad_ascent(dataset, datalabel):
  26. weight = [1 for i in range(len(dataset[0]))]
  27. alpha = 0.01
  28. for i in range(len(dataset)):
  29. sig = sigmoid(dataset[i], weight)
  30. err = datalabel[i] - sig
  31. for j in range(len(weight)):
  32. weight[j] += alpha*err*dataset[i][j]
  33. return weight
  34. def test(class_func):
  35. f_train = open(‘horseColicTraining.txt‘)
  36. f_test = open(‘horseColicTest.txt‘)
  37. trainset, trainlabel = [], []
  38. for line in f_train.readlines():
  39. line_cur = line.strip().split(‘\t‘)
  40. trainset.append([1]+[float(line_cur[i]) for i in range(21)])
  41. trainlabel.append(float(line_cur[21]))
  42. trainweight = class_func(trainset, trainlabel)
  43. errnu, tolnum= 0, 0
  44. for line in f_test.readlines():
  45. line_cur = line.strip().split(‘\t‘)
  46. pred_class = logistic_classify([1]+[float(line_cur[i]) for i in range(21)], trainweight)
  47. read_class = float(line_cur[21])
  48. if pred_class == read_class:
  49. #print "class succ"
  50. pass
  51. else:
  52. errnu += 1
  53. #print "class fail, read_class=%d, pred_class=%d" %(read_class, pred_class)
  54. tolnum += 1
  55. print "totol num=%d, fail num = %d, rate = %f" % (tolnum, errnu, float(errnu)/tolnum)
  56. if __name__ == ‘__main__‘:
  57. test(grad_ascent)
  58. test(rand_grad_ascent)
时间: 2024-10-18 14:01:32

Logistic回归,梯度上升算法的实现的相关文章

Logistic回归

Logistic回归 主要思想: 根据训练集找到一个适合的预测函数(线性函数),一般用h表示,该函数就是我们需要找的分类函数,用它来预测输入数据的分类. 构造一个Cost(损失函数),该函数为每个输入数据的预测类别(h)与真实数据的类别(y)之间的偏差,可以以二者间的差值,即(h-y)或其他形式来计算偏差.由于需要综合考虑所有训练数据的损失,需要将数据的损失求和或求平均,表示所有训练数据预测出的类别与实际类别的偏差,将Cost求和或者求平均,记为J(θ),表示所有训练数据预测值与实际值得偏差.

机器学习实战 logistic回归

logistic回归 梯度上升法 import numpy as np """ function: 加载数据 parameter: 无 returns: dataMat - 数据集 labelMat - 标签集 """ def loadDataSet(): dataMat = []#数据集 labelMat = []#标签集 fr = open('testSet.txt') for line in fr.readlines(): lineArr

梯度上升法求解Logistic回归

回顾上次内容:http://blog.csdn.net/acdreamers/article/details/27365941 经过上次对Logistic回归理论的学习,我们已经推导出取对数后的似然函数为 现在我们的目的是求一个向量,使得最大.其中 对这个似然函数求偏导后得到 根据梯度上升算法有 进一步得到 我们可以初始化向量为0,或者随机值,然后进行迭代达到指定的精度为止. 现在就来用C++一步一步实现Logistic回归,我们对文章末尾列出的数据进行训练. 首先,我们要对文本进行读取,在训练

2.9 logistic回归中的梯度下降法(非常重要,一定要重点理解)

怎么样计算偏导数来实现logistic回归的梯度下降法 它的核心关键点是其中的几个重要公式用来实现logistic回归的梯度下降法 接下来开始学习logistic回归的梯度下降法 logistic回归的公式 现在只考虑单个样本的情况,关于该样本的损失函数定义如上面第三个公式,其中a是logistic回归的输出,y是样本的基本真值标签值, 下面写出该样本的偏导数流程图 假设样本只有两个特征x1和x2 为了计算Z,我们需要输入参数w1和w2和b 因此在logistic回归中,我们要做的就是变换参数w

机器学习算法(优化)之一:梯度下降算法、随机梯度下降(应用于线性回归、Logistic回归等等)

本文介绍了机器学习中基本的优化算法-梯度下降算法和随机梯度下降算法,以及实际应用到线性回归.Logistic回归.矩阵分解推荐算法等ML中. 梯度下降算法基本公式 常见的符号说明和损失函数 X :所有样本的特征向量组成的矩阵 x(i) 是第i个样本包含的所有特征组成的向量x(i)=(x(i)1,x(i)2...,x(i)n) y(i) 第i个样本的label,每个样本只有一个label,y(i)是标量(一个数值) hθ(x(i)) :拟合函数,机器学习中可以用多种类型的拟合函数 θ 是函数变量,

logistic回归与手写识别例子的实现

本文主要介绍logistic回归相关知识点和一个手写识别的例子实现 一.logistic回归介绍: logistic回归算法很简单,这里简单介绍一下: 1.和线性回归做一个简单的对比 下图就是一个简单的线性回归实例,简单一点就是一个线性方程表示 (就是用来描述自变量和因变量已经偏差的方程) 2.logistic回归 可以看到下图,很难找到一条线性方程能将他们很好的分开.这里也需要用到logistic回归来处理了. logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,

5 Logistic回归(二)

5.2.4 训练算法:随机梯度上升 梯度上升算法:在每次更新回归系数时都需要遍历整个数据集,在数十亿样本上该算法复杂度太高. 改进方法:随机梯度上升算法:一次仅用一个样本点更新回归系数. 由于可以在新样本到来时对分类器进行增量式更新,因此随机梯度上升算法是一个在线学习算法.与“在线学习”相对应,一次处理所有数据被称作“批处理”. #5-3:随机梯度上升算法 def stocGradAscent0(dataMatrix, classLabels): m, n = shape(dataMatrix)

机器学习实战读书笔记(五)Logistic回归

Logistic回归的一般过程 1.收集数据:采用任意方法收集 2.准备数据:由于需要进行距离计算,因此要求数据类型为数值型.另外,结构化数据格式则最佳 3.分析数据:采用任意方法对数据进行分析 4.训练算法:大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数 5.测试算法:一旦训练步骤完成,分类将会很快. 6.使用算法:首 先,我们需要输入一些数据,并将其转换成对应的结构化数值:接着,基于训练好的回归系数就可以对这些数值进行简单回归计算,判定它们属于哪个类别:在这之后,我们就可以在输

机器学习(4)之Logistic回归

机器学习(4)之Logistic回归 1. 算法推导 与之前学过的梯度下降等不同,Logistic回归是一类分类问题,而前者是回归问题.回归问题中,尝试预测的变量y是连续的变量,而在分类问题中,y是一组离散的,比如y只能取{0,1}. 假设一组样本为这样如图所示,如果需要用线性回归来拟合这些样本,匹配效果会很不好.对于这种y值只有{0,1}这种情况的,可以使用分类方法进行. 假设,且使得 其中定义Logistic函数(又名sigmoid函数): 下图是Logistic函数g(z)的分布曲线,当z