使用梯度下降的逻辑回归

1.问题的描述
给出两组数据,每组数据分别赋予不同的类别,例如0,1.。使用逻辑回归对其进行分类。

2.解决思路
算法原理:
1)二项逻辑回归模型:
P(Y=0∣x)=1/(1+eω⋅x+b)
P(Y=1∣x)= e(ω⋅x+b)/(1+eω⋅x+b)
其中x∈Rn是输入,Y∈{0,1}是输出,ω∈ Rn和b∈R 是参数,ω称为权值向量,b称为偏置,ω⋅x为ω和x的内积。有时为了方便,将权值向量和输入向量加以扩充,仍然记为ω和x,但是ω=(ω1 ,ω2 , . . . , ωn ,b )T,x = (x1,x 2 , . . . , x n , 1 ) T。在这种情况下,二项逻辑回归模型如下:
P(Y=0∣x)=1/(1+eω⋅x)P(Y=1∣x)= eω⋅x/(1+eω⋅x)定义sigmoid函数为 sigmoid(z)=1/(1+e-z)
2) 似然函数法估计模型参数ω
设P (Y =1∣x)=π(x),P (Y=0∣x)=1-π(x),则似然函数为∏[π(xi)]yi[1− π(xi)]1−yi对数似然函数为:

不加正则项的损失函数为:

加入正则项的损失函数:

求L( ω ) 的 极 大 值的极大值(ω)的极大值,得到ω不加正则项求ω :

接下来可以由随机梯度下降法求解ω同理加入正则项的梯度为:

3.实验做法
def disgaosi():#生成两组不满足朴素贝叶斯的高斯数据用来分类
def gaosi():#生成两组满足朴素贝叶斯的高斯数据用来分类
def dataguifan(hmx,hmy,hmx1,hmy1): #将数据变成矩阵和向量用来逻辑回归分类
def loaddata(filename): #如果你想,也可以利用这个函数从文件中读取数据用于分类

def tidu(x1,y1,alpha,max): #梯度下降
def tidu2(x1,y1,alpha,max):#梯度下降+正则项

def zqlv(chmx,chmy,chmx1,chmy1,chy,w0,w1,w2,data):#用来求随机生成的数据正确率
def zqlv2(h01,hy,w0,w1,w2):#用来求从文件中读取的数据的正确率

以下是实现的代码:
#h01,hy = loaddata(‘data.txt’)

‘’‘hmx,hmy,hmx1,hmy1 = gaosi() #训练集
h01,hy = dataguifan(hmx,hmy,hmx1,hmy1) #训练集
chmx,chmy,chmx1,chmy1 = gaosi() #测试集
ch01,chy = dataguifan(chmx,chmy,chmx1,chmy1)#测试集’’’

hmx,hmy,hmx1,hmy1 = disgaosi() #训练集
h01,hy = dataguifan(hmx,hmy,hmx1,hmy1) #训练集
chmx,chmy,chmx1,chmy1 = disgaosi() #测试集
ch01,chy = dataguifan(chmx,chmy,chmx1,chmy1)#测试集’’’

W = tidu(h01,hy,alpha,max)
WC = tidu2(h01,hy,alpha,max)
print(‘W’,W)
print(‘WC’,WC)

W0 = W[0,0]
W1 = W[1,0]
W2 = W[2,0]
WC0 = WC[0,0]
WC1 = WC[1,0]
WC2 = WC[2,0]

#lv2 = zqlv2(h01,hy,W0,W1,W2) #data文件夹里的数据的正确率
#print(‘Accuracy:’,lv2100,’%’) #正确率
#lv2C = zqlv2(h01,hy,WC0,WC1,WC2) #data文件夹里的数据的正确率
#print(‘Accuracy:’,lv2C
100,’%’) #正确率

lv = zqlv(chmx,chmy,chmx1,chmy1,chy,W0,W1,W2,data) #测试集正确率
print(‘Accuracy:’,lv100,’%’)
lvC = zqlv(chmx,chmy,chmx1,chmy1,chy,WC0,WC1,WC2,data) #测试集+惩罚项正确率
print(‘Accuracy+C:’,lvC
100,’%’)

plotx1 = np.arange(-5,7.5,0.01)
plotx2 = -W0/W2 - W1/W2plotx1
plotxWC2 = -WC0/WC2 - WC1/WC2
plotx1
plt.plot(plotx1,plotx2,c=‘r’,label=‘fenjiexian’)
plt.plot(plotx1,plotxWC2,c=‘b’,label=‘fenjiexian+C’)

