手推朴素贝叶斯

手推朴素贝叶斯&Sklearn 调库方法

手推朴素贝叶斯

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

下溢问题

数值下溢问题:是指计算机浮点数计算的结果小于可以表示的最小数,因为计算机的能力有限,当数值小于一定数时,其无法精确保存,会造成数值的精度丢失.

由上述公式可以看到,求概率时多个概率值相乘,得到的结果往往非常小;因此通常采用取对数的方式,将连乘转化为连加,以避免数值下溢。

Sklearn调库实现

  • Sklearn 接口

    from sklearn.datasets import load_iris
    import pandas as pd
    from sklearn.model_selection import train_test_split
    iris = load_iris()
    X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)
    clf = GaussianNB().fit(X_train, y_train)
    print ("Classifier Score:", clf.score(X_test, y_test))
    
  • Sklearn 参数

    class sklearn.naive_bayes.GaussianNB(priors=None)
    参数:
    priors:先验概率大小,如果没有给定,模型则根据样本数据自己计算(利用极大似然法)。
    var_smoothing:可选参数,所有特征的最大方差
    属性:
    class_prior_:每个样本的概率
    class_count:每个类别的样本数量
    classes_:分类器已知的标签类型
    theta_:每个类别中每个特征的均值
    sigma_:每个类别中每个特征的方差
    epsilon_:方差的绝对加值方法
    #贝叶斯的方法和其他模型的方法一致。
    fit(X,Y):在数据集(X,Y)上拟合模型。
    get_params():获取模型参数。
    predict(X):对数据集X进行预测。
    predict_log_proba(X):对数据集X预测,得到每个类别的概率对数值。predict_proba(X):对数据集X预测,得到每个类别的概率。
    score(X,Y):得到模型在数据集(X,Y)的得分情况。
    
  • 调库(李航)

根据李航老师的代码构建自己的朴素贝叶斯模型
这里采用GaussianNB 高斯朴素贝叶斯,概率密度函数为
在这里插入图片描述
方差
在这里插入图片描述

import math
class NaiveBayes:
    def __init__(self):
        self.model = None

    # 数学期望
    @staticmethod
    def mean(X):
        """计算均值
        Param: X : list or np.ndarray
        
        Return:
            avg : float
        
        """
        avg = 0.0
        return sum(X) / float(len(X))
       

    # 标准差(方差)
    def stdev(self, X):
        """计算标准差
        Param: X : list or np.ndarray
        
        Return:
            res : float
        
        """
        res = 0.0
       	avg = self.mean(X)
        return math.sqrt(sum([pow(x - avg, 2) for x in X]) / float(len(X)))
        
    # 概率密度函数
    def gaussian_probability(self, x, mean, stdev):
        """根据均值和标注差计算x符号该高斯分布的概率
        Parameters:
        ----------
        x : 输入
        mean : 均值
        stdev : 标准差
        
        Return:
        
        res : float, x符合的概率值
            
        """
        res = 0.0
        def gaussian_probability(self, x, mean, stdev):
        exponent = math.exp(-(math.pow(x - mean, 2) /
                              (2 * math.pow(stdev, 2))))
        return (1 / (math.sqrt(2 * math.pi) * stdev)) * exponent
        
        
        
    # 处理X_train
    def summarize(self, train_data):
        """计算每个类目下对应数据的均值和标准差
        Param: train_data : list
        
        Return : [mean, stdev]
        """
        summaries = [(self.mean(i), self.stdev(i)) for i in zip(*train_data)]
        return summaries

    # 分类别求出数学期望和标准差
    def fit(self, X, y):
        labels = list(set(y))
        data = {label: [] for label in labels}
        for f, label in zip(X, y):
            data[label].append(f)
        self.model = {
            label: self.summarize(value)
            for label, value in data.items()
        }
        return 'gaussianNB train done!'

    # 计算概率
    def calculate_probabilities(self, input_data):
        """计算数据在各个高斯分布下的概率
        Paramter:
        input_data : 输入数据
        
        Return:
        probabilities : {label : p}
        """
       probabilities = {}
        for label, value in self.model.items():
            probabilities[label] = 1
            for i in range(len(value)):
                mean, stdev = value[i]
                probabilities[label] *= self.gaussian_probability(
                    input_data[i], mean, stdev)
        return probabilities

    # 类别
    def predict(self, X_test):
        # {0.0: 2.9680340789325763e-27, 1.0: 3.5749783019849535e-26}
        label = sorted(
            self.calculate_probabilities(X_test).items(),
            key=lambda x: x[-1])[-1][0]
        return label
        
    # 计算得分
    def score(self, X_test, y_test):
        right = 0
        for X, y in zip(X_test, y_test):
            label = self.predict(X)
            if label == y:
                right += 1

        return right / float(len(X_test))

	model = NaiveBayes()
	model.fit(X_train, y_train)
	print(model.predict([4.4,  3.2,  1.3,  0.2]))
	model.score(X_test, y_test)
	# 参考代码 https://github.com/wzyonggege/statistical-learning-method
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值