Python算法总结(四)朴素贝叶斯(附手写python实现代码)

本文介绍了朴素贝叶斯算法中的GaussianNB,讲解了算法原理,特点,以及如何手写GaussianNB分类器的Python代码,并提供了scikit-learn库的调用实践。
摘要由CSDN通过智能技术生成

一、算法类型

有监督的分类算法

二、算法原理

在这里插入图片描述
MultinomialNB算法,则:
A是类别,B是特征
p(类别i/特征)=p(类别i) * p(特征/类别i) / Σ( p(特征/类别i) * p(类别i) )
p(特征/类别i)= ( p(特征1/类别i) * p(特征2/类别i) * … * p(特征n/类别i) ),注意:特征间相互独立,累积

三、算法特点

  • MultinomialNB
    特点:特征服从多项式概率分布(类似抛骰子)
    scikit-learn中mnb分类器可接受连续型特征,特征取值不能为负数。但一般输入是分类特征。
  • GaussianNB
    特点:特征服从正态分布
    如果特征不服从正态分布,则要先处理数据使其转化为正态分布
  • BernoulliNB
    特点:特征服从0-1分布(类似抛硬币)

四、手写GaussianNB分类器代码

# 切分训练集和数据集
def randsplit(dataset,test_size=0.2):
    '''
    函数功能:随机切分训练集和测试集
    参数说明:
        dataset:输入的数据集
        test_size:训练集占比
    返回:切分好的训练集和测试集
    '''
    N,M=dataset.shape    
    ix=list(range(N))
    random.shuffle(ix)    
    s=int(N * test_size)
    testset=dataset.iloc[ix[0:s],:]
    trainset=dataset.iloc
好的,下面是 Python 实现朴素贝叶斯算法代码: ```python import numpy as np class NaiveBayes: def __init__(self): self.classes = None self.class_probabilities = None self.mean = None self.variance = None def fit(self, X, y): # 获取不同的类别 self.classes = np.unique(y) n_classes = len(self.classes) # 计算每个类别的先验概率 self.class_probabilities = np.zeros(n_classes) for i in range(n_classes): self.class_probabilities[i] = np.sum(y == self.classes[i]) / len(y) # 计算每个特征在每个类别下的均值和方差 n_features = X.shape[1] self.mean = np.zeros((n_classes, n_features)) self.variance = np.zeros((n_classes, n_features)) for i in range(n_classes): X_i = X[y == self.classes[i]] self.mean[i, :] = X_i.mean(axis=0) self.variance[i, :] = X_i.var(axis=0) def predict(self, X): # 计算每个类别下的后验概率 posteriors = np.zeros((len(X), len(self.classes))) for i in range(len(self.classes)): class_prior = np.log(self.class_probabilities[i]) class_mean = self.mean[i] class_variance = self.variance[i] numerator = np.exp(-((X - class_mean) ** 2) / (2 * class_variance)) denominator = np.sqrt(2 * np.pi * class_variance) posterior = class_prior + np.sum(np.log(numerator / denominator), axis=1) posteriors[:, i] = posterior # 返回概率最大的类别 return self.classes[np.argmax(posteriors, axis=1)] ``` 其中 `fit()` 方法用于训练模型,`predict()` 方法用于预测新数据的类别。在 `fit()` 方法中,我们首先计算了每个类别的先验概率,然后计算了每个特征在每个类别下的均值和方差。在 `predict()` 方法中,我们计算了每个类别下的后验概率,并返回概率最大的类别。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值