机器学习/人工智能 实验一:典型监督学习方法分类实践与比较分析

news2024/12/23 1:48:56

一、实验目的与要求

(1)利用所学习的监督学习方法完成目标识别实验方案的设计。
(2)编程并利用相关软件完成实验测试,得到实验结果。
(3)通过对实验数据的分析﹑整理,方法的对比,得出实验结论,培养学生创新思维和编写实验报告的能力,以及处理一般工程设计技术问题的初步能力及实事求是的科学态度。
(4)利用实验更加直观﹑方便和易于操作的优势,提高学生学习兴趣,让学生自主发挥设计和实施实验,发挥出学生潜在的积极性和创造性。

二、实验内容

(1)采用已经学过的监督学习的方法,如逻辑回归、决策树、神经网络等实现分类任务。
(2)分析比较不同方法的优缺点。

三、实验设备与环境

Windows11系统、Anaconda3、Pycharm Community、Jupyter Notebook、Scikit-learn库

四、设计正文

(包括分析与设计思路、各模块流程图以及带注释的主要算法源码,若有改进或者创新,请描述清楚,并在实验结果分析中对比改进前后的结果并进行分析)

4.1 分析与设计思路

逻辑回归的基础是线性回归。线性模型试图学习一个通过属性的线性组合进行预测的函数,用向量形式写作 f ( x ⃗ ) = w T ⃗ x ⃗ + b f(\vec x)=\vec{w^T}\vec x+b f(x )=wT x +b,学习合适的 w T ⃗ \vec {w^T} wT b b b值,使得目标函数 J ( w ⃗ , b ) = ∑ i = 1 m f ( x ⃗ i − y i ) 2 J(\vec w,b)=\sum_{i=1}^mf(\vec x_i-y_i)^2 J(w ,b)=i=1mf(x iyi)2最小。可以使用线性回归或梯度下降法得到 w ⃗ \vec w w b b b值。
逻辑回归在线性回归的基础上,使用一个Sigmoid函数作为预测分类函数。Sigmoid函数公式为 ϕ ( z ) = 1 1 + e − z \phi(z)=\frac{1}{1+e^{-z}} ϕ(z)=1+ez1。将 f ( x ⃗ ) f(\vec x) f(x )代入 z z z,得到 h θ ( x ⃗ ) = 1 1 + e − f ( x ⃗ ) h_\theta (\vec x)=\frac{1}{1+e^{-f(\vec x)}} hθ(x )=1+ef(x )1,其中 h θ ( x ) h_{\theta}(x) hθ(x)表示函数概率值,即结果为1的概率。对于输入 x ⃗ \vec x x ,分类属于类别1和类别0的概率分别为 h θ ( x ) h_{\theta}(x) hθ(x) 1 − h θ ( x ) 1-h_{\theta}(x) 1hθ(x)。逻辑回归的损失函数采用对数损失函数。
L ( y ^ , y ) = − [ y log ⁡ 2 y ^ + ( 1 − y ) log ⁡ 2 ( 1 − y ^ ) ] L(\hat y,y)=-[y\log_2\hat y+(1-y)\log_2(1-\hat y)] L(y^,y)=[ylog2y^+(1y)log2(1y^)]
利用梯度下降的办法对参数 w T ⃗ \vec{w^T} wT b b b进行更新的公式如下:
w T ⃗ ← w T ⃗ − α [ 1 m ∑ i = 1 m ( f w ⃗ , b ( x ( i ) ) − y ( i ) ⃗ ) x j ( i ) ] b ← b − α [ 1 m ∑ i = 1 m ( f w ⃗ , b ( x ( i ) ) − y ( i ) ⃗ ) ] \vec {w^T}\leftarrow \vec{w^T}-\alpha[\frac 1m\sum_{i=1}^m(f_{\vec w,b}(\vec{x^{(i)})-y^{(i)}})x_j^{(i)}]\\ b\leftarrow b-\alpha[\frac 1m\sum_{i=1}^m(f_{\vec w,b}(\vec{x^{(i)})-y^{(i)}})] wT wT α[m1i=1m(fw ,b(x(i))y(i) )xj(i)]bbα[m1i=1m(fw ,b(x(i))y(i) )]

