一、数据来源

1.数据来源:kaggle

2.数据样式

通过对数据“萼片、花瓣的长度、宽度(sepal_length、sepal_width、petal_length、petal_width)”搭建模型进行计算,判断鸢尾花的种类(species)。

二、使用方法

朴素贝叶斯(Naive Bayes)

方法说明:

贝叶斯公式:

实际运用时,需要判断在已知数据的情况下,属于该组的概率,公式变形为:

在建立模型时,依次对比是每一组数据的概率大小,而每一组数据的全概率是相同的,所以,公式再次变形为:

三、代码实现

从数据读取开始,不调取三方库,纯手工推。

1.导入基础库

#1.导入基础库
from csv import reader
from math import exp,pi,sqrt
from random import randrange,seed
import copy

2.读取csv文件和转换数据类型

#2.读取csv文件和转换数据类型
#读取csv文件
def csv_loader(file):dataset=list()with open(file,'r') as f:csv_reader=reader(f)    for row in csv_reader:if not row:continuedataset.append(row)return dataset#指标数据转换为浮点型
def str_to_float_converter(dataset):dataset=dataset[1:]for i in range(len(dataset[0])-1):for row in dataset:row[i]= float(row[i].strip())#分类数据转换为整型
def str_to_int_converter(dataset):class_values= [row[-1] for row in dataset]unique_values= set(class_values)converter_dict=dict()for i,value in enumerate(unique_values):converter_dict[value] = ifor row in dataset:row[-1] = converter_dict[row[-1] ]

3.K折交叉验证拆分数据

#3.K折交叉验证拆分数据
def k_fold_cross_validation(dataset,n_folds):dataset_splitted=list()fold_size= int(len(dataset)/n_folds)dataset_copy = list(dataset)for i in range(n_folds):fold_data = list()while len(fold_data) < fold_size:index = randrange(len(dataset_copy))fold_data.append(dataset_copy.pop(index))dataset_splitted.append(fold_data)return dataset_splitted

4.计算准确性

#4.计算准确性
def calculate_accuracy(actual,predicted):correct_num = 0for i in range(len(actual)):if actual[i] == predicted[i]:correct_num +=1accuracy = correct_num/float(len(actual)) *100.0return accuracy

5.模型测试

#5.模型测试
def mode_test(dataset,algo,n_folds,*args):dataset_splitted = k_fold_cross_validation(dataset,n_folds)scores  = list() for fold in dataset_splitted:train = copy.deepcopy(dataset_splitted)train.remove(fold)train = sum(train, [])test =list()test = copy.deepcopy(fold)predicted = algo(train, test, *args)actual = [row[-1] for row in fold]accuracy= calculate_accuracy(actual,predicted)scores.append(accuracy)return scores

6.数据按字典分类和描述

首先,将数据按分类数据作为key,每一行作为value,进行字典转换;

然后,计算每一列的均值、标准差、长度,并通过字典进行描述:{class:[(mean,std,len)])}。

#6.数据按字典分类和描述
#数据组合成按每一种类进行分类
def split_class(dataset):splitted = dict()for i in range(len(dataset)):vector = dataset[i]class_value = vector[-1]if class_value not in splitted:splitted[class_value]=list()splitted[class_value].append(vector)return splitted#计算每一列(x_i)的均值
def calculate_mean(column):mean = sum(column)/len(column)return mean#计算每一列(x_i)的标准差
def calculate_std(column):mean = calculate_mean(column)var = sum([(x - mean )**2  for x in column])/float((len(column)-1))std = sqrt(var)return std#描述数据[(mean,std,len)]
def describe_data(dataset):description = [(calculate_mean(column), calculate_std(column),len(column)) for column in zip(*dataset)]del description[-1]return description#数据按字典分类描述{class:[(mean,std,len)])}
def describe_class(dataset):splitted = split_class(dataset)descriptions = dict()for class_value, rows in splitted.items():descriptions[class_value] = describe_data(rows)return descriptions

7.设置计算概率的基础模型

正态分布概率计算:

如果随机变量X服从

#7.计算概率的基础模型
def calculate_probability(x,mean,std):exponent = exp(-((x - mean)**2)/(2 *(std**2)))probability = (1/(sqrt(2* pi) * std)) *exponentreturn probability

8.计算每一行数据的概率

#8.计算每一行数据的概率
def calculate_class_probabilities(dataset,row):descriptions= describe_class(dataset)total = sum([descriptions[label][0][-1] for label in descriptions])pribabilities = dict()for class_key, class_value  in descriptions.items():pribabilities [class_key] = class_value[0][-1]/float(total)for i in range(len(class_value)):mean,std,count = class_value[i]pribabilities [class_key] *= calculate_probability(row[i],mean,std)return pribabilities

9.每一行数据中找出最好的标签

#9.每一行数据中找出最好的标签
def predict(dataset,row):pribabilities=calculate_class_probabilities(dataset,row)best_label,best_probability =None, -1for class_value, probability in pribabilities.items():if best_label is None or probability >best_probability:best_probability = probabilitybest_label= class_valuereturn best_label

