大家好,欢迎来到IT知识分享网。
一、问题描述
鸢尾花(IRIS)有很多种,但又因为特征很是相近,不好区分,通过大量数据归纳的特征,我们通过花萼长度(Sepal.Length),花萼宽度(Sepal.Width),花瓣长度(Petal.Length),花瓣宽度(Petal.Width),4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类,从而更加有效地进行区分。
二、算法原理
朴素贝叶斯最核心的部分是贝叶斯法则,而贝叶斯法则的基石是条件概率。
Bayesianinferenc(贝叶斯推断):根据一个已发生事件的概率,计算另一个事件的发生概率,在可以选择分类中概率最大的就是该事件的分类。
三、数据描述及可视化
横坐标:花萼长度(Sepal.Length)
纵坐标:花萼宽度(Sepal.Width)
横坐标:花瓣长度(Petal.Length)
纵坐标:花瓣宽度(Petal.Width)
四、算法的程序实现
def trainNB0(trainMatrix,trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCategory)/float(numTrainDocs)
p0Num = ones(numWords); p1Num = ones(numWords) #change to ones()
p0Denom = 2.0; p1Denom = 2.0 #change to 2.0
for i in range(numTrainDocs):
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else:
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
p1Vect = log(p1Num/p1Denom) #change to log()
p0Vect = log(p0Num/p0Denom) #change to log()
return p0Vect,p1Vect,pAbusive
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
p1 = sum(vec2Classify * p1Vec) + log(pClass1) #element-wise mult
p0 = sum(vec2Classify * p0Vec) + log(1.0 – pClass1)
if p1 > p0:
return 1
else:
return 0
五、测试结果及分析
选取50%、60%、70%、80%的数据做测试集,绘制正确率折线图,对比1、2两种算法的正确率
测试数据比例 正确率 错误率
10% 1.000000 0
20% 1.000000 0
30% 0.936170 0.063830
40% 0.966102 0.033898
50% 0.957447 0.042553
60% 0.920000 0.080000
70% 0.950000 0.065217
80% 0.933333 0.066667
90% 0.330827 0.669173
在测试数据量到80%之前算法分类出错的概率都非常低,80%之后错误率有明显提高。
六、总结与体会
模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响.
七、参考文献
【1】朴素贝叶斯分类器(NaiveBayes Classifiers)https://blog.csdn.net/sinat_36246371/article/details/60140664
【2】Peter Harrington。《机器学习实战》
【3】python使用matplotlib绘制柱状图教程
http://www.jb51.net/article/104924.htm
非常感谢阅读!如有不足之处,请留下您的评价和问题
。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25168.html