phython 贝叶斯分类

本文介绍了如何在Python中运用贝叶斯分类方法,通过真实葡萄酒数据集进行实践。内容涉及训练集和测试集的划分,以及对角协方差和全协方差模型的性能比较。通过对数据的预处理,将数据划分为训练集和测试集,使用多元高斯分布建模,并评估分类器的性能。文章最后讨论了全协方差模型作为统计模型的改进。
摘要由CSDN通过智能技术生成

phython 贝叶斯分类

获得贝叶斯分类的实践经验;
了解如何使用单独的训练集和测试集评估分类器;
比较“对角协方差”和“全协方差”多元高斯模型的性能。

您将使用的数据是对在意大利同一地区种植但由三种不同葡萄品种生产的葡萄酒进行化学分析的真实结果。分析确定了13种化学成分的数量。这项任务是利用化学分析的结果来确定这三种葡萄中的哪一种被用来生产一瓶未标记的葡萄酒。

数据将形成一个包含178行14列的矩阵。每一排都是一个单独的样品(即,一瓶不同的葡萄酒)。第一列存储代表葡萄品种的类别标签(1、2或3)。第2列至第14列是13次化学分析的结果。请注意,要素存储为列,样本存储为行。
我们将首先使用在前面的实验类中看到的nump loadtxt函数将数据加载到numpy数组中。

import numpy as np
X = np.loadtxt(open("data/wines.txt", "r"), delimiter=',')
X.shape

import matplotlib.pyplot as plt
%matplotlib inline

使用分类器包括两个阶段。首先,使用已知正确类标签的样本对分类器进行训练。训练是估计分类器参数的过程,例如,每类数据的平均值和方差, ω i \omega_i ωi,以及类先验值, P ( ω i ) P(\omega_i) Pωi。一旦分类器经过训练,我们就可以使用它来标记未知数据。然而,一般来说,在使用分类器之前,我们首先要评估它,即测试它。
为了测试分类器,我们将使用训练期间未看到的数据样本,但我们知道正确的标签。我们将对每个测试样本进行分类,并将分类器的输出与已知正确标签进行比较。然后我们测量正确分类的数据百分比,希望尽可能接近100%。我们可能还希望查看分类错误的样本,以查看是否存在任何错误模式。

出于稍后将在模块中变得更清楚的原因,非常重要的是,用于测试分类器的数据与用于训练分类器的数据不同。因此,我们通常首先将数据划分为单独的(非重叠的)训练集和测试集。

我们将首先分离出三个类中每个类的样本来准备数据,然后我们将在训练集和测试集之间平均划分每个类的数据。
为了找到属于类1的样本,我们需要选择矩阵中第一列包含1的行。如果数据存储在numpy二维数组“X”中,我们可以按如下方式选择这些行
X[X[:,0]==1,:]
使用这个想法将数据分成三个numpy二维数组,我们称之为‘wines1’、‘wines2’和‘wines3’。
我们希望将’wines1’、'wines2’和’wines3’分成相等的培训和测试分区。最简单的方法是将奇数行放入训练集中,将偶数行放入测试集中。可以使用语法0::2选择数组“X”的奇数行,该语法以2的步骤从0迭代到矩阵的最后一个索引,即
X[0::2,:]
对于偶数行,它将是
X[1::2,:]
利用这个想法制作矩阵,称为“wines1\u train”、“wines1\u test”、“wines2\u train”等。
最后,通过将三个测试数据矩阵叠加在一起,将每个类的测试数据重新组合成一个测试数据矩阵
这可以使用numpy的’vstack’函数完成

wines1=X[X[:,0]==1,:]
wines2=X[X[:,0]==2,:]
wines3=X[X[:,0]==3,:]
wines1_train=X[0::2, :]
wines2_train=X[0::2, :]
wines3_train=X[0::2, :]
wines1_test=X[1::2, :]
wines2_test=X[1::2, :]
wines3_test=X[1::2, :]
wines_test= np.vstack((wines1_test, wines2_test, wines3_test))
wines1.shape


mean1 = np.mean(wines1_train[:, 1:], axis=0)
mean2 = np.mean(wines2_train[:, 1:], axis=0)
mean3 = np.mean(wines3_train[:, 1:], axis=0)
var1 = np.var(wines1_train[:, 1:], axis=0)
var2 = np.var(wines2_train[:, 1:], axis=0)
var3 = np.var(wines3_train[:, 1:], axis=0)

Numpy轴是迭代开始的一种方向。numpy中的每个操作都有一个特定的迭代过程,操作将通过该过程进行。此外,有两种类型的迭代过程:列顺序和Fortran顺序。列顺序通过列轴提供帮助,Fortran顺序通过行轴提供帮助。

训练分类器

