朴素贝叶斯(Naive Bayes):鸢尾花分类项目(不调库,手工推)
一、数据来源
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):鸢尾花分类项目(不调库,手工推)相关推荐
- 朴素贝叶斯(naive bayes)
朴素贝叶斯(naive bayes) 标签: Python 机器学习 主要參考资料:<机器学习实战><统计学习方法> 1.朴素贝叶斯分类原理 朴素贝叶斯法是基于贝叶斯定理和特征 ...
- 机器学习一:朴素贝叶斯(Naive Bayes)
朴素贝叶斯 Naive Bayes 1. Introduction 1.1 离散属性 1.2 连续属性 1.2.1 Gaussian Naive Bayes 1.2.2 Multinomial Nai ...
- 【手写算法实现】 之 朴素贝叶斯 Naive Bayes 篇
[手写算法实现] 之 朴素贝叶斯 Naive Bayes 篇 朴素贝叶斯模型(naive bayes)属于分类模型,也是最为简单的概率图模型,对于之后理解HMM.CRF等模型,大有裨益.这里手写算法介 ...
- 机器学习:基于朴素贝叶斯(Naive Bayes)的分类预测
目录 一.简介和环境准备 简介: 环境: 二.实战演练 2.1使用葡萄(Wine)数据集,进行贝叶斯分类 1.数据导入 2.模型训练 3.模型预测 2.2模拟离散数据集–贝叶斯分类 1.数据导入.分析 ...
- 机器学习笔记——朴素贝叶斯(Naive Bayes)
1贝叶斯算法简介 贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法.在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算 ...
- 朴素贝叶斯(Naive Bayes),“Naive”在何处?
加上条件独立假设的贝叶斯方法就是朴素贝叶斯方法(Naive Bayes). Naive的发音是"乃一污",意思是"朴素的"."幼稚的".&q ...
- 西瓜书+实战+吴恩达机器学习(八)监督学习之朴素贝叶斯 Naive Bayes
文章目录 0. 前言 1. 朴素贝叶斯算法 2. 半朴素贝叶斯算法 2.1. ODE 2.2. SPODE 2.3. TAN 2.4. AODE 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔 ...
- 机器学习算法: 朴素贝叶斯(Naive Bayes)
朴素贝叶斯的介绍 朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一.它是基于贝叶斯定义和特征条件独立假设的分类器方法.由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数 ...
- 机器学习(十)分类算法之朴素贝叶斯(Naive Bayes)算法
贝叶斯定理 首先我们来了解一下贝叶斯定理: 贝叶斯定理是用来做什么的?简单说,概率预测:某个条件下,一件事发生的概率是多大? 了解一下公式 事件B发生的条件下,事件A发生的概率为: 这里写图片描述 同 ...
- spark mllib 朴素贝叶斯 naive bayes
为什么80%的码农都做不了架构师?>>> 数据源说明 第一列每行的标签,其他列为特征 运行代码如下 package spark.logisticRegressionimport ...
最新文章
- 领导者必须学会做的十件事情
- 病毒周报(071029至071104)
- ECS是阿里云提供的什么服务
- 数据结构与算法笔记(十一)—— 归并排序
- PAT乙级题目答案汇总PAT (Basic Level) Practice (中文)
- matplotlib画图时间长_Python学习第86课-数据可视化之matplotlib介绍
- 芝加哥计算机科学硕士录取难度,美国cs研究生申请难度有多大?
- [BUG]Git Sever搭建与相关错误处理
- 用ES6 Generator替代回调函数
- android RecyclerView实战
- OpenCV之图像二值化
- python递归函数基例_函数和代码复用 --Python
- js版in_array函数
- 批量插入测试数据的存储过程
- 【数据结构:树】——搜索二叉树-K模型(非递归和递归)
- 必备的 6 大计算机网络基础知识点!会 3 个以上就很牛逼了
- 2022下半年软考什么时候开始报名?
- 寸 金 难 买 寸 光 阴
- m73p黑苹果_ThinkCentre M93z 吃上黑苹果
- LeetCode-86
热门文章
- Hssfworkbook 设置单元格格式 setdataformat
- SAP License:守护企业 “ SAP ERP系统数据资产安全 ”
- 输出1900年之后任意一年的日历
- C#ScriptingForGrasshopper(二)——脚本编辑器
- VsCode编辑器之shell脚本的编辑
- 【Dex-Net 2.0】论文精度:Deep Learning to Plan Robust Grasps with Synthetic Point Clouds and Analytic Grasp
- STM32个人笔记-SDIO接口
- CSCI-1200数据结算法解说
- 微信小程序打开其他小程序(打开同一公众号下关联的另一个小程序)
- Electron 发生错误 Cannot find module app的解决方案