10.预测测试数据的分类

#10.预测测试数据的分类
def naive_bayes(train,test):pedictions = list()for row in test:prediction = predict(train,row)pedictions.append(prediction)return pedictions

11.运行和参数调整

#11.运行和参数调整
seed(5)
file='./download_datas/IRIS.csv'
dataset= csv_loader(file)
str_to_float_converter(dataset)
dataset=dataset[1:]
str_to_int_converter(dataset)
n_folds=3
algo=naive_bayes
scores = mode_test(dataset,algo,n_folds)print('The scores of our model are : %s' % scores)
print('The average score of our model is : %.3f%%' % (sum(scores)/float(len(scores))))

代码运行结果:

#结果输出
The scores of our model is : [94.0, 98.0, 96.0]
The average score of our model is : 96.000%

四、完整代码

#1.导入基础库
from csv import reader
from math import exp,pi,sqrt
from random import randrange,seed
import copy#2.读取csv文件和转换数据类型
#读取csv文件
def csv_loader(file):dataset=list()with open(file,'r') as f:csv_reader=reader(f)    for row in csv_reader:if not row:continuedataset.append(row)return dataset#指标数据转换为浮点型
def str_to_float_converter(dataset):dataset=dataset[1:]for i in range(len(dataset[0])-1):for row in dataset:row[i]= float(row[i].strip())#分类数据转换为整型
def str_to_int_converter(dataset):class_values= [row[-1] for row in dataset]unique_values= set(class_values)converter_dict=dict()for i,value in enumerate(unique_values):converter_dict[value] = ifor row in dataset:row[-1] = converter_dict[row[-1] ]#3.K折交叉验证拆分数据
def k_fold_cross_validation(dataset,n_folds):dataset_splitted=list()fold_size= int(len(dataset)/n_folds)dataset_copy = list(dataset)for i in range(n_folds):fold_data = list()while len(fold_data) < fold_size:index = randrange(len(dataset_copy))fold_data.append(dataset_copy.pop(index))dataset_splitted.append(fold_data)return dataset_splitted#4.计算准确性
def calculate_accuracy(actual,predicted):correct_num = 0for i in range(len(actual)):if actual[i] == predicted[i]:correct_num +=1accuracy = correct_num/float(len(actual)) *100.0return accuracy#5.模型测试
def mode_test(dataset,algo,n_folds,*args):dataset_splitted = k_fold_cross_validation(dataset,n_folds)scores  = list() for fold in dataset_splitted:train = copy.deepcopy(dataset_splitted)train.remove(fold)train = sum(train, [])test =list()test = copy.deepcopy(fold)predicted = algo(train, test, *args)actual = [row[-1] for row in fold]accuracy= calculate_accuracy(actual,predicted)scores.append(accuracy)return scores#6.数据按字典分类和描述
#数据组合成按每一种类进行分类
def split_class(dataset):splitted = dict()for i in range(len(dataset)):vector = dataset[i]class_value = vector[-1]if class_value not in splitted:splitted[class_value]=list()splitted[class_value].append(vector)return splitted#计算每一列(x_i)的均值
def calculate_mean(column):mean = sum(column)/len(column)return mean#计算每一列(x_i)的标准差
def calculate_std(column):mean = calculate_mean(column)var = sum([(x - mean )**2  for x in column])/float((len(column)-1))std = sqrt(var)return std#描述数据[(mean,std,len)]
def describe_data(dataset):description = [(calculate_mean(column), calculate_std(column),len(column)) for column in zip(*dataset)]del description[-1]return description#数据按字典分类描述{class:[(mean,std,len)])}
def describe_class(dataset):splitted = split_class(dataset)descriptions = dict()for class_value, rows in splitted.items():descriptions[class_value] = describe_data(rows)return descriptions#7.计算概率的基础模型
def calculate_probability(x,mean,std):exponent = exp(-((x - mean)**2)/(2 *(std**2)))probability = (1/(sqrt(2* pi) * std)) *exponentreturn probability#8.计算每一行数据的概率
def calculate_class_probabilities(dataset,row):descriptions= describe_class(dataset)total = sum([descriptions[label][0][-1] for label in descriptions])pribabilities = dict()for class_key, class_value  in descriptions.items():pribabilities [class_key] = class_value[0][-1]/float(total)for i in range(len(class_value)):mean,std,count = class_value[i]pribabilities [class_key] *= calculate_probability(row[i],mean,std)return pribabilities#9.每一行数据中找出最好的标签
def predict(dataset,row):pribabilities=calculate_class_probabilities(dataset,row)best_label,best_probability =None, -1for class_value, probability in pribabilities.items():if best_label is None or probability >best_probability:best_probability = probabilitybest_label= class_valuereturn best_label#10.预测测试数据的分类
def naive_bayes(train,test):pedictions = list()for row in test:prediction = predict(train,row)pedictions.append(prediction)return pedictions#11.运行和参数调整
seed(5)
file='./download_datas/IRIS.csv'
dataset= csv_loader(file)
str_to_float_converter(dataset)
dataset=dataset[1:]
str_to_int_converter(dataset)
n_folds=3
algo=naive_bayes
scores = mode_test(dataset,algo,n_folds)print('The scores of our model are : %s' % scores)
print('The average score of our model is : %.3f%%' % (sum(scores)/float(len(scores))))