对逻辑回归的效果评估,一般采用AUC曲线下面积指标进行评价。
逻辑回归的流程图如图所示。
在这里插入图片描述
决策树把数据样本分配到叶子结点确定数据集中样本所属的分类。决策结点表示在样本的一个属性上进行的划分,叶结点表示经过分支到达的类。从根结点出发,每个决策结点进行一次划分,到达叶子结点得到最终的分类结果。
ID3算法在每个结点选取能获取最高信息增益的分支属性进行分裂。设样本集合 S S S的大小为 n n n,其分类属性有 m m m个不同取值,将样本集分为 C i ( i = 1 , 2 , . . . , n ) C_i(i=1,2,...,n) Ci(i=1,2,...,n),则信息熵计算公式为
E n t ( S ) = − ∑ i = 1 m p i log ⁡ 2 ( p i ) , p i = ∣ C i ∣ ∣ n ∣ Ent(S)=-\sum_{i=1}^mp_i\log_2(p_i),p_i=\frac{|C_i|}{|n|} Ent(S)=i=1mpilog2(pi),pi=nCi
得到了信息熵后,对于样本集 S S S,计算以属性 A A A为分支属性的信息增益 G a i n ( S , A ) Gain(S,A) Gain(S,A),其公式为
G a i n ( S , A ) = E n t ( S ) − ∑ i = 1 v ∣ S i ∣ ∣ S ∣ E n t ( S i ) Gain(S,A)=Ent(S)-\sum_{i=1}^v\frac{|S_i|}{|S|}Ent(S_i) Gain(S,A)=Ent(S)i=1vSSiEnt(Si)
不断重复以上分裂过程,直到满足以下几个条件之一时,停止分裂生长:样本中的所有数据属于同一标签、已达最大深度、结点中样本数小于某阈值、信息增益小于某阈值(防止过拟合)。
因此,决策树的整体流程如下图所示。
在这里插入图片描述
神经网络最基本的成分是神经元,神经元接受多个输入,并利用激活函数输出作为整个神经网络的输出或多层感知机中下一层网络的输入。
最简单的神经网络模型就是简单感知机,感知机是二分类模型。输入为特征向量 x ⃗ \vec x x ,输出为实例 y = g ( w ⃗ ⋅ x ⃗ + b ) y=g(\vec w\cdot \vec x+b) y=g(w x +b)。其中 g ( z ) g(z) g(z)为激励函数。Loss函数可以使用误分类点到超平面的距离,即 1 ∣ ∣ w ∣ ∣ ∣ w ⃗ ⋅ x ⃗ + b ∣ \frac{1}{||w||}|\vec w\cdot \vec x+b| ∣∣w∣∣1w x +b。对于误分类点 ( x i , y i ) (x_i,y_i) (xi,yi),有 − y i ( w ⋅ x i + b ) > 0 -y_i(w\cdot x_i+b)>0 yi(wxi+b)>0成立。所有误分类点到超平面总距离 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⃗ ⋅ x ⃗ i + b ) \frac{1}{||w||}\sum_{x_i\in M}y_i(\vec w\cdot \vec x_i+b) ∣∣w∣∣1xiMyi(w x i+b)。误分类点总数为 L ( w , b ) = − ∑ x i ∈ M y i ( w ⃗ ⋅ x ⃗ i + b ) L(w,b)=-\sum_{x_i\in M}y_i(\vec w\cdot \vec x_i+b) L(w,b)=xiMyi(w x i+b)
利用梯度下降法进行迭代
θ ′ = θ − η ∇ θ L ( θ ) , ∂ L ( θ ) ∂ w = − ∑ x i ∈ M y i x i , ∂ L ( θ ) ∂ b = − ∑ x i ∈ M y i \theta '=\theta-\eta\nabla _{\theta}L(\theta),\frac{\partial L(\theta)}{\partial w}=-\sum_{x_i\in M}y_ix_i,\frac{\partial L(\theta)}{\partial b}=-\sum_{x_i\in M}y_i θ=θηθL(θ),wL(θ)=xiMyixi,bL(θ)=xiMyi
所以对于误分类点,更新 w ⃗ \vec w w b b b w ⃗ ′ = w ⃗ + η y i x i , b ′ = b + η y i \vec w'=\vec w+\eta y_ix_i,b'=b+\eta y_i w =w +ηyixi,b=b+ηyi
整体流程如下图所示。在这里插入图片描述
在测试各类算法时,需要先读取数据集,将数据集分为训练集与测试集。训练模型,并用模型对测试集数据进行预测,将预测值与真实值比对,得到accuracy值。将预测结果与训练数据的切片绘散点图输出。

4.2 主要算法源码

