Logistic回归的牛顿法及DFP、BFGS拟牛顿法求解

牛顿法

 

  1  # coding:utf-8
  2 import matplotlib.pyplot as plt
  3 import numpy as np
  4 
  5 def dataN(length):#生成数据
  6     x = np.ones(shape = (length,3))
  7     y = np.zeros(length)
  8     for i in np.arange(0,length/100,0.02):
  9         x[100*i][0]=1
 10         x[100*i][1]=i
 11         x[100*i][2]=i + 1 + np.random.uniform(0,1.2)
 12         y[100*i]=1
 13         x[100*i+1][0]=1
 14         x[100*i+1][1]=i+0.01
 15         x[100*i+1][2]=i+0.01 + np.random.uniform(0,1.2)
 16         y[100*i+1]=0
 17     return x,y
 18 
 19 def sigmoid(x): #simoid 函数
 20     return 1.0/(1+np.exp(-x))
 21 
 22 def DFP(x,y, iter):#DFP拟牛顿法
 23     n = len(x[0])
 24     theta=np.ones((n,1))
 25     y=np.mat(y).T
 26     Gk=np.eye(n,n)
 27     grad_last = np.dot(x.T,sigmoid(np.dot(x,theta))-y)
 28     cost=[]
 29     for it in range(iter):
 30         pk = -1 * Gk.dot(grad_last)
 31         rate=alphA(x,y,theta,pk)
 32         theta = theta + rate * pk
 33         grad= np.dot(x.T,sigmoid(np.dot(x,theta))-y)
 34         delta_k = rate * pk
 35         y_k = (grad - grad_last)
 36         Pk = delta_k.dot(delta_k.T) / (delta_k.T.dot(y_k))
 37         Qk= Gk.dot(y_k).dot(y_k.T).dot(Gk) / (y_k.T.dot(Gk).dot(y_k)) * (-1)
 38         Gk += Pk + Qk
 39         grad_last = grad
 40         cost.append(np.sum(grad_last))
 41     return theta,cost
 42 
 43 def BFGS(x,y, iter):#BFGS拟牛顿法
 44     n = len(x[0])
 45     theta=np.ones((n,1))
 46     y=np.mat(y).T
 47     Bk=np.eye(n,n)
 48     grad_last = np.dot(x.T,sigmoid(np.dot(x,theta))-y)
 49     cost=[]
 50     for it in range(iter):
 51         pk = -1 * np.linalg.solve(Bk, grad_last)
 52         rate=alphA(x,y,theta,pk)
 53         theta = theta + rate * pk
 54         grad= np.dot(x.T,sigmoid(np.dot(x,theta))-y)
 55         delta_k = rate * pk
 56         y_k = (grad - grad_last)
 57         Pk = y_k.dot(y_k.T) / (y_k.T.dot(delta_k))
 58         Qk= Bk.dot(delta_k).dot(delta_k.T).dot(Bk) / (delta_k.T.dot(Bk).dot(delta_k)) * (-1)
 59         Bk += Pk + Qk
 60         grad_last = grad
 61         cost.append(np.sum(grad_last))
 62     return theta,cost
 63 
 64 def alphA(x,y,theta,pk): #选取前20次迭代cost最小的alpha
 65     c=float("inf")
 66     t=theta
 67     for k in range(1,200):
 68             a=1.0/k**2
 69             theta = t + a * pk
 70             f= np.sum(np.dot(x.T,sigmoid(np.dot(x,theta))-y))
 71             if abs(f)>c:
 72                 break
 73             c=abs(f)
 74             alpha=a
 75     return alpha
 76 
 77 def newtonMethod(x,y, iter):#牛顿法
 78     m = len(x)
 79     n = len(x[0])
 80     theta = np.zeros(n)
 81     cost=[]
 82     for it in range(iter):
 83         gradientSum = np.zeros(n)
 84         hessianMatSum = np.zeros(shape = (n,n))
 85         for i in range(m):
 86             hypothesis = sigmoid(np.dot(x[i], theta))
 87             loss =hypothesis-y[i]
 88             gradient = loss*x[i]
 89             gradientSum = gradientSum+gradient
 90             hessian=[b*x[i]*(1-hypothesis)*hypothesis for b in x[i]]
 91             hessianMatSum = np.add(hessianMatSum,hessian)
 92         hessianMatInv = np.mat(hessianMatSum).I
 93         for k in range(n):
 94             theta[k] -= np.dot(hessianMatInv[k], gradientSum)
 95         cost.append(np.sum(gradientSum))
 96     return theta,cost
 97 
 98 def tesT(theta, x, y):#准确率
 99     length=len(x)