我们将使用多元高斯分布来表示三类中每一类的分布, p ( x ∣ ω ) p(x |\omega) pxωfor ω \omega ω等于1、2或3。所以我们需要估计每一类的平均向量和协方差矩阵。在第一种情况下,我们假设特征是不相关的。这意味着高斯协方差矩阵在对角线之外的所有元素都有0。这无疑是一个糟糕的假设,但这意味着我们的13×13协方差矩阵只包含13个需要估计的方差,而不是91个参数(为什么91不是13x13?)。注意,对角协方差矩阵使得概率评估计算非常快速,并且经常用于分类系统中,即使它们不能精确地建模数据,它们也可以很好地工作。
我们可以使用numpy的“均值”函数估计每个类的13个元素的平均向量。注意,您应该只使用第2列到第14列–请记住,第1列存储类标签。
(如果您忘记了如何使用’np.mean’计算矩阵中每列的平均值,请参阅上一个笔记。)
将结果存储在名为’mean1’、'mean2’和’mean3’的变量中,即每类葡萄酒的单独平均向量中。
我们可以使用’np.var’函数估计方差(即,沿着协方差矩阵对角线的元素)。
将结果存储在名为“var1”、“var2”和“var3”的向量中。
一旦你估计了每门课的平均数和方差,训练阶段就完成了

现在需要使用分类器处理测试数据,并将分类器输出与已知测试数据标签进行比较。
要进行实际分类,我们需要计算 p ( x ∣ ω 1 ) . p ( ω 1 ) p(x |\omega_1).p(\omega_1) pxω1.pω1 p ( x ∣ ω 2 ) . p ( ω 2 ) p(x |\omega_2).p(\omega_2) pxω2.pω2 p ( x ∣ ω 3 ) . p ( ω 3 ) p(x |\omega_3).p(\omega_3) pxω3.pω3,看看哪个分数最高。我们假设先验概率相等,即 P ( ω 1 ) = P ( ω 2 ) = P ( ω 3 ) = 1 3 P(\omega_1)=P(\omega_2)=P(\omega_3)=\frac{1}{3} Pω1=Pω2=Pω3=31。因此,我们可以通过比较 p ( x ∣ ω 1 ) p(x |\omega_1) pxω1 p ( x ∣ ω 2 ) p(x |\omega_2) pxω2 p ( x ∣ ω 3 ) p(x |\omega_3) pxω3来进行分类。
为了对一些已知的 x x x计算多元Gassian pdf p ( x ∣ ω ) p(x |\omega) pxω,我们可以使用python函数“multivariable\u normal”。这是Pythonscipy.stats模块的一部分。
要使用它,我们首先使用从scipy.stats导入多变量_normal
然后,我们构造一个分布对象“dist1”,其中包含我们为均值和协方差参数选择的值

#SOLUTION
from scipy.stats import multivariate_normal
dist1 = multivariate_normal(mean=mean1, cov=np.diag(var1))
dist2 = multivariate_normal(mean=mean2, cov=np.diag(var2))
dist3 = multivariate_normal(mean=mean3, cov=np.diag(var3))
p1=dist1.pdf(wines_test[:, 1:])
p2=dist2.pdf(wines_test[:, 1:])
p3=dist3.pdf(wines_test[:, 1:])
p = np.vstack((p1, p2, p3))
#run
p[:,0:4]

为了计算类标签,我们只需要查看哪个类给出了最高的p值。因此,我们查看p的每个nn列,并找到包含最高分数的行的索引。我们可以将这些nn索引存储在称为标签的向量中。我们可以使用一行Python使用np.argmax函数实现这一点,即index=np.argmax(p,axis=0)。

现在我们需要将分类器输出的类标签(labels)与存储在wines\u test的第一列中的真实标签进行比较。然后,我们将计算有多少标签与真实标签匹配,并除以测试集中的样本总数。最后乘以100得到“正确百分比”的结果。

correct = wines_test[:, 0] == index
correct
correct = wines_test[:, 0] == index
percent_correct = np.sum(correct) * 100.0 / index.shape
print(percent_correct)

改进统计模型
我们的对角协方差模型计算和评估速度很快,但它对于数据的真实分布来说是一个糟糕的模型。有些特征是高度相关的。我们现在将重复这个过程,但这次使用完全协方差模型。这只需要对以前的代码做一点小的更改,因此我们应该能够通过剪切和粘贴以前的代码单元格来快速地将其组合在一起。
现在,您可以使用np.cov函数估计完整的13x13协方差矩阵,即估计wines1_列车数据的协方差矩阵,而不是使用np.var估计方差向量,重复多元正态计算并计算新的p数组。再次使用argmax获取输出标签。通过与正确的测试集标签匹配,为新标签打分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值