1.1.1 实验内容
构建一个二分类问题:逻辑与(AND)的一般问题。
生成数据:正样本样本服从高斯分布,均值为[1,1],协方差矩阵为单位矩阵;负样本服从三个高斯分布的混合高斯分布,这三个高斯分布的均值分别为[0,0], [0,1], [1,0],每个高斯分布的协方差矩阵均为(sigma*单位矩阵)。
学习:设 sigma=0.01,请依上面的分布生成正负样本各 300 个,运用 perceptron learning algorithm 从数据中学习出一个 perceptron,实现对正负样本的二分类。
实验与讨论:请通过编程实验,讨论如下问题:
学习算法的收敛性与哪些因素存在怎样的关系?
讨论当 sigma 取值不断变大(如取值从 0.01-1)情况下,学习算法的收敛性问题,由此可以得出怎样的结论?
1.1.2 实验步骤
利用 numpy 方法生成二维高斯分布:

构建感知机类:
要点:
使用 bias,否则只有无法得出结果
output 使用符号函数
利用损失函数使得训练可以在适当时候停止

构建训练集、测试集并进行训练,并最后评估测试结果:

1.1.3 实验结果
Sigma=0.01 时
样本:

结果:

Sigma=0.1:

Sigma=0.99

结论:
训练结果和权重初始化、bias 初始化、感知机结构、训练次数、训练终止方式、学习率等有关系。
Sigma 变大,算法收敛性减小,说明学习效果与样本分布有很大关系。当样本无法划分时,学习效果很差。
1.1.4 实验感想
学习到了具体的感知器设计,对于包的使用更加熟悉。
1.2 C3-1
1.2.1 实验内容
生成 500 个数据点(x, y), y = x + n, n 为均值为 0 标准差为 delta 的正态分布。请使用线性回归算法从输入 x 估计 y。
对于 x = y + n 进行同上述操作,但是依旧从 x 估计 y。
对于上述题目的回归曲线进行比较。
1.2.2 实验步骤
构建数据:


采用最简单的 1-1 网络:

训练:
结果显示:

1.2.3 实验结果
参数和 MSE:

回归曲线:
第一个:

第二个:

结论:
可能题意理解错误,未看出差别
1.2.4 实验感想
可能本题题意理解有错误,或者使用了 pytorch 结果过好。
1.3 C4-1
1.3.1 实验内容
写一个带有 bias 的基础的 3-3-1 网络反向传播程序,来解决三比特奇偶校验问题。偶数个 1bit 返回 +1,反之返回-1。展示输入-隐层的参数并且分析每个隐层神经元的函数。
1.3.2 实验步骤
自己写的 BP,使用 softmax 分类,也可以使用 sigmoid 求值:
初始化
前向传播:

反向传播:

功能函数:

Pytorch 版本:
定义 MLP,forward 最后不进行 softmax 因为 torch 的交叉熵自带

训练:
二分类:

直接求值:

1.3.3 实验结果

与预估相同
参数如下:
二分类:

Sigmoid:

对于两个输入求异或,之后对于结果和另一个输入求异或
参考:
1.3.4 实验感想
深入学习了 BP 算法。对于奇偶校验有了更多认识。
1.4 C4-2
1.4.1 实验内容
训练神经网络,计算森林火灾面积
1.4.2 实验步骤
数据读取和预处理:
使用了 8 个属性

神经网络构造:
使用了 dropout 防止过拟合

训练与验证结果:

1.4.3 实验结果

没有花费很多时间优化参数,所以结果可能较差。
1.4.4 实验感想
本次没有很多时间优化,因此结果可能较差。感觉数据量过少,线性回归效果可能不好。
1.5 C4-3
1.5.1 实验内容
Mnist
1.5.2 实验步骤
定义模型,未使用 CNN:

预处理:

训练与测试:

1.5.3 实验结果

准确率达 97.21%
1.5.4 实验感想
因为无法使用 GPU 所以未使用 CNN,Mnist 的解决方法已经相当成熟,即使不用 CNN 也能达到很好结果。
1.6 C5-1
1.6.1 实验内容
构建一个类别不平衡的二分类问题。
生成数据:正样本样本服从高斯分布,均值为[2,3],协方差矩阵为单位矩阵;负样本服从高斯分布,均值为[5,6],协方差矩阵为单位矩阵。
学习:请依上面的分布生成正样本 200 个,负样本 800 个,将其划分为包含 60% 样本的训练集、20% 样本的验证集和 20% 样本的测试集,通过分别构建两个不同的 MLP 模型实现对正负样本的二分类。其中第一个 MLP 模型含有一个隐层,第二个 MLP 模型含有两个隐层。
实验与讨论:请通过编程实验,讨论如下问题:a. 若要求 MLP 模型对于正例样本的预测有更高的查准率和查全率,请考虑在模型选择中采用哪种性能衡量指标;b.通过绘制学习曲线,分析模型的偏差与方差;c.通过绘制 ROC 曲线,比较两个 MLP 模型。
1.6.2 实验步骤
MLP_1 一个隐层