逻辑回归算法代码如下:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_confusion_matrix
from mlxtend.plotting import plot_decision_regions
from sklearn import metrics
iris = load_iris()#加载数据集
x_train,x_test,y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3)#分割数据集
lr = LogisticRegression()#逻辑回归
lr.fit(x_train, y_train)#训练模型

y_pred = lr.predict(x_test)#用模型预测
print('The accuracy of the Logistic Regression is',metrics.accuracy_score(y_pred,y_test))
matrix = plot_confusion_matrix(lr, x_test, y_test,
                                 cmap=plt.cm.Blues,
                                 normalize='true')
plt.title('Confusion matrix for our classifier')
plt.show()#输出混淆矩阵
plt.figure(1, figsize=(8, 6))
#绘制散点图
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='r',marker='+',label='A型')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='g',marker='+',label='B型')
plt.scatter(x_train[y_train==2,0],x_train[y_train==2,1],color='b',marker='+',label='C型')

plt.scatter(x_test[y_pred==0,0],x_test[y_pred==0,1],color='r',label='A型')
plt.scatter(x_test[y_pred==1,0],x_test[y_pred==1,1],color='g',label='B型')
plt.scatter(x_test[y_pred==2,0],x_test[y_pred==2,1],color='b',label='C型')
plt.show()

决策树算法代码如下:

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn import tree      # 导入scikit-learn的tree模块
from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_confusion_matrix
import graphviz
from sklearn import metrics
iris = load_iris()#加载数据集
x_train,x_test,y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3)#分割数据集
model = tree.DecisionTreeClassifier(criterion='entropy',max_depth=3)#信息熵增益,最大深度为3
model.fit(x_train, y_train)#训练模型

y_pred = model.predict(x_test)#用模型预测
print('The accuracy of the Logistic Regression is',metrics.accuracy_score(y_pred,y_test))
matrix = plot_confusion_matrix(model, x_test, y_test,
                                 cmap=plt.cm.Blues,
                                 normalize='true')
plt.title('Confusion matrix for our classifier')
plt.show()#输出混淆矩阵
plt.figure(1, figsize=(8, 6))
#绘制散点图
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='r',marker='+',label='A型')
plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='g',marker='+',label='B型')
plt.scatter(x_train[y_train==2,0],x_train[y_train==2,1],color='b',marker='+',label='C型')

plt.scatter(x_test[y_pred==0,0],x_test[y_pred==0,1],color='r',label='A型')
plt.scatter(x_test[y_pred==1,0],x_test[y_pred==1,1],color='g',label='B型')
plt.scatter(x_test[y_pred==2,0],x_test[y_pred==2,1],color='b',label='C型')
plt.show()

#输出决策树
dot_data=tree.export_graphviz(model)
graph = graphviz.Source(dot_data)
graph.render("decisiontree")

神经网络算法代码如下:

from sklearn import datasets
from sklearn.datasets import load_iris
import tensorflow as tf
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
iris = load_iris()#加载数据集
x_train,x_test,y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)#分割数据集
w = tf.Variable(tf.random.truncated_normal([4,3],seed=1,stddev=0.1))#随机初始值
b = tf.Variable(tf.random.truncated_normal([  3],seed=1,stddev=0.1))#随机初始值
x_train = tf.cast(x_train,dtype=tf.float32)
x_test  = tf.cast(x_test ,dtype=tf.float32)
train=tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(32)#batch
test =tf.data.Dataset.from_tensor_slices((x_test, y_test )).batch(32)
epochs=200
alpha=0.2#学习率
history_error=[]#历史损失函数error
history_acc=[]#历史准确率
for _ in range(epochs):
    sumerror=0
    for(x,y) in train:
        with tf.GradientTape() as tape:
            forward_propagation=tf.matmul(x,w)+b#前向传播结果
            forward_propagation=tf.nn.softmax(forward_propagation)#激活前向传播结果
            label_onehot=tf.one_hot(y,depth=3,dtype=tf.float32)#将y转变为onehot编码
            error=tf.reduce_mean(tf.square(label_onehot-forward_propagation))#loss函数
            sumerror+=error.numpy()
        error_grad=tape.gradient(error,[w,b])
        w.assign(w-alpha*error_grad[0])#更新wb
        b.assign(b-alpha*error_grad[1])
    print("train set:epoch:%d error:%f"%(_,sumerror/4))
    truesum=0#总正确数
    testsum=0#测试总数
    for (x,y) in test:
        forward_propagation=tf.matmul(x,w)+b
        forward_propagation=tf.nn.softmax(forward_propagation)
        label=tf.cast(tf.argmax(forward_propagation,axis=1),dtype=y.dtype)
        isaccurate=tf.cast(tf.equal(label,y),dtype=tf.int32)#判断结果
        true=tf.reduce_sum(isaccurate)#正确数
        testsum+=x.shape[0]#测试总数
        truesum+=int(true)#总正确数
    print("test  set:epoch:%d error:%f accuracy:%f"%(_,sumerror/4,truesum/testsum))
    history_error.append(sumerror)
    history_acc.append(truesum/testsum)
