机器学习使用python实现一个二分类问题:逻辑与(AND)的一般问题

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.csdn.net/download/pythonyanyan/87390267

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
作业一(Matlab) 假设x=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20),y=( 2.94, 4.53, 5.96, 7.88, 9.02, 10.94, 12.14, 13.96, 14.74, 16.68, 17.79, 19.67, 21.20, 22.07, 23.75, 25.22, 27.17, 28.84, 29.84, 31.78).请写出拟合的直线方程,并画图(包括原数据点及拟合的直线),请打印出来。 请使用线性回归模型来拟合bodyfat数据。数据集介绍可阅读:https://www.mathworks.com/help/nnet/examples/body-fat-estimation.html 在matlab中,在命令行中输入[X,Y] = bodyfat_dataset; 即可获得一个拥有13个属性,252个样本的数据集。使用前200个样本来获得模型,并写出你所获得的模型。使用后52个样本做测试,汇报你所获得的泛化误差。 编程实现对数回归,并给出教材89页上的西瓜数据集3.0上的结果。要求采用4折交叉验证法来评估结果。因为此处一共17个样本,你可以去掉最后一个样本,也可以用所有数据,然后测试用5个样本。在汇报结果时,请说明你的选择。请在二维图上画出你的结果(用两种不同颜色或者形状来标注类别),同时打印出完整的代码。 作业二 采用信息增益准则,基于表4.2中编号为1、2、3、6、7、9、10、14、15、16、17的11个样本的色泽、根蒂、敲声、文理属性构建决策树。(本次作业可以用笔算,鼓励编程实现,但都需要列出主要步骤,其中log2(3)=1.585,log2(5)=2.322,log2(6)=2.585,log2(7)=2.807,log2(9)=3.17,log2(10)=3.322,log2(11)=3.459) 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对上题的训练数据采用预剪枝策略构建决策树,并汇报验证集精度。 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对题1所构建的决策树进行后剪枝,并汇报验证集精度。 作业三(Matlab) 试编程实现累积BP算法,在西瓜数据集2.0上(用训练数据)训练一个单隐层网络,用验证集计算出均方误差。要自己实现,不能直接调用现成的库函数。 作业四 下载并安装libsvm,http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ,在西瓜数据集3.0a上分别用线性核训练一个SVM。用正类1-6和负类9-14作为训练集,其余作为测试集。C取不同的值,其它参数设为默认值。作出测试正确率随C取值变化的图,C=[1 100 10000 10^6 10^8]。 换成高斯核(宽度设为1),重复上题的步骤。 作业五 以西瓜数据集2.0(见教材76页表4.1)中样本1--16为训练集训练一个朴素贝叶斯分类器,对测试样本17进行分类。请写出详细的计算过程。 假设x_k是一个班上学生的分数,对应的分数及其分布是 x_1=30, P1=0.5,一共有14个学生; x_2=18, P2=mu,有6个学生; x_3=20, P3=2mu,有9个学生; x_4=23, P4=0.5-3mu,有10个学生; 通过最大对数似然法求出mu的值。 作业六(Python) 1 使用PCA对Yale人脸数据集进行降维,并分别观察前20、前100个特征向量所对应的图像。请随机选取3张照片来对比效果。数据集http://vision.ucsd.edu/content/yale-face-database
很抱歉,垃圾邮件分类问题不涉及回归问题。垃圾邮件分类问题一个二分类问题,需要使用分类算法进行解决。以下是一个基于Python的垃圾邮件分类机器学习项目示例: ## 项目概述 该项目旨在使用Python机器学习算法来构建一个垃圾邮件分类器。该分类器可以将输入的电子邮件标记为垃圾邮件或非垃圾邮件。我们将使用Kaggle上的Spam or Ham数据集来训练和测试我们的分类器。 ## 数据集 Spam or Ham数据集包含5,572封电子邮件,其中包括垃圾邮件和非垃圾邮件。该数据集可以从以下链接下载:https://www.kaggle.com/venky73/spam-mails-dataset ## 项目步骤 ### 步骤1:加载数据集 我们将使用Pandas库来加载Spam or Ham数据集。以下是加载数据集的代码: ``` import pandas as pd # Load the dataset data = pd.read_csv('spam_or_ham.csv') ``` ### 步骤2:数据清洗 在数据清洗步骤中,我们将对数据进行预处理和清洗。以下是数据清洗的代码: ``` import re import nltk nltk.download('stopwords') from nltk.corpus import stopwords from nltk.stem.porter import PorterStemmer # Clean the text corpus = [] for i in range(0, len(data)): review = re.sub('[^a-zA-Z]', ' ', data['text'][i]) review = review.lower() review = review.split() ps = PorterStemmer() review = [ps.stem(word) for word in review if not word in set(stopwords.words('english'))] review = ' '.join(review) corpus.append(review) ``` 在上述代码中,我们使用了正则表达式来过滤掉除英文字母以外的所有字符。我们还将所有字母转换为小写,并使用Porter词干提取器来提取单词的基本形式。最后,我们还使用NLTK库中的停用词列表来过滤停用词。 ### 步骤3:创建文本向量 在这一步骤中,我们将使用CountVectorizer来创建文本向量。以下是创建文本向量的代码: ``` from sklearn.feature_extraction.text import CountVectorizer # Create the bag of words model cv = CountVectorizer(max_features = 5000) X = cv.fit_transform(corpus).toarray() y = data.iloc[:, 0].values ``` 在上述代码中,我们使用了CountVectorizer来将文本转换为向量。我们还使用了5000个特征来创建向量。 ### 步骤4:拆分数据集 在这一步骤中,我们将数据集分成训练集和测试集。以下是拆分数据集的代码: ``` from sklearn.model_selection import train_test_split # Split the dataset into the Training set and Test set X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0) ``` 在上述代码中,我们使用train_test_split函数将数据集拆分为训练集和测试集。 ### 步骤5:训练模型 在这一步骤中,我们将使用逻辑回归算法来训练模型。以下是训练模型的代码: ``` from sklearn.linear_model import LogisticRegression # Train the model classifier = LogisticRegression(random_state = 0) classifier.fit(X_train, y_train) ``` 在上述代码中,我们使用逻辑回归算法来训练模型。 ### 步骤6:评估模型 在这一步骤中,我们将评估模型的性能。以下是评估模型的代码: ``` from sklearn.metrics import confusion_matrix, accuracy_score # Predict the Test set results y_pred = classifier.predict(X_test) # Evaluate the model cm = confusion_matrix(y_test, y_pred) print(cm) print('Accuracy: {:.2f}%'.format(accuracy_score(y_test, y_pred) * 100)) ``` 在上述代码中,我们使用混淆矩阵和准确率来评估模型的性能。 ## 总结 以上就是一个基于Python的垃圾邮件分类机器学习项目示例,该项目使用了Spam or Ham数据集来训练和测试分类器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员奇奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值