机器学习_朴素贝叶斯算法识别手写数字
来源:互联网 发布:微信js sdk 分享 编辑:程序博客网 时间:2024/06/01 09:16
朴素贝叶斯算法是基于条件概率的一种分类算法,通过概率大小来进行分类,经常用于分类文档。本文用python实现朴素贝叶斯算法,并用kaggle识别手写数字的数据集来训练,得到81%的准确率。虽然准确率可能比不上其它如SVM、神经网络等算法,但是朴素贝叶斯算法相对来说简单,计算速度也较快。
朴素贝叶斯理论说明
朴素贝叶斯的基本公式:
同样在多分类问题中,
通常
P(ci|w) 难以直接求得,可用条件概率间接求,公式如下:P(ci|w)=P(w|ci)P(ci)P(w)
其中P(w|ci) 表示从ci 类中取出样本w 的概率,P(ci) 表示类别ci 的概率,以上公式的由来相信学过概率论的同学应该都比较清楚这是条件概率。主要过程
- 计算条件概率
P(w|ci)P(ci) ,假设各特征相互独立,则P(w|ci)=P(w0|ci)P(w1|ci)....P(wn|ci) - 对于一个数据集,取出每一个样本概率
P(w) 值是一样的,因此只需要比较P(ci|w) 的值,最大值条件下的ci 即分类结果 - 为防止概率数值过小(接近于0)而出现下溢,因而采用
logP(w|ci)P(ci) 来表示概率。
- 计算条件概率
python实现
通过Kaggle识别手写数字来实现朴素贝叶斯算法。
* 训练数据集
import numpy as npdef trainMethod(dataSet, classesLabel): m,n = dataSet.shape labelSet = set(classesLabel) numLabel = len(labelSet) numFeat = np.ones((numLabel,n)) piLabel = np.zeros(numLabel) piDenom = np.ones(numLabel)+1 for label in labelSet: for i in range(m): if classesLabel[i] == label: numFeat[label] += dataSet[i] piDenom[label] += sum(dataSet[i]) piLabel[label] +=1 for j in labelSet: numFeat[j] = np.log(numFeat[j]/piDenom[j]) piLabel = piLabel/m return numFeat, piLabel
- 测试算法
import numpy as npimport pandas as pdimport csv#图片二像素化,即把图片变为黑白,没有灰度def normalizing(array): m,n = array.shape for i in range(m): for j in range(n): if array[i, j]!=0: array[i, j]=1 #非零全部转化为1 return array# 定义数据集加载函数def loadTrainData(): csv_data = np.array(pd.read_csv('kaggle_dataset/digit_recognize/train.csv')) label = csv_data[:,0] #取值label data = csv_data[:,1:] #取像素质值 return label, normalizing(data)# 加载测试数据,测试数据中没有labeldef loadTestData(): csv_test = np.array(pd.read_csv('kaggle_dataset/digit_recognize/test.csv')) return csv_test# 将数据写入到csv中,python3读写def saveResultCsv(result, csvName): with open(csvName, 'w', newline='') as myFile: writer = csv.writer(myFile) heads = ['ImageId', 'Label'] writer.writerow(heads) j = 1 for i in result: temp = [j, i] writer.writerow(temp) j += 1label,dataSet= loadTrainData()dataTest = loadTestData()piFeat, piLabel = trainMethod(dataSet, label)result = []for i in range(len(dataTest)): result.append(predict(dataTest[i], piFeat, piLabel))saveResultCsv(result, 'kaggle_dataset/digit_recognize/result_NB.csv')
- 提交结果,准确率为81%
阅读全文
0 0
- 机器学习_朴素贝叶斯算法识别手写数字
- 机器学习_算法_朴素贝叶斯
- 【机器学习】k-近邻算法应用之手写数字识别
- 【机器学习】Knn算法实现手写数字识别
- 机器学习--knn手写数字识别系统
- 【机器学习 sklearn】手写数字识别 SVM
- 各种机器学习方法(线性回归、支持向量机、决策树、朴素贝叶斯、KNN算法、逻辑回归)实现手写数字识别并用准确率、召回率、F1进行评估
- 机器学习(三):逻辑回归应用_手写数字识别_OneVsAll_Python
- 机器学习(四):BP神经网络_手写数字识别_Python
- 机器学习实例一:利用朴素贝叶斯算法识别垃圾邮件
- 4 机器学习实践之手写数字识别- 神经网络识别
- 机器学习(3)——KNN算法及手写数字的识别(一)
- 机器学习(4)——KNN算法及手写数字的识别(二)
- 机器学习实战k近邻算法(kNN)应用之手写数字识别代码解读
- 机器学习-KNN算法应用-手写数字识别( hand-written digits)
- K近邻算法(一) python实现,手写数字识别(from机器学习实战)
- 机器学习实战 --应用实例(k-近邻算法)-- 手写数字识别
- 《机器学习实战》第二章:k-近邻算法(3)手写数字识别
- Redis AOF 持久化学习笔记
- 排高低:冒泡与插入排序。不要管别人,自己设计的才是自己的。
- Python优先级队列实现
- 17_7_17:删除一个无头单链表的非尾节点。从尾到头打印单链表
- ECMAScript6箭头函数ArrowFunction"=>"
- 机器学习_朴素贝叶斯算法识别手写数字
- 智能指针作参数
- Deepin15.4.1下CLion第一个Qt例子
- 坚持写博客,记录自己生活
- 查看Unity使用Mono版本
- DGUT oj(001)
- Codeforces 219D Choosing Capital for Treeland 树型DP
- 微信小程序入门教程--列表渲染多层嵌套循环及wx:key的使用
- 删除顽固性node_modules