技术标签: 有监督分类 机器学习 多元统计分析 分类 概率论
1.1、分类规则
和代表两个总体,各自的先验概率为和(),和分别是总体和中的概率密度函数。
和代表按分类规则划分的两组区域。例如,如果一个新观测对象分到,那么我们声明该样本来自总体,。 和 是整个空间的分割。
是“我们将样本分为然而实际上它来自 ”的条件概率:,类似的,,具体分布如下图所示。
进而我们可以推导总错分率 (TPM):
(观测对象被错分到)=
(观测对象被错分到)=
记是错误地将来自总体的观测对象错分到的代价/成本,类似可定义是错误地将来自总体的观测对象错分到的代价/成本,如下图。
我们知道,LDA是没有考虑代价的,它考虑的是一个概率,我们想让样本之间分的越开越好(错分率越少越好)。贝叶斯是可以考虑代价的, 于是贝叶斯考虑的是期望代价(Expected cost of misclassification, ECM),贝叶斯分类的目标是最小化错分的期望代价ECM:
如何最小化?
由上面已知:,,将它们代入到上式中,得到:
贝叶斯分类的目标是找到一个分类法则,使得最小化,这个分类法则与和区域的划分有关,上式当中这项和的取值是没有关系的,进而:
分类规则问题转化为:找到一个区域,使得在的积分最小。
我们知道积分是曲线下的有向面积,如果,则越积越多,如果,则越积越少。换句话说,要使得在的积分最小,应取值所有使得的值。
定理(贝叶斯分类法则):
:
:
化简得:
:
:
特殊情形
(a)当(先验概率相同)
:
:
(b)当(错分成本相同)
:
:
(c)当(先验概率相同且错分成本相同)
:
:
1.2、与LDA的区别
LDA分类 | 贝叶斯分类 | |
是否考虑先验概率 | 否 | 是 |
是否考虑误判代价 | 否 | 是 |
是否事先假设总体分布 | 不需要分布假设 | 需要明确和 |
是否事先假设总体协方差矩阵 | 需要同协方差矩阵假设 | 不需要协方差矩阵假设 |
是否线性 | 是 | 否 |
分类目标 | 最小化错分率 | 最小化错分的期望代价 |
在前面我们讲到《多元统计分析——分类分析——基于Fisher线性判别分析(LDA)的分类》当中,LDA分类完全是基于样本数据来呈现的(找一个投影方向,让两组数据分的最开),没有考虑到任何先验的信息。贝叶斯的优势正好在于考虑了先验的信息。有关先验概率的相关知识可见《统计推断——独立事件、条件概率、贝叶斯定理(先验分布/后验分布/似然估计)》。
例如:通常,一家公司陷入财务困境并最终破产的(先验)概率很小,所以我们应该首先默认一家随机选择的公司不会破产,除非数据压倒性地支持公司将会破产这一事件。所以这时事件发生的先验概率(Prior probability)应该被考虑在内。
另外,我们在LDA分类当中,只考虑了误判的概率,并没有考虑产生误判之后的代价(成本),但是在实际生活当中,从第一类错分到第二类与第二类错分到第一类的代价往往是不一样的。
例如:没有诊断出绝症的“代价”明显大于将病人误诊为绝症,所以这时“误判代价 ”(Misclassification cost)应该被考虑在内。
所以,贝叶斯分类之于Fisher's LDA分类,它的优势在于考虑了这两点:先验概率(Prior probability),误判代价 (Misclassification cost)。
1.3、与LDA的联系
当两群体来自具有相同协方差矩阵的正态分布和时,贝叶斯法则则可以表示为:
:
回想LDA分类法则为:,即我们可以得出结论:当两群体来自具有相同协方差矩阵的正态分布时,贝叶斯法则的特殊情形——当(先验概率相同且错分成本相同),等价于LDA分类法则。
证明如下:
已知当:
根据多元正态分布的密度函数公式得:
,
将这两个式子代入到,得:
两个各取对数,得:
不等式左边展开,得:
因为协方差矩阵的逆,是对称矩阵,根据矩阵转置的性质,易得:,继续化简,可以改写成:,替换,最终得:,取,协方差矩阵我们以样本协方差矩阵代替,即得到:
1.4、案例——LDA算法拓展到贝叶斯
上面我们得到的结论:当两群体来自具有相同协方差矩阵的正态分布时,贝叶斯法则的特殊情形——当(先验概率相同且错分成本相同),等价于LDA分类法则。所以这边我们用Fisher's LDA来做贝叶斯,案例数据集以LDA分类相同。
“今天”和“昨天”的湿度差( )和温度差( )是用来预测“明天”是否会下雨的两个很重要的因素,数据如下;其中label=1表示雨天,label=2表示阴天。
1.4.1、绘制散点图:
plt.scatter(data['Y1'],data['Y2'],c=data['label'])
输出:
1.4.2、假设两群体来自具有相同协方差矩阵的正态分布,用LDA进行贝叶斯分类。
我们基于正态假设,给定一个先验概率priors=[2/3,1/3],然后正常进行LDA分类。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
X=data.iloc[:,:-1] #特征
Y=data.iloc[:,-1] #标签
model_lda= LDA(
priors=[2/3,1/3] #用于LDA中贝叶斯规则的先验概率,当为None时,每个类priors为该类样本占总样本的比例;当为自定义值时,如果概率之和不为1,会按照自定义值进行归一化
)
data_tranform=model_lda.fit_transform(X,Y) #训练模型
#利用模型回测现有样本
Y_predict=model_lda.predict(X) #利用训练的模型回测现有样本
data['label_predict']=Y_predict #保存预测分类结果
data['data_tranform']=data_tranform #降维之后的数据(一维)
data
输出
其中label_predict是模型预测的分类,我们发现,预测错误的样本还是很多的(这和我们指定的先验概率有关,由于我们的先验概率是随便给的,故预测结果不一定好)。
1.4.3、计算总错分率(TPM):
import sklearn.metrics as sm
1-sm.accuracy_score(Y,Y_predict) #1-准确率
输出:
0.25
错分率为0.25,整体的分类效果不太好。
1.4.4、预测未来数据
如果我们得知今天的数据是,如何预测明天的天气?
model_lda.predict(pd.DataFrame([[8.0,2.0]]))
输出:
array([1], dtype=int64)
即根据给定先验概率的LDA分类法则,预测明天为雨天。
1.5、案例——贝叶斯算法
1.5.1、高斯分布的朴素贝叶斯
除了基于正态假设的LDA算法之外,sklearn中有专门用于先验为高斯分布的朴素贝叶斯的包:naive_bayes.GaussianNB,我们来看看其分类的效果。
from sklearn.naive_bayes import GaussianNB #先验为高斯分布的朴素贝叶斯
X=data.iloc[:,:-1] #特征
Y=data.iloc[:,-1] #标签
model_GNB= GaussianNB(
priors=[2/3,1/3] #用于LDA中贝叶斯规则的先验概率,当为None时,每个类priors为该类样本占总样本的比例;当为自定义值时,如果概率之和不为1,会按照自定义值进行归一化
)
model_GNB.fit(X,Y) #训练模型
#利用模型回测现有样本
Y_predict=model_GNB.predict(X) #利用训练的模型预测分类
data['label_predict']=Y_predict #保存预测分类结果
data
输出:
1.5.2、计算总错分率(TPM):
import sklearn.metrics as sm
1-sm.accuracy_score(Y,Y_predict) #1-准确率
输出:
0.1
错分率为0.1,在合理的范围之内,可以得出整体的分类效果是不错的。
1.5.3、预测未来数据
如果我们得知今天的数据是,如何预测明天的天气?
model_lda.predict(pd.DataFrame([[8.0,2.0]]))
输出:
array([1], dtype=int64)
即根据贝叶斯分类法则,预测明天为雨天。
两样本的贝叶斯分类法则为:
:
:
以上分类法则需要考虑误判代价,多群体的误判代价较为复杂,如果我们有组,我们需要考虑组代价。为了简便起见,我们假设各组具有相同的误判概率,从而简化分类法则:
:
:
则推广到多群体贝叶斯分类法则为:将分到最大的那个组(其中和是先验概率和密度函数,与两群体情况类似)。
案例:研究团队调查了20个品牌的电视机,数据集地址:案例数据集《多元统计分析-分类分析-贝叶斯分类-电视机品牌》。记录了它们的市场定位(G):1.高端市场,2. 中端市场,3. 低端市场;质量评估得分(Q),功能评估得分(C)和价格(P,单位为每百元人民币)。如果一个全新的品牌被推出,其中 ,它的市场定位应如何?
1、LDA算法拓展到贝叶斯(前提:假设各群体服从正态分布)
1.1、导入数据
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data=pd.read_excel('D:/CDA/dataset/data_LDA&bayers_2.xlsx')
data
输出:
1.2、两两散点图
sns.pairplot(data,hue="G")
输出:
从图中可以看出,以其中的两个指标来划分群体,分类都不是特别明显。
1.3、Fisher's LDA分类(预设先验概率),并利用训练好的模型回测数据
若我们采用贝叶斯法则,假设总体来自正态分布并且错分成本相同,我们可以设置各个总体的先验概率。在此我们可以采用不同的设置方法:①假设3个群体的发生概率是一样的;②数据驱动的方式,以样本的比例来代替先验概率。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
X=data.iloc[:,:-1] #特征
Y=data.iloc[:,-1] #标签
model_lda_1= LDA(priors=[1/3,1/3,1/3])
model_lda_2= LDA(priors=[5/20,8/20,7/20])
model_lda_1.fit_transform(X,Y) #训练模型
model_lda_2.fit_transform(X,Y) #训练模型
Y_predict_1=model_lda_1.predict(X) #利用训练的模型回测数据
Y_predict_2=model_lda_2.predict(X) #利用训练的模型回测数据
data['label_predict1']=Y_predict_1 #保存预测分类结果
data['label_predict2']=Y_predict_2 #保存预测分类结果
data
输出:
1.4、计算总错分率(TPM):
①各组先验概率相同
import sklearn.metrics as sm
1-sm.accuracy_score(Y,Y_predict_1) #1-准确率
输出:
0.1
②样本比例做先验概率
import sklearn.metrics as sm
1-sm.accuracy_score(Y,Y_predict_2) #1-准确率
输出:
0.1
错分率都为0.1,即前面预设的不同先验概率,在这个问题的分类当中是没有差别的,整体的分类效果是不错的。
1.5、预测未来数据
model_lda_1.predict(pd.DataFrame([[8.0,7.5,65]]))
model_lda_2.predict(pd.DataFrame([[8.0,7.5,65]]))
输出:
array([2], dtype=int64)
array([2], dtype=int64)
即根据以上分类法则,预测都为中端市场。
2、高斯分布的朴素贝叶斯算法
2.1、高斯分布的朴素贝叶斯算法分类,并利用训练好的模型回测数据
我们可以设置各个总体的先验概率。在此我们可以采用不同的设置方法:①假设3个群体的发生概率是一样的;②数据驱动的方式,以样本的比例来代替先验概率。
from sklearn.naive_bayes import GaussianNB #先验为高斯分布的朴素贝叶斯
X=data.iloc[:,:-1] #特征
Y=data.iloc[:,-1] #标签
model_GNB_1= GaussianNB(priors=[1/3,1/3,1/3])
model_GNB_2= GaussianNB(priors=[5/20,8/20,7/20])
model_GNB_1.fit(X,Y) #训练模型
model_GNB_2.fit(X,Y) #训练模型
#利用模型回测现有样本
Y_predict_1=model_GNB_1.predict(X) #利用训练的模型预测分类
Y_predict_2=model_GNB_2.predict(X) #利用训练的模型预测分类
data['label_predict_1']=Y_predict_1 #保存预测分类结果
data['label_predict_2']=Y_predict_2 #保存预测分类结果
data
输出:
2.2、计算总错分率(TPM):
①各组先验概率相同
import sklearn.metrics as sm
1-sm.accuracy_score(Y,Y_predict_1) #1-准确率
输出:
0.25
②样本比例做先验概率
import sklearn.metrics as sm
1-sm.accuracy_score(Y,Y_predict_2) #1-准确率
输出:
0.15
错分率分别为0.25和0.15,整体的分类效果不是很好。
1.5、预测未来数据
model_GNB_1.predict(pd.DataFrame([[8.0,7.5,65]]))
model_GNB_2.predict(pd.DataFrame([[8.0,7.5,65]]))
输出:
array([2], dtype=int64)
array([2], dtype=int64)
即根据以上分类法则,预测都为中端市场。
文章浏览阅读2.4k次,点赞10次,收藏30次。FPGA设计经验谈 —— 10年FPGA开发经验的工程师肺腑之言2014年08月08日 14:08 看门狗关键词: FPGA作者:friends 从大学时代第一次接触FPGA至今已有10多年的时间。至今记得当初第一次在EDA实验平台上完成数字秒表,抢答器,密码锁等实验时,那个兴奋劲。当时由于没有接触到HDL硬件描述语言,设计都是在MAX+plus II原理图环境下用..._fpga开发经验是什么
文章浏览阅读5.4k次,点赞7次,收藏52次。[1]实验目的:理解Socket通信原理,掌握使用Socket和ServerSocket类进行TCP Socket通信的程序设计方法。[2]实验内容:1、使用ServerSocket类和Socket类实现按如下协议通信的服务器端和客户端程序。服务器程序的处理规则如下:向客户端程序发送Verifying Server!。 若读口令次数超过3次,则发送Illegal User!给客户端,程序退出。否则向下执行步骤3)。 读取客户端程序提供的口令。 若口令不正确,则发送PassWord Wr_实验六 socket网络程序设计
文章浏览阅读422次。.版本 2.支持库 spec.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行.局部变量 mothod, PyMethodDef.局部变量 创建结果, 整数型.局部变量 错误类型, 整数型.局部变量 错误信息, 文本型.局部变量 错误信息2, 整数型.局部变量 错误信息3, 文本型.局部变量 错误堆栈, 整数型Py_SetPythonHome (“C:\Python36”)Py_..._易语言python混合开发
文章浏览阅读557次。开讲之前,我们先来回顾一下数据仓库的定义。数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。这个概念最早由数据仓库之父比尔·恩门(Bill Inmon)于1990年在《建立数据仓库》一书中提出,近年来却被愈发广泛的提及和应用,不信看下图:到底是什么,让一个从上世纪90年代提出的概念,在近几年确越来越热?带着这个问题,我们来了解一..._数仓生命周期管理
文章浏览阅读2.4k次,点赞4次,收藏19次。winfrom GridControl总结一、GridControl和GridView的关系GridControl表示网格控件,网格控件使用视图(如 GridView、BandedGridView)来显示数据。GridControl 相当于容器,GridView 相当于容器中的可视化组件,一个GridControl网格控件里面可以有多个视图。类似于 Excel 表格文件 与工作表 Sheet 的关系。二、绑定数据源点击 RunDesigner增加列 Column与DataTabl_winform gridcontrol
文章浏览阅读100次。Ubuntu 16.04安装完成后,还需要做一些配置才能愉快的使用,所以装完系统后还要进行一系列的优化。1.删除libreofficelibreoffice虽然是开源的,但是Java写出来的office执行效率实在不敢恭维,装完系统后果断删掉sudoapt-getremovelibreoffice-common2.删除Amazon的链接sudoapt-get..._prepend domain-name-servers 114.114.114.114;
文章浏览阅读1.2k次,点赞3次,收藏8次。本文记录了将 Eclipse 项目 导入 IDEA 2023.2.2 的过程,同时也适用于山东大学现代软件开发技术这门课的开发环境迁移。_idea导入eclipse
文章浏览阅读1.8k次,点赞2次,收藏2次。Chrome浏览器及调试教程引言在web开发过程中,我们在写JavaScript脚本时难免会遇到各种bug,这时,我们就需要去调试我们的JavaScript脚本,然后去修改代码。最简单的调试方法就是使用alert方法,将可信息通过alert方法的弹窗显示出来。但是,alert方法有几个弊端:1)alert方法在弹..._chrome 浏览器调试协议
文章浏览阅读1.1w次,点赞64次,收藏180次。本篇博文介绍了微信小程序常用API,包括网络请求、数据缓存、交互反馈、设备、媒体、界面、开放接口等方面。每个API都附有详细的介绍和示例代码,以及使用场景。这些API可以帮助小程序开发者快速实现各种功能和交互效果,是小程序开发的必备工具。无论是初学者还是有一定经验的开发者,都能从本篇博文中学到很多实用的技巧和知识。_微信小程序代码大全
文章浏览阅读92次。打开一个别人曾经做的项目,里面用来三方控件,本机没有安装此控件,只是添加的相应的dll,结果导致了LC.exe错误:"Lc.exe已退出 代码为-1 "解决方法:1、把项目文件夹下Properties文件夹下的licenses.licx文件删除,重新编译即可;2、文本方式打开*.csproj文件,在文件中查找licenses.licx字样,删除对应节点。注意:还有..._错误64“lc.exe”已退出,代码为 -1。printlab
文章浏览阅读714次。hc=colorbar;set(hc,'FontSize',times*get(hc,'FontSize'))%假设有colorbar,实际上就是另外一个axes,同样设置它的字体看了这个这里才知道输出格式还可以在ExportSetup里设置的,而set(findall(gcf,'-property','FontSize'),'FontSize',12)可以把所有的对象中字体大小都改到12号!7...._matlab papersize
文章浏览阅读4.9k次。npm install --save vuexnpm ERR! code ENOSELF原因:创建项目时命名成了vuex,npm 安装的包不能将自身作为依赖。解决办法:package.json中name=‘vuex’ 改成 name=‘vuextest’或者另外的名字试试看。_npm n install vuex --save unknown command: "n