朴素贝叶斯算法

news/2024/11/29 10:55:45/

# -*-coding:utf-8-*-

"""
    Author: sunchang
    Desc:
        代码4-7 朴素贝叶斯实现对异常账户检测
"""
import numpy as np


class NaiveBayesian:
    def __init__(self, alpha):
        self.classP = dict()
        self.classP_feature = dict()
        self.alpha = alpha  # 平滑值

    # 加载数据集
    def createData(self):
        data = np.array(
            [
                [320, 204, 198, 265],
                [253, 53, 15, 2243],
                [53, 32, 5, 325],
                [63, 50, 42, 98],
                [1302, 523, 202, 5430],
                [32, 22, 5, 143],
                [105, 85, 70, 322],
                [872, 730, 840, 2762],
                [16, 15, 13, 52],
                [92, 70, 21, 693],
            ]
        )
        labels = np.array([1, 0, 0, 1, 0, 0, 1, 1, 1, 0])#是否是异常用户的标签(1:异常 0:正常)
        return data, labels

    # 计算高斯分布函数值
    #求P(xi|yk)
    def gaussian(self, mu, sigma, x):
        return 1.0 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-(x - mu) ** 2 / (2 * sigma ** 2))

    # 计算某个特征列对应的均值和标准差
    def calMuAndSigma(self, feature):
        mu = np.mean(feature)
        sigma = np.std(feature) # np.var()方差  np.std()标准差
        return (mu, sigma)

    # 训练朴素贝叶斯算法模型
    def train(self, data, labels):
        numData = len(labels) #样本个数
        numFeaturs = len(data[0]) #X维度个数
        # 是异常用户的概率
        #p(y1)
        self.classP[1] = (
                (sum(labels) + self.alpha) * 1.0 / (numData + self.alpha * len(set(labels)))#创建一个无序不重复元素集,删除重复数据
        )
        # 不是异常用户的概率
        #Py(0)
        self.classP[0] = 1 - self.classP[1]

        # 用来存放每个label下每个特征标签下对应的高斯分布中的均值和方差
        # { label1:{ feature1:{ mean:0.2, var:0.8 }, feature2:{} }, label2:{...} }
        #{0: {0: (346.4, 484.05479028721527), 1: (140.0, 192.22174694867383), 2: (49.6, 76.44501291778293), 3: (1766.8, 1975.568819353049)}}
        #{1:{0: (275.2, 316.0249357250152), 1: (216.8, 264.3689845651339), 2: (232.6, 310.2009671164808), 3: (699.8, 1035.9788414827783)}}
        self.classP_feature = dict()
        # 遍历每个特征标签
        for c in set(labels):
            self.classP_feature[c] = {}
            for i in range(numFeaturs):#(0,1,2,3)
                feature = data[np.equal(labels, c)][:, i]
                self.classP_feature[c][i] = self.calMuAndSigma(feature)

    # 预测新用户是否是异常用户
    def predict(self, x):
        label = -1  # 初始化类别
        maxP = 0 #初始最大概率0

        # 遍历所有的label值
        for key in self.classP.keys():#self.classP {1: 0.5, 0: 0.5} 
            label_p = self.classP[key]
            currentP = 1.0
            feature_p = self.classP_feature[key]
            j = 0
            for fp in feature_p.keys():
                currentP *= self.gaussian(feature_p[fp][0], feature_p[fp][1], x[j]) #currentP=P(yk|x) =分子= p(xi|yk)迭乘
                j += 1
            # 如果计算出来的概率大于初始的最大概率,则进行最大概率赋值 和对应的类别记录
            if currentP * label_p > maxP:
                maxP = currentP * label_p
                label = key
        return label

if __name__ == "__main__":
    nb = NaiveBayesian(1.0)
    data, labels = nb.createData()
    nb.train(data, labels)
    label = nb.predict(np.array([134, 84, 235, 349]))
    print("未知类型用户对应的行为数据为:[134,84,235,349],该用户的可能类型为:{}".format(label))

 

 


http://www.ppmy.cn/news/39680.html

相关文章

蓝桥杯真题05

重新排序 问题描述 给定一个数组 A 和一些查询 Li,Ri 求数组中第 Li 至第 Ri个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可以增加多少? 输入格式 输入第一行包含…

什么性格的人适合报考地质学类专业?(高考志愿填报选专业)

地质学 是一门涉及自然科学、人文科学等多个领域的综合性学科,它需要学生具备一定的理论素养和实践能力。在选择地质学类专业时,应该考虑自己的性格特点,以便更好地适应这门学科。 也有很多同学表示,我不清楚自己的性格有什么特征…

HTML5 内联 SVG

文章目录HTML5 内联 SVG什么是SVG?SVG优势浏览器支持把 SVG 直接嵌入 HTML 页面SVG 与 Canvas两者间的区别Canvas 与 SVG 的比较HTML5 内联 SVG HTML5 支持内联 SVG。 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics)SVG 用于定义用于网…

c#编码问题

产生乱码的原因(只有文本文件才会乱码):文本文件存储时采用的编码,与读取时采用的编码不一致,就会造成乱码问题。解决:采用统一的编码就ok. 文本文件编码,文本文件有不同的存储方式,…

第一次在大厂工作的感想——滴滴

文章目录前言相处氛围工作时间培养方案学习方面未来展望前言 很久没更新了呀,因为最近比较忙。二月底刚结束第一段实习,紧接着就拿到了滴滴offer,在学校呆了半个月就开启了第二段实习之旅。从浙江到河南再到北京,仅隔半个月。这次…

【python设计模式】6、装饰器模式

哲学思想 装饰器模式是一种结构型设计模式,其哲学思想是通过组合和装饰对象来扩展其功能,而不需要修改其底层代码或继承新的类。它遵循了"开放封闭原则",即对扩展开放,对修改关闭。 该模式的核心概念是将一个类包装在…

【李宏毅】深度学习——HW4-Speaker Identification

Speaker Identification 1.Goal 根据给定的语音内容,识别出说话者是谁 2.Data formats 2.1data directory 目录下有三个json文件和很多pt文件,三个json文件作用标注在下图中,pt文件就是语音内容。 mapping文件 metadata文件 n_mels:Th…

MySQL简介MySQL安装

一、MySQL的介绍 MySQL是一个关系型数据库管理系统,已经被Oracle收购; MySQL是目前最流行的关系型数据库,使用很广泛; MySQL是一种关系型数据库,关联数据库将保存咱不同的列表中,不是放到一个大仓库当中…