plt.title("Loss")
plt.xlabel("Epoch")
plt.ylabel("loss")
plt.plot(history_error)
plt.show()

plt.title("Acc")
plt.xlabel("Epoch")
plt.ylabel("acc")
plt.plot(history_acc)
plt.show()

五、实验结果及分析

逻辑回归运行结果如下,训练集数据点用+号表示,测试集数据点用默认的圆表示。
在这里插入图片描述

其准确率为0.97,混淆矩阵如下。
在这里插入图片描述
决策树运行结果如下,训练集数据点用+号表示,测试集数据点用默认的圆表示。
在这里插入图片描述
其准确率为0.91,混淆矩阵如下。
在这里插入图片描述
可以对决策树进行可视化,可视化结果如下。决策树采用信息增益算法,最大深度为3。
在这里插入图片描述
神经网络是黑盒,但可以看到损失函数的曲线收敛的过程、准确性逐渐提升的过程如下。
在这里插入图片描述
在这里插入图片描述
逻辑回归算法的优点是训练速度较快,适合二分类问题,不需要缩放输入特征,可解释性好。缺点是对于非结构化的数据难以自动识别、提取特征。因为模型本身很简单,所以会造成欠拟合等问题,导致模型的准确率不高。
决策树算法的优点是可解释性强,可以很好地处理离散或连续的结构化数据,运行速度快。缺点是容易发生过拟合。
基础神经网络算法的优点是准确率高,可以自动学习各种特征的权重值。缺点是可解释性差,容易发生过拟合,且耗时长。

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

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

相关文章

【PyTorch深度学习实践】09_卷积神经网络基础

文章目录1.卷积操作1.1 卷积操作1.2 padding-填充1.3 stride-步长1.4 pooling-池化1.5 基础版CNN代码示例1.6 完整CNN代码示例1.卷积操作 卷积神经网络概览 1.1 卷积操作 输入通道数卷积核通道数,卷积核个数输出通道数 1.2 padding-填充 padding是为了让源图像最…

FPGA图像处理HLS实现三种图像缩放算法,线性插值、双线性插值、双三次插值,提供HLS工程和vivado工程源码

目录一、三种图像缩放算法介绍线性插值双线性插值双三次插值二、HLS实现线性插值图像缩放三、HLS实现双线性插值图像缩放四、HLS实现双三次插值图像缩放五、HLS在线仿真并导出IP六、其他FPGA型号HLS在线仿真并导出IP七、zynq7100开发板vivado工程八、上板调试验证九、福利&…

纪念QT可直接安装的离线版最后版本5.14.2

为什么说纪念呢?因为,这个版本之后再也没有可下载下来安装的版本了,因为我们以后再也没有这么方便了。为是很么说纪念呢?因为我们从QT还很柔弱的时候开始就是使用的离线版。 以前用c#来做组态,自定义控件开发起来也还…

基础知识一览2

这里写目录标题1.XML2.1 XML中的转义字符2.2 CDATA区2.3 如何去约束XMl:DTD2.3.1 xml文件内部引用DTD约束2.3.2 xml文件引用外部DTD约束2.3.3 xml文件引用公共DTD约束1.XML xml的文件后缀名是.xmlxml有且只有一个根标签xml的标签是尖括号包裹关键字成对出现的,有开…

如何做好banner设计(banner设计要点包括哪些)

网页设计的Banner作为表达网站价值或者传达广告信息的视觉主体,一直在根据网络环境的变化而变化着,从表现形式到尺寸大小,再到创意的多元化,因此更需要我们网页设计师们对其设计创意进行丰富和完善,才能真正达到宣传的…

Elasticsearch入门——Elasticsearch7.8.0版本和Kibana7.8.0版本的下载、安装(win10环境)