#plt.scatter(hmx,hmy,c = ‘g’) #训练集的点 y=0
#plt.scatter(hmx1,hmy1,c = ‘r’,marker=’^’) #训练集的点 y=1

plt.scatter(chmx,chmy,c = ‘r’,label=‘y=0’) #测试集的点 y=0
plt.scatter(chmx1,chmy1,c = ‘g’,marker=’^’,label=‘y=1’) #测试集的点 y=1

#plt.scatter(h01[:,1][hy0].A,h01[:,2][hy0].A,marker=’^’,c = ‘r’,label=‘y=0’) #文件中读取的数 y=0
#plt.scatter(h01[:,1][hy1].A,h01[:,2][hy1].A,c = ‘g’,label=‘y=1’) # y=1

plt.grid()
plt.legend()
plt.show()

4.实验结果的分析和结论
GS data = 200 Accuracy:0.94 Accuracy:0.94

DIsGS data = 200 Accuracy:0.855 Accuracy:0.855

UCI data = 100 Accuracy=0.99 Accuracy=0.99


结论:1)关于惩罚项:对于逻辑回归带有惩罚项和没有惩罚项的差别没有多项式拟合函数那么大,在我所用的梯度下降法中当条件完全相同时,基本没有差异(大概运行十次会出现一次不同,还得是数据量很大的时候),所以我认为在逻辑回归中加入正则项无必要,只要迭代次数够多就行。
2)我本次实验采用的是2维数据,但经过我对逻辑回归的理解,认为只要方法正确无论几维的数据都可以用逻辑回归来分类,只不过是超过3维就不能画出图像。并且在代码实现方面并没有很多不同,顶多是在加几行向量而已。
3)非朴素贝叶斯数据和满足朴素贝叶斯的数据其实无太大差别,我给出的图象是有10%的差别,但是在更多的实验中平均差别并不大。也就是说逻辑回归可以灵活运用在非朴素贝叶斯数据和满足朴素贝叶斯的数据中。