朴素贝叶斯(Naive Bayes):鸢尾花分类项目(不调库,手工推)相关推荐

  1. 朴素贝叶斯(naive bayes)

    朴素贝叶斯(naive bayes) 标签: Python 机器学习 主要參考资料:<机器学习实战><统计学习方法> 1.朴素贝叶斯分类原理 朴素贝叶斯法是基于贝叶斯定理和特征 ...

  2. 机器学习一:朴素贝叶斯(Naive Bayes)

    朴素贝叶斯 Naive Bayes 1. Introduction 1.1 离散属性 1.2 连续属性 1.2.1 Gaussian Naive Bayes 1.2.2 Multinomial Nai ...

  3. 【手写算法实现】 之 朴素贝叶斯 Naive Bayes 篇

    [手写算法实现] 之 朴素贝叶斯 Naive Bayes 篇 朴素贝叶斯模型(naive bayes)属于分类模型,也是最为简单的概率图模型,对于之后理解HMM.CRF等模型,大有裨益.这里手写算法介 ...

  4. 机器学习:基于朴素贝叶斯(Naive Bayes)的分类预测

    目录 一.简介和环境准备 简介: 环境: 二.实战演练 2.1使用葡萄(Wine)数据集,进行贝叶斯分类 1.数据导入 2.模型训练 3.模型预测 2.2模拟离散数据集–贝叶斯分类 1.数据导入.分析 ...

  5. 机器学习笔记——朴素贝叶斯(Naive Bayes)

    1贝叶斯算法简介 贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法.在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算 ...

  6. 朴素贝叶斯(Naive Bayes),“Naive”在何处?

    加上条件独立假设的贝叶斯方法就是朴素贝叶斯方法(Naive Bayes). Naive的发音是"乃一污",意思是"朴素的"."幼稚的".&q ...

  7. 西瓜书+实战+吴恩达机器学习(八)监督学习之朴素贝叶斯 Naive Bayes

    文章目录 0. 前言 1. 朴素贝叶斯算法 2. 半朴素贝叶斯算法 2.1. ODE 2.2. SPODE 2.3. TAN 2.4. AODE 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔 ...

  8. 机器学习算法: 朴素贝叶斯(Naive Bayes)

    朴素贝叶斯的介绍 朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一.它是基于贝叶斯定义和特征条件独立假设的分类器方法.由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数 ...

  9. 机器学习(十)分类算法之朴素贝叶斯(Naive Bayes)算法

    贝叶斯定理 首先我们来了解一下贝叶斯定理: 贝叶斯定理是用来做什么的?简单说,概率预测:某个条件下,一件事发生的概率是多大? 了解一下公式 事件B发生的条件下,事件A发生的概率为: 这里写图片描述 同 ...

  10. spark mllib 朴素贝叶斯 naive bayes

    为什么80%的码农都做不了架构师?>>>    数据源说明 第一列每行的标签,其他列为特征 运行代码如下 package spark.logisticRegressionimport ...

最新文章

  1. 领导者必须学会做的十件事情
  2. 病毒周报(071029至071104)
  3. ECS是阿里云提供的什么服务
  4. 数据结构与算法笔记(十一)—— 归并排序
  5. PAT乙级题目答案汇总PAT (Basic Level) Practice (中文)
  6. matplotlib画图时间长_Python学习第86课-数据可视化之matplotlib介绍
  7. 芝加哥计算机科学硕士录取难度,美国cs研究生申请难度有多大?
  8. [BUG]Git Sever搭建与相关错误处理
  9. 用ES6 Generator替代回调函数
  10. android RecyclerView实战
  11. OpenCV之图像二值化
  12. python递归函数基例_函数和代码复用 --Python
  13. js版in_array函数
  14. 批量插入测试数据的存储过程
  15. 【数据结构:树】——搜索二叉树-K模型(非递归和递归)
  16. 必备的 6 大计算机网络基础知识点!会 3 个以上就很牛逼了
  17. 2022下半年软考什么时候开始报名?
  18. 寸 金 难 买 寸 光 阴
  19. m73p黑苹果_ThinkCentre M93z 吃上黑苹果
  20. LeetCode-86

热门文章

  1. Hssfworkbook 设置单元格格式 setdataformat
  2. SAP License:守护企业 “ SAP ERP系统数据资产安全 ”
  3. 输出1900年之后任意一年的日历
  4. C#ScriptingForGrasshopper(二)——脚本编辑器
  5. VsCode编辑器之shell脚本的编辑
  6. 【Dex-Net 2.0】论文精度:Deep Learning to Plan Robust Grasps with Synthetic Point Clouds and Analytic Grasp
  7. STM32个人笔记-SDIO接口
  8. CSCI-1200数据结算法解说
  9. 微信小程序打开其他小程序(打开同一公众号下关联的另一个小程序)
  10. Electron 发生错误 Cannot find module app的解决方案