python模拟朴素贝叶斯程序举例分析
发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,这篇文章主要介绍"python模拟朴素贝叶斯程序举例分析",在日常操作中,相信很多人在python模拟朴素贝叶斯程序举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2024年11月27日python模拟朴素贝叶斯程序举例分析
这篇文章主要介绍"python模拟朴素贝叶斯程序举例分析",在日常操作中,相信很多人在python模拟朴素贝叶斯程序举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"python模拟朴素贝叶斯程序举例分析"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
朴素贝叶斯思想:运用了条件概率公式P(Y,X) = P(Y)P(X|Y)。由样本分别求得P(Y)和P(X|Y),进而估计出在X条件下Y的概率。不同Y对应的概率的最大值就是我们想要的X的分类。换句话说,我们想要知道X的分类,那么通过样本求出不同类别(即不同Y)时的P(Y)和P(X|Y),然后计算X发生条件下,可能类别Y的概率,最大的概率就是我们预测的概率。
注意,通常X对应很多分量,X=(X1,X2,······)。这时候贝叶斯估计假设:用于分类的特征在类确定的条件下是条件独立的。所以上面的P(X|Y)计算公式为:
朴素贝叶斯代码的实现
import numpy as npimport pandas as pdimport mathimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitclass NaiveBayes: def __init__(self): self.model = None # 数学期望 @staticmethod def mean(X): return sum(X) / float(len(X)) # 标准差 def stdev(self, X): 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): exponent = math.exp(-(math.pow(x - mean, 2) / (2 * math.pow(stdev, 2)))) return (1 / (math.sqrt(2 * math.pi) * stdev)) * exponent # 分类别求出数学期望和标准差 def summarize(self, train_data): a = list(zip(*train_data)) summaries = [(self.mean(i), self.stdev(i)) for i in zip(*train_data)] # *train_data将train_data拆分成n个一维数组 # 再将这个一维数组压缩在一起。 # 注意:这里压缩的时候,一共压缩成了四个一维数组, # 即每个原数组的第一维进行压缩,每个原数组的第二维进行压缩······ # 然后分别对四个一维数组进行求均值和标准差,即对四个特征求响应的数字特征 return summaries # 处理X_train,y_train def fit(self, X, y): labels = list(set(y)) # set将y删除掉重复的,list将set结果转成列表。这里labels=[0.0, 1.0] data = {label: [] for label in labels} # 转成字典。输出{0.0: [], 1.0: []} for f, label in zip(X, y): data[label].append(f) # 将上面的字典添加属于这个类的值。即类型是label的f self.model = { label: self.summarize(value) for label, value in data.items() # 从上述字典中,一个label及其对应的属于这个label的数据,进行数字特征的计算 # 结果格式: {0:[(均值, 标准差), (均值, 标准差), (均值, 标准差), (均值, 标准差)], # 1: [(均值, 标准差), (均值, 标准差), (均值, 标准差), (均值, 标准差)]} # 0后边的四项分别对应:label是0的样品的四个特征的均值和标准差 } return 'gaussianNB train done!' # 计算概率 def calculate_probabilities(self, input_data): 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): 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 if right / float(len(X_test))==1.0: return "perfect!" else: return right / float(len(X_test))def create_data(): iris = load_iris() df = pd.DataFrame(data=iris.data, columns=iris.feature_names) df['label'] = iris.target df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label'] data = np.array(df.iloc[:100, :]) return data[:, :-1], data[:, -1], dfX, y, DF = create_data()X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)model = NaiveBayes()model.fit(X_train, y_train)print(model.score(X_test, y_test))
结果比较理想
直接运用sklearn中现有的包进行模拟
import numpy as npimport pandas as pdfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import GaussianNBfrom sklearn.naive_bayes import BernoulliNB, MultinomialNB # 伯努利模型和多项式模型# datadef create_data(): iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df['label'] = iris.target df.columns = [ 'sepal length', 'sepal width', 'petal length', 'petal width', 'label' ] data = np.array(df.iloc[:100, :]) return data[:, :-1], data[:, -1]X, y = create_data()X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)clf = GaussianNB()clf.fit(X_train, y_train)print("GaussianNB:")print(clf.score(X_test, y_test))print(clf.predict([[4.4, 3.2, 1.3, 0.2]]))clf2 = BernoulliNB()clf2.fit(X_train, y_train)print("\nBernoulliNB:")print(clf2.score(X_test, y_test))print(clf2.predict([[4.4, 3.2, 1.3, 0.2]]))clf3 = MultinomialNB()clf3.fit(X_train, y_train)print("\nMultinomialNB:")print(clf3.score(X_test, y_test))print(clf3.predict([[4.4, 3.2, 1.3, 0.2]]))
输出结果
GaussianNB:1.0[0.]BernoulliNB:0.4666666666666667[1.]MultinomialNB:1.0[0.]
可以看到,高斯模型和多项式模型较好的进行了预测,但是伯努利模型预测结果较差。
原因:数据不符合伯努利分布。
到此,关于"python模拟朴素贝叶斯程序举例分析"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
标准
均值
概率
贝叶
朴素
数组
条件
模型
结果
程序
分析
特征
类别
学习
不同
字典
一维
分类
最大
公式
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全比赛赛程
珠海英格姆软件开发
新技术下的网络安全问题
天择网络技术怎么样
服务器做图行吗
数据库的唯一性
飞腾与网络安全
怎么投诉网页里的服务器
数据库丢失还能恢复吗
如何建立python虚拟数据库
2008数据库怎么分配大小
etl可以关联两个数据库吗
cbdb数据库
快速load数据库数据
网络安全损失案例
软件开发到多大
非关系数据库详解
河北服务器电源哪里买
oracle数据库下载教程
济南联想服务器代理哪里有
企业网络安全存在的问题
51code软件开发工程
我的世界黑曼君玩的服务器
我的枪械服务器
数据库连接池如何重连
传奇数据库神兽
个人网络安全定义
深圳市盛传网络技术招聘
培训网络安全就业
网络安全SQL语句分析