100     count=0
101     for i in xrange(length):
102         predict = sigmoid(x[i, :] * np.reshape(theta,(3,1)))[0] > 0.5
103         if predict == bool(y[i]):
104             count+= 1
105     accuracy = float(count)/length
106     return accuracy
107 
108 def showP(x,y,theta,cost,iter):#作图
109     plt.figure(1)
110     plt.plot(range(iter),cost)
111     plt.figure(2)
112     color=['or','ob']
113     for i in xrange(length):
114         plt.plot(x[i, 1], x[i, 2],color[int(y[i])])
115     plt.plot([0,length/100],[-theta[0],-theta[0]-theta[1]*length/100]/theta[2])
116     plt.show()
117 length=200
118 iter=5
119 x,y=dataN(length)
120 
121 theta,cost=BFGS(x,y,iter)
122 print theta   #[[-18.93768161][-16.52178427][ 16.95779981]]
123 print tesT(theta, np.mat(x), y)  #0.935
124 showP(x,y,theta.getA(),cost,iter)
125 
126 theta,cost=DFP(x,y,iter)
127 print theta   #[[-18.51841028][-16.17880599][ 16.59649161]]
128 print tesT(theta, np.mat(x), y)  #0.935
129 showP(x,y,theta.getA(),cost,iter)
130 
131 theta,cost=newtonMethod(x,y,iter)
132 print theta   #[-14.49650536 -12.78692552  13.05843361]
133 print tesT(theta, np.mat(x), y)  #0.935
134 showP(x,y,theta,cost,iter)

 

转载于:https://www.cnblogs.com/qw12/p/5656765.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vim复制一个文件的多行到另一个文件

vim打开一个文件后复制多行,退出这个文件之后,打开另一个文件想复制到这个文件,却发现在上一个文件中复制的内容不见了 所以vim复制一个文件的多行到另一个文件的正确做法是要同时打开两个文件 比如要把add.cpp的内容复制到main.cpp 首先v…

memcached客户端_分布式算法真是吊炸天 – memcached - 第287篇

相关历史文章(阅读本文之前,您可能需要先看下之前的系列 )色谈Java序列化:女孩子慎入 - 第280篇烦不烦,别再问我时间复杂度了:这次不色,女孩子进来吧 - 第281篇双向链表,比西天还远&…

2018年中国人工智能100强研究报告

来源:前瞻产业研究院《崛起的超级智能》一书主要阐述当今天人类为人工智能的春天到来而兴奋,为人工智能是否超越人类而恐慌的时候,一个更为庞大、远超人类预期的智能形态正在崛起,种种迹象表明50年来,互联网正在从网状…

事务的隔离性

1、事务隔离级别 事务有四大特性:原子性、一致性、隔离性、持久性。其中事务的隔离比较重要,事务隔离性处理在数据并发量较大的系统显得比较重要。 数据库在事务隔离这块提供了四种事务隔离级别,分别是:读取未提交内容&#xff08…

印度首次挑战登月告败,一步之遥≈多大差距?

来源:三体引力波(the-3body)最坏消息还是来了。今天凌晨,印度探测器首次登月尝试,只差一步之遥,距离月表不到2100米,月船2号着陆器与班加罗尔控制中心失去联系,信号中断,…

word交叉引用插入文献后更新域之后编号未更新

这篇文章不教怎么设置交叉引用,这篇文章说的是设好了交叉引用,在某一条文献后面添加了一个文献后,选中全文,右键更新域,编号项仍然没有改变!! 这是因为刚刚在插入文献时是在上一条文献的编号项…

