实验题目 |
朴素贝叶斯算法及应用 |
姓名 |
童玉情 |
学号 |
3180701238 |
回到顶部 |
|
实验目的 |
|
1.理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架; |
|
2.掌握常见的高斯模型,多项式模型和伯努利模型; |
|
3.能根据不同的数据类型,选择不同的概率模型实现朴素贝叶斯算法; |
|
4.针对特定应用场景及数据,能应用朴素贝叶斯解决实际问题。 |
|
|
|
回到顶部 |
|
实验内容 |
|
1.实现高斯朴素贝叶斯算法。 |
|
2.熟悉sklearn库中的朴素贝叶斯算法; |
|
3.针对iris数据集,应用sklearn的朴素贝叶斯算法进行类别预测。 |
|
4.针对iris数据集,利用自编朴素贝叶斯算法进行类别预测。 |
|
|
|
回到顶部 |
|
实验报告要求 |
|
1.对照实验内容,撰写实验过程、算法及测试结果; |
|
2.代码规范化:命名规则、注释; |
|
3.分析核心算法的复杂度; |
|
4.查阅文献,讨论各种朴素贝叶斯算法的应用场景; |
|
5.讨论朴素贝叶斯算法的优缺点。 |
|
|
|
回到顶部 |
|
实验代码 |
|
import numpy as np |
|
import pandas as pd |
|
import matplotlib.pyplot as plt |
|
%matplotlib inline |
|
from sklearn.datasets import load_iris |
|
from sklearn.model_selection import train_test_split |
|
from collections import Counter |
|
import math |
|
# data |
|
def 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, :]) |
|
# print(data) |
|
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) |
|
X_test[0], y_test[0] |
|
class 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 |
|
# 处理X_train |
|
def summarize(self, train_data): |
|
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 = |
|
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): |
|
# summaries: |
|
# input_data:[1.1, 2.2] |
|
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 |
|
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) |
|
from sklearn.naive_bayes import GaussianNB |
|
clf = GaussianNB() |
|
clf.fit(X_train, y_train) |
|
clf.score(X_test, y_test) |
|
clf.predict([[4.4, 3.2, 1.3, 0.2]]) |
|
from sklearn.naive_bayes import BernoulliNB, MultinomialNB # 伯努利模型和多项式模型 |
|
回到顶部 |
|
运行截图 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
回到顶部 |
|
实验小结 |
|
通过这次实验,我学会了朴素贝叶斯算法的使用,朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。 |
|