#Logical disgs.py
import numpy as np
import math
import matplotlib.pyplot as plt
import pandas as pd
import random
data = 100alpha  =  0.001 #步长
max = 100000#迭代次数
rank = 3 #维数def disgaosi():x = np.random.normal(0,2,data).reshape(data,1) #data个高斯噪声data*1y = np.random.normal(0,2,data).reshape(data,1) #data个高斯噪声data*1hmx3 =  np.ones((data,1))*3  #data*1的全3矩阵x1 = x+hmx3y1 = y+hmx3return x,y,x1,y1def dataguifan(hmx,hmy,hmx1,hmy1):hmx0 =  np.ones((data,1))*0  #data*1的全0矩阵hm = np.hstack((hmx,hmy))   #合并x,yhmx11 =  np.ones((data,1))*1  #data*1的全1矩阵hm1 = np.hstack((hmx1,hmy1))  #合并x1,y1hmx2 = np.ones((2*data,1))*1 #生成2*data*1的全1矩阵h01 = np.vstack((hm,hm1))    #合并hm和hm1h01 = np.hstack((hmx2,h01))  #生成[1,hm,hm1]矩阵hy = np.vstack((hmx0,hmx11))  #生成特征矩阵data*1的return h01,hydef tidu(x1,y1,alpha,max): #梯度下降W = np.mat(np.random.randn(rank,1))for i in range(0,max):H = 1/(1+np.exp(-1*x1*W))dw = x1.T*(H-y1)#3,1W = W - alpha*dwreturn Wdef tidu2(x1,y1,alpha,max):#梯度下降+正则项W = np.mat(np.random.randn(rank,1))for i in range(0,max):W = W*(1-1e-4)    #正则项H = 1/(1+np.exp(-1*x1*W))dw = x1.T*(H-y1)#3,1W = W - alpha*dwreturn Wdef zqlv(chmx,chmy,chmx1,chmy1,chy,w0,w1,w2,data):x = 0y = 0for i in range(0,data):if  (w0+w1*chmx[i]+w2*chmy[i]>=0.0):x = x+1if  (w0+w1*chmx1[i]+w2*chmy1[i]<=0.0):y = y+1return 1-(x+y)/(2*data)hmx,hmy,hmx1,hmy1 = disgaosi()   #训练集
h01,hy = dataguifan(hmx,hmy,hmx1,hmy1) #训练集
chmx,chmy,chmx1,chmy1 = disgaosi()  #测试集
ch01,chy = dataguifan(chmx,chmy,chmx1,chmy1)#测试集'''W = tidu(h01,hy,alpha,max)
WC = tidu2(h01,hy,alpha,max)
print('W',W)
print('WC',WC)W0 = W[0,0]
W1 = W[1,0]
W2 = W[2,0]
WC0 = WC[0,0]
WC1 = WC[1,0]
WC2 = WC[2,0]lv = zqlv(chmx,chmy,chmx1,chmy1,chy,W0,W1,W2,data)  #测试集正确率
print('Accuracy:',lv*100,'%')
lvC = zqlv(chmx,chmy,chmx1,chmy1,chy,WC0,WC1,WC2,data)  #测试集+惩罚项正确率
print('Accuracy+C:',lvC*100,'%')plotx1 = np.arange(-5,7.5,0.01)
plotx2 = -W0/W2 - W1/W2*plotx1
plotxWC2 = -WC0/WC2 - WC1/WC2*plotx1
plt.plot(plotx1,plotx2,c='r',label='fenjiexian')
plt.plot(plotx1,plotxWC2,c='b',label='fenjiexian+C')#plt.scatter(hmx,hmy,c = 'g')                 #训练集的点  y=0
#plt.scatter(hmx1,hmy1,c = 'r',marker='^')     #训练集的点  y=1plt.scatter(chmx,chmy,c = 'r',label='y=0')                #测试集的点  y=0
plt.scatter(chmx1,chmy1,c = 'g',marker='^',label='y=1')   #测试集的点  y=1plt.grid()
plt.legend()
plt.show()
#Logical gs.py
import numpy as np
import math
import matplotlib.pyplot as plt
import pandas as pd
import random
data = 100alpha  =  0.001 #步长
max = 100000#迭代次数
rank = 3def gaosi():x = np.random.normal(0,2,data).reshape(data,1) #data个高斯噪声data*1y = np.random.normal(0,2,data).reshape(data,1) #data个高斯噪声data*1x1 = np.random.normal(5,2,data).reshape(data,1) #data个高斯噪声data*1y1 = np.random.normal(5,2,data).reshape(data,1) #data个高斯噪声data*1return x,y,x1,y1def dataguifan(hmx,hmy,hmx1,hmy1):hmx0 =  np.ones((data,1))*0  #data*1的全0矩阵hm = np.hstack((hmx,hmy))   #合并x,yhmx11 =  np.ones((data,1))*1  #data*1的全1矩阵hm1 = np.hstack((hmx1,hmy1))  #合并x1,y1hmx2 = np.ones((2*data,1))*1 #生成2*data*1的全1矩阵h01 = np.vstack((hm,hm1))    #合并hm和hm1h01 = np.hstack((hmx2,h01))  #生成[1,hm,hm1]矩阵hy = np.vstack((hmx0,hmx11))  #生成特征矩阵data*1的return h01,hydef tidu(x1,y1,alpha,max): #梯度下降W = np.mat(np.random.randn(rank,1))for i in range(0,max):H = 1/(1+np.exp(-1*x1*W))dw = x1.T*(H-y1)#3,1W = W - alpha*dwreturn Wdef tidu2(x1,y1,alpha,max):#梯度下降+正则项W = np.mat(np.random.randn(rank,1))for i in range(0,max):W = W*(1-1e-4)    #正则项H = 1/(1+np.exp(-1*x1*W))dw = x1.T*(H-y1)#3,1W = W - alpha*dwreturn Wdef zqlv(chmx,chmy,chmx1,chmy1,chy,w0,w1,w2,data):x = 0y = 0for i in range(0,data):if  (w0+w1*chmx[i]+w2*chmy[i]>=0.0):x = x+1if  (w0+w1*chmx1[i]+w2*chmy1[i]<=0.0):y = y+1return 1-(x+y)/(2*data)hmx,hmy,hmx1,hmy1 = gaosi()   #训练集
h01,hy = dataguifan(hmx,hmy,hmx1,hmy1) #训练集
chmx,chmy,chmx1,chmy1 = gaosi()  #测试集
ch01,chy = dataguifan(chmx,chmy,chmx1,chmy1)#测试集'''W = tidu(h01,hy,alpha,max)
WC = tidu2(h01,hy,alpha,max)
print('W',W)
print('WC',WC)W0 = W[0,0]
W1 = W[1,0]
W2 = W[2,0]
WC0 = WC[0,0]
WC1 = WC[1,0]
WC2 = WC[2,0]lv = zqlv(chmx,chmy,chmx1,chmy1,chy,W0,W1,W2,data)  #测试集正确率
print('Accuracy:',lv*100,'%')
lvC = zqlv(chmx,chmy,chmx1,chmy1,chy,WC0,WC1,WC2,data)  #测试集+惩罚项正确率
print('Accuracy+C:',lvC*100,'%')plotx1 = np.arange(-5,7.5,0.01)
plotx2 = -W0/W2 - W1/W2*plotx1
plotxWC2 = -WC0/WC2 - WC1/WC2*plotx1
plt.plot(plotx1,plotx2,c='r',label='fenjiexian')
plt.plot(plotx1,plotxWC2,c='b',label='fenjiexian+C')#plt.scatter(hmx,hmy,c = 'g')                 #训练集的点  y=0
#plt.scatter(hmx1,hmy1,c = 'r',marker='^')     #训练集的点  y=1plt.scatter(chmx,chmy,c = 'r',label='y=0')                #测试集的点  y=0
plt.scatter(chmx1,chmy1,c = 'g',marker='^',label='y=1')   #测试集的点  y=1plt.grid()
plt.legend()
plt.show()
Logical UCI.PY
import numpy as np
import math
import matplotlib.pyplot as plt
import pandas as pd
import random
data = 100alpha  =  0.001 #步长
max = 100000#迭代次数
rank = 3 #维数def dataguifan(hmx,hmy,hmx1,hmy1):hmx0 =  np.ones((data,1))*0  #data*1的全0矩阵hm = np.hstack((hmx,hmy))   #合并x,yhmx11 =  np.ones((data,1))*1  #data*1的全1矩阵hm1 = np.hstack((hmx1,hmy1))  #合并x1,y1hmx2 = np.ones((2*data,1))*1 #生成2*data*1的全1矩阵h01 = np.vstack((hm,hm1))    #合并hm和hm1h01 = np.hstack((hmx2,h01))  #生成[1,hm,hm1]矩阵hy = np.vstack((hmx0,hmx11))  #生成特征矩阵data*1的return h01,hydef loaddata(filename):  #如果你想,也可以利用这个函数从文件中读取数据file = open(filename)x = []y = []for line in file.readlines():line = line.strip().split()x.append([1,float(line[0]),float(line[1])])y.append(float(line[-1]))x1 = np.mat(x)y1 = np.mat(y).Tfile.closereturn x1,y1def tidu(x1,y1,alpha,max): #梯度下降W = np.mat(np.random.randn(rank,1))for i in range(0,max):H = 1/(1+np.exp(-1*x1*W))dw = x1.T*(H-y1)#3,1W = W - alpha*dwreturn Wdef tidu2(x1,y1,alpha,max):#梯度下降+正则项W = np.mat(np.random.randn(rank,1))for i in range(0,max):W = W*(1-1e-4)    #正则项H = 1/(1+np.exp(-1*x1*W))dw = x1.T*(H-y1)#3,1W = W - alpha*dwreturn Wdef zqlv2(h01,hy,w0,w1,w2):data1 = np.size(hy,0)print('data1',data1)x = 0.0y = 0.0for i in range(0,data1):if((w0+w1*h01[:,1][i]+w2*h01[:,2][i]>=0.0) and (hy[i]==0)):x=x+1if((w0+w1*h01[:,1][i]+w2*h01[:,2][i]<=0.0) and (hy[i]==1)):y =y+1return 1-(x+y)/data1h01,hy = loaddata('data.txt')W = tidu(h01,hy,alpha,max)
WC = tidu2(h01,hy,alpha,max)
print('W',W)
print('WC',WC)W0 = W[0,0]
W1 = W[1,0]
W2 = W[2,0]
WC0 = WC[0,0]
WC1 = WC[1,0]
WC2 = WC[2,0]lv2 = zqlv2(h01,hy,W0,W1,W2)   #data文件夹里的数据的正确率
print('Accuracy:',lv2*100,'%')         #正确率lv2C = zqlv2(h01,hy,WC0,WC1,WC2)   #data文件夹里的数据的正确率
print('Accuracy+C:',lv2C*100,'%')         #正确率plotx1 = np.arange(4,8,0.01)
plotx2 = -W0/W2 - W1/W2*plotx1
plotxWC2 = -WC0/WC2 - WC1/WC2*plotx1
plt.plot(plotx1,plotx2,c='r',label='fenjiexian')
plt.plot(plotx1,plotxWC2,c='b',label='fenjiexian+C')plt.scatter(h01[:,1][hy==0].A,h01[:,2][hy==0].A,marker='^',c = 'r',label='y=0')  #文件中读取的数 y=0
plt.scatter(h01[:,1][hy==1].A,h01[:,2][hy==1].A,c = 'g',label='y=1')               #  y=1plt.grid()
plt.legend()
plt.show()

