IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 简洁高斯朴素贝叶斯分类原理及python实现 -> 正文阅读

[人工智能]简洁高斯朴素贝叶斯分类原理及python实现

高斯朴素贝叶斯分类器是针对特征值连续的情况下给出的一种分类方法。

贝叶斯公式
所有的贝叶斯分类器的基石都是概率论中的贝叶斯公式,给定训练数据集 D = { x i , C i } , i = 1 , . . . , N , x i ∈ R D , C i ∈ 1 , . . . , K D=\{x_i,C_i\},i=1,...,N,x_i\in R^D,C_i\in {1,...,K} D={xi?,Ci?},i=1,...,N,xi?RD,Ci?1,...,K有贝叶斯公式如下: p ( C ∣ x ) = p ( C ) p ( x ∣ C ) p ( x ) , C ∈ { C 1 , C 2 , . . . , C k } p(C|x)=\frac {p(C)p(x|C)}{p(x)},C\in \{C_1,C_2,...,C_k\} p(Cx)=p(x)p(C)p(xC)?,C{C1?,C2?,...,Ck?}
其中 p ( C ) p(C) p(C)为分类先验概率, p ( x ∣ C ) p(x|C) p(xC)为分类条件分布概率。我们的主要任务就是求得 p ( x ∣ C ) 和 p ( C ) p(x|C)和p(C) p(xC)p(C)

高斯分布式
在此时我们假设 p ( x ∣ C ) p(x|C) p(xC)是服从高斯分布的,对任意 x i ∈ ( x 1 , x 2 , . . . , x D ) T x_i\in(x_1,x_2,...,x_D)^T xi?(x1?,x2?,...,xD?)T是相互独立的并且均服从高斯分布:
p ( x ∣ C ) = 1 2 π σ c e x p [ ? ( x ? μ c ) 2 2 σ c 2 ] p(x|C)=\frac {1}{\sqrt {2\pi}\sigma_c}exp[- \frac{(x-\mu_c)^2}{2\sigma_c^2} ] p(xC)=2π ?σc?1?exp[?2σc2?(x?μc?)2?]
其中 μ c 和 σ c \mu_c和\sigma_c μc?σc?分别为各特征的平均值和标准差。

最终分类条件概率可写成:
p ( x ∣ C ) = ∏ d = 1 D p ( x i ∣ C ) = ∏ d = 1 D 1 2 π σ c d e x p [ ? ( x ? μ c d ) 2 2 ( σ c d ) 2 ] p(x|C)=\prod_{d=1}^Dp(x_i|C)=\prod_{d=1}^D\frac {1}{\sqrt{2\pi}\sigma_c^d}exp[- \frac{(x-\mu_c^d)^2}{2(\sigma_c^{d})^2}] p(xC)=d=1D?p(xi?C)=d=1D?2π ?σcd?1?exp[?2(σcd?)2(x?μcd?)2?]

那么最终得到的预测分类结果就是:
C = arg?max ? c p ( C ∣ x ) C=\argmax_c{p(C|x)} C=cargmax?p(Cx)

算法流程
明确了高斯朴素贝叶斯分类器的原理以及计算过程,那么我们很容易得到其算法流程如下:

  1. 准备数据集,分离出feature集以及label集,并根据label集计算先验概率p(C)
  2. 训练模型,根据training dataset计算各特征向量的平均值及标准差
  3. 预测分类,根据输入特征向量计算出所有特征对应的p(x|C)p(C)即k*p(x|C),这里由于分母均相同,所以直接忽略计算分母
  4. 求argmax(k*p(x|C))=argmax(p(x|C))

python实现
花的分类问题:
数据集:数据集链接

import numpy as np
import collections

#高斯朴素贝叶斯类
class GuassianNB:
    def __init__(self):
        self.prior = None #先验概率
        self.avgs = None #均值
        self.vars = None #方差值
        self.nums = None # 特征值数量

    #计算先验概率
    def _get_prior(self, label: np.array)->dict:
        cnt = collections.Counter(label)
        a = {}
        for k,v in cnt.items():
            a[k]=v/len(label)
        return a

    #计算均值
    def _get_avgs(self,data:np.array,label:np.array)->np.array:
        return np.array([data[label == i].mean(axis=0) for i in self.nums])

    #计算方差
    def _get_vars(self,data:np.array,label:np.array)->np.array:
        return np.array([data[label == i].var(axis=0) for i in self.nums])

    #计算似然度
    def _get_likelihood(self,row:np.array)->np.array:
        return (1 / np.sqrt(2 * np.pi * self.vars) * np.exp(
            -(row - self.avgs) ** 2 / (2 * self.vars))).prod(axis=1)

    #训练数据集
    def fit(self, data: np.array, label: np.array):
        self.prior = self._get_prior(label)
        print(self.prior)
        a=[]
        for key in self.prior.keys():
            a.append(key)
        self.nums = a
        self.avgs = self._get_avgs(data, label)
        self.vars = self._get_vars(data, label)

    #预测label
    def predict_prob(self, data: np.array) -> np.array:
        likelihood = np.apply_along_axis(self._get_likelihood, axis=1, arr=data)
        print(likelihood)
        a = []
        for key in self.prior.keys():
            a.append(self.prior[key])
        probs = np.array(a) * likelihood
        print(probs)
        probs_sum = probs.sum(axis=1)
        return probs / probs_sum[:, None]

    #预测结果
    def predict(self, data: np.array) -> np.array:
        return self.predict_prob(data).argmax(axis=1)

def main():
    origin_dataset = np.loadtxt('iris.txt',dtype=str,delimiter=',')
    np.random.shuffle(origin_dataset)
    feature_dataset = [] #特征集
    label_dataset = [] #标签集
    feature_dataset_test = [] #测试集
    label_dataset_test = [] #测试结果集
    for i in range(int(len(origin_dataset)*0.8)):
        feature_dataset.append(origin_dataset[i][0:4])
        label_dataset.append(origin_dataset[i][4])
    for i in range(int(len(origin_dataset)*0.8),len(origin_dataset)):
        feature_dataset_test.append(origin_dataset[i][0:4])
        label_dataset_test.append(origin_dataset[i][4])
    # print(feature_dataset)
    # print("--------------------------")
    # print(label_dataset)
    feature_dataset = np.array(feature_dataset,dtype=float)
    label_dataset = np.array(label_dataset,dtype=str)
    feature_dataset_test = np.array(feature_dataset_test,dtype=float)
    label_dataset_test = np.array(label_dataset_test,dtype=str)
    # print(feature_dataset)
    # print(label_dataset)
    nb = GuassianNB()
    nb.fit(feature_dataset,label_dataset) #训练模型
    # print(nb.avgs)
    # print(nb.nums)
    # print(nb.prior)
    # print(nb.vars)
    test_result = nb.predict(feature_dataset_test)
    print(test_result)
    acc = 0
    for i in range(len(test_result)):
        if nb.nums[test_result[i]] == label_dataset_test[i]:
            acc+=1
    print("精确度:"+str(acc/len(test_result)))
if __name__ == '__main__':
    main()

预测结果:
精确度基本可达90%以上。
在这里插入图片描述在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 11:54:48  更:2021-07-17 11:56:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/24 18:11:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码