2022建模国赛C题——逻辑回归的应用

        本次数学建模第二小问让我们探究玻璃分类的规律。而看到分类,我便想起了最近在学习机器学习,正好讲到了逻辑回归,正好可以解决这个分类问题,我便顺理成章的去深入了解了一下这个算法。

一,逻辑回归的原理

        关于逻辑回归的原理,我去翻阅了博客,找到了算法原理和部分代码,在这我就不写了:

(187条消息) 逻辑回归(Logistic Regression)详解_生信小兔的博客-CSDN博客_逻辑回归

二,数据处理

        我们要求的是sigmoid函数的多维形式:

        h(x^{i})=\frac{1}{1+e^{-(w^{T}x^{i}+b))}}

        我们要求根据训练样本来求参数w了。怎么求解的,上面的博客讲解的很清楚,再此我重点讲解一下我解题的思路。

        先用WPS或excel将空缺值处理补0,然后转化成csv格式(个人习惯),但要在JupyterLab上运行必须用记事本打开另存为UTF-8格式。

        为了给机器留有训练数据,我们先将人工分类数据,既将高钾(记为1)和铅钡(记为0)分开,然后进行机器学习的训练。

        至于怎么选择特征,emmm,当时由于没有想那么多,根据第一问的数据分析,我们只将二氧化硅(SiO2)作为分类的唯一标准,而验证灵敏度时,我们额外增加其他特征,来观察最终的分类结果,从而来判断我们用的这个逻辑回归是否合理。(个人感觉有些牵强,但是由于时间有限,就只能想这么多)

        但我个人觉得这样做过于主观了,在比完赛后我去翻阅了一下西瓜书,发现可以用其他办法进行机器的自动分类,这个我们先不说。

三,代码求解

        再优秀的理论都要用实验来检验,当时比赛的时候偷懒了,用spsspro直接分析,但是身为优秀的当代大学生,必须亲身实践,才能有所收获。接下来我将用python一步一步的来实现我们想要的结果。

import numpy as np
import pandas as pd

def 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]))
    xmat=np.mat(x)
    ymat=np.mat(y).T
    file.close()
    return xmat,ymat

def w_calc(xmat,ymat,alpha=0.001,maxlter=1000):
    w=np.mat(np.random.randn(3,1))
    w_save=[]
    for i in range(maxlter):
        H = 1/(1+np.exp(-xmat*w))
        dw=xmat.T*(H-ymat)
        w-=alpha*dw
        if i%100==0:
            w_save.append([w.copy(),i])
    return w,w_save

        

        loaddata函数是将数据转化成矩阵形式。             

        w_calc函数是关键的训练过程

xmat,ymat=loaddata('./b.txt')
print('xmat:',xmat,xmat.shape)
print('ymat:',ymat,ymat.shape)
w,w_save=w_calc(xmat,ymat,0.001,1000)
print("w:",w)

 这是转化成的矩阵列表:

 

         🆗,这下就很直观的显示了数据的分布情况了,接下来我们就来找一条线将这个数据集分成两个部分了。

     

#展示
import warnings
warnings.filterwarnings('ignore')
for wi in w_save:
    plt.clf()
    w0 = wi[0][0,0]
    w1 = wi[0][1,0]
    w2 = wi[0][2,0]
    plotx1=np.arange(0,100,1)
    plotx2=-w0/w2-w1/w2*plotx1
    plt.plot(plotx1,c='r',label='decision boundary')
    
    plt.scatter(xmat[:,1][ymat==0].A,xmat[:,2][ymat==0].A,marker='^',s=150,label='label=0')
    plt.scatter(xmat[:,1][ymat==1].A,xmat[:,2][ymat==1].A,s=150,label='label=1')
    plt.grid()
    plt.legend()
    plt.title('iter:%s'%np.str(wi[1]))
    plt.pause(0.001)
plt.show()

这是经过第九百次训练后给出的分割直线。

最后再来看一下这个直线的数据: 

print('常数项:',-w0/w2)
print('x矩阵系数:',-w1/w2)

 常数项: 7.2342027714137735

x矩阵系数: 0.1878059625463007

代码讲解我是参考b站上的视频: 

逻辑斯蒂回归(Logistic Regression)_哔哩哔哩_bilibili

这下我们就完成初步的训练阶段。接下来几篇我们将讨论如何去使用我们的训练模型,以及更细致的讲解分类过程,以及我个人的思路。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值