HIT机器学习lab2相关推荐

  1. HIT机器学习Lab3

    1 实验目的 实现一个k-means算法和混合高斯模型,并且用EM算法估计模型中的参数. 2实验要求 测试: 用高斯分布产生k个高斯分布的数据(不同均值和方差)(其中参数自己设定). (1)用k-me ...

  2. 机器学习实验二(李宏毅-判断年收入)

    机器学习 Lab2 实验报告 欢迎大家访问我的GitHub博客 https://lunan0320.github.io/ 文章目录 一.实验目的 二.实验要求及环境 2.1 实验要求 2.2实验环境 ...

  3. HIT 软件构造 lab2

    1 实验目标概述··· 1 2 实验环境配置··· 1 3 实验过程··· 1 3.1 Poetic Walks· 1 3.1.1 Get the code and prepare Git repos ...

  4. 关于hit软件构造lab2实验后回顾

    1 实验目标概述 本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象编程(OOP)技术实现ADT.具体来说:  针对给定的应用问题,从问题描述中识别所需的ADT:  设计ADT规 ...

  5. HIT软件构造lab2

    实验目标概述 根据实验手册简要撰写.本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象 编程(OOP)技术实现 ADT.具体来说:针对给定的应用问题,从问题描述中识别所需的 ADT: ...

  6. HIT软件构造lab2报告

    1. 实验目标概述 本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象 编程(OOP)技术实现 ADT.具体来说: l 针对给定的应用问题,从问题描述中识别所需的 ADT: l 设计 ...

  7. HIT 软件构造 lab2实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 学号 1180300223 班号 1803002 目录 1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3 ...

  8. HIT软构lab2中GraphPoet的一种实现

    首先是第一个方法GraphPoet的实现 public GraphPoet(File corpus) throws IOException {BufferedReader br = new Buffe ...

  9. HIT 软件构造LAB2

    2022年春季学期 计算学部<软件构造>课程 Lab 2实验报告 姓名 薄文 学号 120L020513 班号 2003004 电子邮件 604094538@qq.com 手机号码 181 ...

最新文章

  1. 一文掌握 Linux 内存管理
  2. HTML P不能包含块级元素(包括自身)
  3. CVPR2021开源项目,带你傲游宇宙!
  4. bzoj 4516: [Sdoi2016]生成魔咒
  5. Java项目:医院药品管理系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)
  6. Foxit PDF Creator注册码
  7. 阿里中间件seata源码剖析七:saga模式实现
  8. Wincc 开机自检动态展示
  9. 电脑使用哪个录制视频软件比较好
  10. 边境的悍匪—机器学习实战:第十三章 使用TensorFlow加载和预处理数据
  11. mysql被替换的文件如何恢复吗_文件被覆盖替换了怎么找回来
  12. SVN主干代码合并到分支(trunk to branch)
  13. 我想咨询一下Python,请问在哪儿找资源比较好呀?
  14. html上中下布局关键字,HTML中关键字SEO优化布局位置
  15. CDOJ 1321柱爷的恋爱 (区间dp)
  16. Net通用进销存管理系统 + 开发文档+ 使用说明
  17. 还敢买房的看看了,尖峰时刻之房价真相:上海vs东京(ZT)
  18. vue+element实现导入和导出excel
  19. T65正点原子智能烙铁】
  20. 压力开关/压力控制器的应用

热门文章

  1. python中+=是什么意思,python中+=是什么意思
  2. Web 发送 form-data 请求 Content-Type: multipart/form-data
  3. SSO 是 什 么?
  4. 分割视频成图片+labelimg标注数据集
  5. 云徙数字中台3.0,可升级的数字化转型底座
  6. 自动化专业中的c语言案例分析,案例教学法论文,关于案例教学法在《c语言程序设计》课程中的应用相关参考文献资料-免费论文范文...
  7. 多台Linux主机之间ssh 互信配置
  8. 轮播图中间图片大,两边图片小
  9. Android BLE低功耗蓝牙开发
  10. 我的嵌入式软硬件学习(三)