目录一、Elasticsearch7.8.0版本下载、安装1.1、官网下载地址1.2、下载步骤1.3、安装步骤(需要jdk11及以上版本支持)1.4、启动后,控制台中文乱码问题解决二、Node下载、安装(安装Kibana之前需要先安装Node)2.1、Node官网下载地址2.2、Node下载…

Linux文字处理和文件编辑(三)

1、Linux里的配置文件: /etc/bashrc文件:该配置文件在root用户下,权限很高。~/.bashrc文件:只有当前用户登录时才会执行该配置文件。每次打开终端,都会自动执行配置文件里的代码。比如,alias md‘mkdir’就…

《2022年终总结》

2022年终总结 笔者成为社畜的一年,整整打了一年工! 之前都说每年都有点变化,今年的变化可能就是更加懒散了,玩了更多的手机 就是运动的坚持更加多了,收入也增加了,哈哈! 其实今年的变化不大&am…

41. 【农产品溯源项目前后端Demo】后端目录结构

本节介绍下后端代码的目录结构。 1. 实现用户管理、菜单管理、角色管理、代码自动生成等服务,归结为系统管理,是若依框架提供的能力。 2. ruoyi-traces实现农产品溯源应用的代码,如果要引入其他Java包,修改本模块的pom.xml文件。 1)config包加载配置文件数据,配置文件路…

FPGA:IIC验证镁光EEPROM仿真模型(纯Verilog)

目录日常唠嗑一、程序设计二、镁光模型仿真验证三、testbench文件四、完整工程下载日常唠嗑 IIC协议这里就不赘述了,网上很多,这里推荐两个,可以看看【接口时序】6、IIC总线的原理与Verilog实现 ,还有IIC协议原理以及主机、从机Ve…

基于SpringBoot的车牌识别系统(附项目地址)

yx-image-recognition: 基于spring boot maven opencv 实现的图像深度学习Demo项目,包含车牌识别、人脸识别、证件识别等功能,贯穿样本处理、模型训练、图像处理、对象检测、对象识别等技术点 介绍 spring boot maven 实现的车牌识别及训练系统 基于…

3-1存储系统-存储器概述主存储器

文章目录一.存储器概述(一)存储器分类1.按在计算机中的作用(层次)分类2.按存储介质分类3.按存取方式分类4.按信息的可保存性分类(二)存储器的性能指标二.主存储器(一)基本组成1.译码…

6 个必知必会高效 Python 编程技巧

编写更好的Python 代码需要遵循Python 社区制定的最佳实践和指南。遵守这些标准可以使您的代码更具可读性、可维护性和效率。 本文将展示一些技巧,帮助您编写更好的 Python 代码 文章目录遵循 PEP 8 风格指南1.遵守 PEP 8 命名约定2. 使用描述性的和有意义的变量名…

读书笔记--- ggplot2:数据分析与图形艺术

最近看了这本书《ggplot2:数据分析与图形艺术》(第2版),实际上网页在线版本已经更新到第3版了(https://ggplot2-book.org/)。 这本书页数不多,但是整体还是值得阅读,不愧是Hadley W…

【Proteus仿真】【STM32单片机】酒精浓度检测系统设计

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、按键模块、LED和蜂鸣器、MQ-3酒精传感器模块等。 主要功能: 系统运行后,LCD1602显示酒精浓度值和阈值&…

插入排序.

根据找插入位置的方法分为: ①、顺序法定位插入位置——直接插入排序 ②、二分法定位插入位置——二分插入排序 ③、缩小增量多遍插入排序——希尔排序 一、直接插入排序(以升序为例) 先背模板! void insert_sort(int *a,int le…

远程服务器(恒源云)上使用NNI进行训练调参的详细流程

远程服务器(恒源云)上使用NNI进行训练调参的详细流程 一、环境配置 pip下载安装nni,(可使用豆瓣源,可快速下载,在安装命令后加 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com&#x…

VUE|后台管理项目——动态路由权限管理

公共数据复用1.1 为什么要公共数据复用?因为我们只有把导航和路由的数据公共的提出来,我们才能告知后端人员需要返回什么数据。1.2 怎么数据复用呢?首先,我们可以在utils文件夹里新建一个navDate.js的文件:把我们需要的…

go入门知识

step1:去https://go.dev下载golang step2:下载jetbrains的Goland编译器(安装的过程会自动帮你配置好环境变量) 一个最简单的go程序 package mainimport ("fmt" )func main() {fmt.Printf("Hello World")}1.定义变量: …