---
title: 机器学习实验
date: 2023-03-29 21:10:02
tags: 学习
categories: 机器学习
---
github渲染属实离谱,有些公式需要大概,可以直接参考我博客(github.io的那个仓库下有博客地址
# 机器学习实验
## 贝叶斯分类器在鸢尾花数据集的实现
最简单的,我们选用朴素贝叶斯分类来实现。这部分原理与公式我在课程笔记中有提到。
[笔记地址](https://www.zwn-blog.xyz/2023/03/01/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/#%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%88%86%E7%B1%BB%E5%99%A8)
### 知识回顾
#### 基本知识:贝叶斯定理
首先,贝叶斯定理:
$$P(c\ |\ \mathbf{x}) = \frac{P(\mathbf{x}\ |\ c) P(c)}{P(\mathbf{x})}$$
在贝叶斯定理中,每个概率都有约定俗成的名称:
- $P(c\ |\ \mathbf{x})$ 是类标记 $c$ 相对于样本 $\mathbf{x}$ 的条件概率,也由于得自 $\mathbf{x}$ 的取值而被称作 $c$ 的后验概率。
- $P(\mathbf{x}\ |\ c)$ 是样本 $\mathbf{x}$ 相对于类标记 $c$ 的**类条件概率(class-conditional probability)**,或称为**似然(likelihood)**,也由于得自 $c$ 的取值而被称作 $\mathbf{x}$ 的**后验概率**。
- $P(c)$ 是 $c$ 的先验概率(也称为边缘概率),之所以称为"先验"是因为它不考虑任何 $\mathbf{x}$ 方面的因素。在这里又称为**类先验(prior)概率**。
- $P(\mathbf{x})$ 是 $\mathbf{x}$ 的先验概率。在这里是用作归一化的**证据(evidence)因子**,与类标记无关。
有了贝叶斯定理,如何估计后验概率 $P(c\ |\ \mathbf{x})$ 的问题就转化为如何计算类先验概率 $P(c)$ 和类条件概率 $P(\mathbf{x}\ |\ c)$了。
类先验概率 $P(c)$ 表示的是**样本空间中各类样本的比例**,根据大数定律,**当训练集包含足够多的独立同分布样本**时,类先验概率可以直接通过**训练集中各类样本出现的频率**进行估计。
类条件概率 $P(\mathbf{x}\ |\ c)$ 的情况就复杂多了,它涉及到类 $c$ 中**样本 $\mathbf{x}$ 所有属性的联合概率**,假设每个样本有 $d$ 个二值属性,那么可能的取值组合就多达 $2^d$ 个,这个数目可能**远多于训练集的规模**,也就意味着很多样本的取值没有在训练集中出现,所以**直接用训练集出现的频率进行估计是不可行的**。必须注意**未被观测到**和**出现概率为0**的区别。
同时,在笔记中我也提到,上述讨论中,均假设属性是离散型,对于连续型属性,只需把概率质量函数 $P(\cdot)$ 换为概率密度函数 $p(\cdot)$ 就可以了。这是非常关键的一点。
> 注:改为连续型后,类标记 $c$ 改用 $y_i$ 表示,以表示其连续性,不影响表述。
#### 朴素贝叶斯分类器
我们前面提到了,估计后验概率 $P(y_j\ |\ \mathbf{x})$ 最大的一个难处是:类条件概率 $P(\mathbf{x}\ |\ y_j)$ 是所有属性上的联合概率,而多个属性的不同属性值组合并不一定全部囊括在训练集内,所以很难通过训练集估计。
为了避免这个障碍,**朴素贝叶斯分类器**采用**属性条件独立性假设(attribute conditional independence assumption)**。也就是说,假设**所有属性相互独立,单独地对分类结果产生影响**。
基于这个假设,可以把类条件概率写成连乘的形式,因此贝叶斯定理可重写为:
$$P(y_j\ |\ \mathbf{x}) = \frac{P(\mathbf{x}\ |\ y_j) \times P(y_j)}{P(\mathbf{x})} = \frac{P(y_j)}{P(\mathbf{x})} \prod_{i=1}^{d} P(x_i\ |\ y_j)\tag{1}$$
其中 $d$ 为属性数目, $x_i$ 为样本 $\mathbf{x}$ 在第 $i$ 个属性上的取值。
又因为 $P(\mathbf{x})$ 与类别无关,所以**朴素贝叶斯分类器的表达式**可以写为:
$$h(\mathbf{x}) = \arg \max_{c \in \mathcal{Y}} P(y_j) \prod_{i=1}^{d} P(x_i\ |\ y_j)$$
也即:
$$P(y_j\ |\ \mathbf{x}) = \dfrac{h(\mathbf x)}{P(\mathbf x)}$$
我们通常假定连续型属性服从高斯分布,则:
$$p(x_i\ |\ y_i) \sim \mathcal{N}(\mu_{y_i,i},\sigma_{y_i,i}^2)$$
即:
$$P(x_i|y_j)=\frac{1}{\sqrt{2\pi}\sigma_{ij}}e^-\frac{(x_i-\mu_{ij})^2}{2\sigma_{ij}^2}\tag{2}$$
这样一来整体的思路也就明晰了
### 代码实现
```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import math
global label, dataColumns
class NB:
def __init__(self):
self.sigma = None
self.mu = None
self.y_unique = None
self.y = None
self.x = None
def fit(self, x1, y1):
self.x = x1
self.y = y1
# 去除y中重复的元素,并按元素由大到小返回一个新的无元素重复的元组或者列表
self.y_unique = np.unique(y1)
self.mu = np.zeros((len(self.y_unique), dataColumns), dtype=float)
self.sigma = np.zeros((len(self.y_unique), dataColumns), dtype=float)
def ge_mu_and_sigma(self):
sum_mu = np.zeros((len(self.y_unique), dataColumns), dtype=float)
sum_sigma = np.zeros((len(self.y_unique), dataColumns), dtype=float)
for j in range(len(self.y_unique)):
num_y = np.sum(self.y == self.y_unique[j])
for i in range(len(self.x)):
if self.y[i] == self.y_unique[j]:
sum_mu[j][0] += self.x[i][0]
sum_mu[j][1] += self.x[i][1]
sum_mu[j][2] += self.x[i][2]
sum_mu[j][3] += self.x[i][3]
for k in range(4):
self.mu[j][k] = sum_mu[j][k] / num_y
for i in range(len(self.x)):
if self.y[i] == self.y_unique[j]:
sum_sigma[j][0] += (self.x[i][0] - self.mu[j][0]) * (self.x[i][0] - self.mu[j][0])
sum_sigma[j][1] += (self.x[i][1] - self.mu[j][1]) * (self.x[i][1] - self.mu[j][1])
sum_sigma[j][2] += (self.x[i][2] - self.mu[j][2]) * (self.x[i][2] - self.mu[j][2])
sum_sigma[j][3] += (self.x[i][3] - self.mu[j][3]) * (self.x[i][3] - self.mu[j][3])
for k in range(4):
self.sigma[j][k] = math.sqrt(sum_sigma[j][k] / num_y)
def predict(self, x_test1):
global label
# labels存储每个测试数据的预测值
mlabels = []
# 对每个测试数据进行操作求maxP(x|yj)P(yj)
for m in range(len(x_test1)):
max_value = 0
# p(x|yj)即p(X|0),p(X|1),p(X|2)
for i in range(len(self.y_unique)):
# 存储yj时的p(xi|yj)
values1 = []
# 训练集中Y=yj的数量
fenmu = np.sum(self.y == self.y_unique[i])
# 求p(xi|yj)
for j in range(len(x_test1[m])):
value = np.exp(-(x_test1[m][j] - self.mu[i][j]) ** 2 / (2 * self.sigma[i][j] ** 2)) / (
math.sqrt(2 * math.pi) * self.sigma[i][j])
values1.append(value)
value = 1
# p(x1|yj)*p(x2|yj)*......
for v in values1:
value = value * v
# p(x1|yj)*p(x2|yj)*......*p(yj)
value = value * (fenmu / len(self.y))
if value >= max_value:
max_value = value
label = self.y_unique[i]
mlabels.append(label)
return mlabels
if __name__ == '__main__':
dataColumns = 4
iris = load_iris()
x = iris.data
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
NB = NB()
NB.fit(x_train, y_train)
NB.ge_mu_and_sigma()
labels = NB.predict(x_test)
print("测试集准确率:", np.sum(labels == y_test) / len(labels))
```
#### 代码思路简析
这段代码实现了一个朴素贝叶斯分类器。简单总结一下几个函数的作用:
1. `fit`: 训练模型,计�
没有合适的资源?快使用搜索试试~ 我知道了~
山东大学机器学习(软工限选)实验.zip
共22个文件
png:9个
xml:5个
py:4个
需积分: 5 2 下载量 146 浏览量
2024-04-16
22:53:00
上传
评论
收藏 943KB ZIP 举报
温馨提示
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
资源推荐
资源详情
资源评论
收起资源包目录
山东大学机器学习(软工限选)实验.zip (22个子文件)
content
NB.py 1KB
.idea
MLlab.iml 352B
vcs.xml 180B
misc.xml 193B
inspectionProfiles
Project_Default.xml 1KB
profiles_settings.xml 174B
modules.xml 262B
.gitignore 176B
KNN.py 3KB
SVM.py 5KB
DecisionTree.py 7KB
iris.csv 2KB
README.md 57KB
机器学习实验
9.png 87KB
3.png 179KB
1.png 130KB
6.png 21KB
5.png 101KB
4.png 206KB
8.png 28KB
7.png 25KB
2.png 201KB
共 22 条
- 1
资源评论
生瓜蛋子
- 粉丝: 3798
- 资源: 4426
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功