MLP_2 两个隐层

初始化:

交叉验证得到学习曲线:

得到性能指标:

1.6.3 实验结果
使用交叉熵作为损失函数
MLP_1 的学习曲线,每次增加 50 个训练样本:

MLP_2 的学习曲线:

可以看到二者的偏差都较小,但是第二个模型的方差更大,说明出现过拟合
MLP_1 训练时的 loss:

MLP_1 验证集/测试集上的性能指标:

MLP_2 的 loss:

MLP_2 验证集/测试集上的性能指标:

要求对于正率更高准确率和查全率,应该考虑正例的 f1 性能指标。
ROC 曲线:

AUC:
可以看到,二者结果十分相似,其中 mlp_2 在正例上可能过拟合更严重一些,但是总的结果更好。
1.6.4 实验感想
实际上使用了交叉验证绘制学习曲线,对于验证集并没有过多使用。
1.7 C6-1
1.7.1 实验内容
对于 Fisheriris 数据集
使用一对多 SVM 针对四个输入数据二分类进行三分类;
使用 KNN 分类;
使用 MLP 二分类并最后组合;
1.7.2 实验过程
数据预处理:

SVM:
将 0, 1, 2 数据作为正例,其他作为反例,其他两个亦同下图

训练三个分类器,并进行组合


评估结果,分别是自己的一对多和 sklearn 的一对多
KNN:
自己完成的 KNN:

Sklearn 的 KNN:

MLP:
实际上过程类似 SVM
网络:



1.7.3 实验结果
SVM 自己完成的一对多
-1 为无法分类的数据,无法很好的处理

Sklearn 的一对多
效果非常好

KNN:
分别是自己完成的 knn 和 sklearn 的 knn


MLP 结果:
效果很好

1.7.4 实验感想
使用了多个分类方式,对于分类器有了更多理解。
1.8 C6-2
1.8.1 实验内容
在西瓜数据集 3.0α上分别用线性核和高斯核训练 SVM,并比较其支持向量的差别。
1.8.2 实验步骤
数据预处理,不使用 test,因为数据量过少:

线性核和高斯核:

1.8.3 实验结果
可见,高斯核好于线性核


支持向量均为 17x2 向量
线性核支持向量:

高斯核支持向量:

1.8.4 实验感想
对于 SVM 还是不够了解,第一个实际使用了 LinearSVM,和 SVM 有一些不同。
1.9 C7-1
1.9.1 实验内容
试编程实现 K-means 算法,设置三组不同的 k 值、三组不同的初始中心点,在西瓜数据集 4.0 上进行实验比较,并讨论什么样的初始中心有利于取得好结果。
1.9.2 实验步骤
构建自己的 KMeans 类:
初始化:
利用参数选择质心初始化方式
聚类的过程:

判断聚类结果是否已经不变:
四个选择质心的方法,分别为随机选择,将数据排序后均匀选择,选择最好质心和 KMeans++:



欧氏距离计算:
数据预处理:

随后分别求 k=2,3,4 时的随机选择结果:

以及 k=3 时的均匀选择和最好结果:

K=3 时 KMeans++:

使用 Sklearn 的 Kmeans++ 选择质心:

1.9.3 实验结果:
以下分别为 k=2,3,4 时,质心随机选择的聚类图像以及评估距离,质心为红色:




以下为 k=3,均匀选择质心结果:


以下为 k=3 的最好质心:


KMeans++ 的结果:

Sklearn 的算法结果:

可以看到,KMeans++ 可以得到非常优秀的质心选择结果
1.9.4 实验感想
自己实现了多种 KMeans,很有成就感
1.10 C8-1
1.10.1 实验内容
请通过对 Iris data 的可视化,比较 PCA、LDA 和 ICA 的可视化效果。
1.10.2 实验步骤
自己实现了 PCA,其他调包
数据预处理:

PCA:
LDA:

ICA:

1.10.3 实验结果
原数据雷达图:

PCA 散点图:
雷达图:

LDA 散点图:
雷达图:

ICA 散点图:

雷达图:

结论:
比较效果其实相近。
1.10.4 实验感想
学习了可视化方法,对于可视化工具有了新的认识。
完整代码:https://download.youkuaiyun.com/download/pythonyanyan/87390267