python项目画幅好画_python基础教程总结15——2 画幅好画

标签:要求:从Internet上下载数据文件; 分析数据文件并提取感兴趣的部分工具:图形生成包(ReportLab,PYX等)数据:太阳黑子和射电辐射流量(http://services.swpc.noaa.gov/text/predicted-sunspot-radio-flux…

耐能团队论文登上《自然·电子学》:集成忆阻器与CMOS以实现更好的AI

《自然电子学》杂志封面(资料图,来源:《自然》官网)来源:Kneron耐能近日,《自然》杂志子刊《自然电子学》(Nature Electronics)发表论文《集成忆阻器与CMOS以实现更好的AI》&#xf…

出发

在五点闹铃响的那一刻,小美醒了,叫醒还在熟睡的我,看着窗外已经透亮。快速洗漱,跟小美拥抱,妈妈也起床,“高兴去,平安归”带着每次出门时妈妈的祝福走出家门,坐上昨晚小美预订的滴滴…

word交叉引用多条文献

有时候需要引用多条连续的文献,例如[1][2][3]需要把它变为[1-3],更新域后不受影响仍然正确。 4、选中这两个代码域,右键->切换域代码,再选中这两个代码域,右键->更新域,引用号码变为[13],…

pppcloud云主机内LINUX用户安全管理2

◆超级用户权限与授权 ●建立多个超级用户 不少新系统管理员认为root用户是唯一的超级用户,其实root只是系统默认的超级用户的名称,root并非因为它叫root而成为超级用户的。随便打开一个/etc/passwd文件的例子,你就会发现如下几行&#xff1a…

一份完全解读:是什么使神经网络变成图神经网络?

图1:来自(Bruna等人,ICLR,2014)的图,描绘了3D领域内的MNIST图像。虽然卷积网络很难对球面数据进行分类,但是图网络可以很自然地处理它。可以把它当做是一个处理工具,但在实际应用程序中会出现许多类似的任务…

linux的exec函数

在用fork函数创建子进程后,子进程往往要调用一个exec函数以执行另一个程序 当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程I D并未改变。exec只是…

python中get函数作用_python get函数有什么作用?示例解析

这篇文章之中我们来了解一下关于python字典之中的pythonget函数的相关知识,get函数是什么意思,他有什么作用都将会在接下来的文章之中得到解答。描述Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。语法get(…

C++vector的reserve和resize比原来的容量小

vector的resize()函数的作用是改变vector元素个数 reverse()函数的作用是改变容量 如果v.reserve(n)函数的n的大小比vector原来的容量小。容量没有变化。size也没有变: 如果v.resize(n)函数的n比vector原来的size小,结果是size…

sql server 游标的使用方法

数据库游标:是面向行来取数据集合的标识,可以很好的弥补面向表或数据集合阅读数据的不便之处;游标的内存消耗也很大,所以使用有标签还要衡量是否值得使用游标标识。 游标举例: declare test_cursor cursor --定义游标…

中国芯片将靠此超车!RISC-V架构神在哪全解构【附下载】

来源: 智东西RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA),简易解释为开源软件运动相对应的一种“开源硬件”。该项目2010年始于加州大学伯克利…

sha256校验工具_使用AIDE工具做入侵检测

AIDE(Advanced Intrusion Detection Environment,高级入侵检测环境)是个入侵检测工具,主要用途是检查文档的完整性。AIDE能够构造一个指定文档的数据库,他使用aide.conf作为其配置文档。AIDE数据库能够保存文档的各种属性,包括:权…

transition过渡的趣玩

本例中将三张图&#xff08;来自网络&#xff09;进行堆叠&#xff0c;鼠标悬停触发。附有源代码 <!DOCTYPE html> <html> <head><title>照片墙</title><meta charset"utf-8"><style type"text/css">.parent{wi…

内存管理之段错误

当程序试图访问不允许访问的内存位置&#xff0c;或试图以不允许的方式访问内存位置时会发生段错误。 几种常见的段错误&#xff1a; 使用野指针 试图修改字符串常量的内容 数组越界 堆栈溢出