数据挖掘案例:朴素贝叶斯——图像识别
Posted R语言数据分析与实践
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据挖掘案例:朴素贝叶斯——图像识别相关的知识,希望对你有一定的参考价值。
朴素贝叶斯的图像识别
如何训练计算机识别一张照片的内容是风景照还是人物肖像呢?
首要的问题是,如何获取建模用的贴好标签的原始数据。如果已经获得了这些照片,通过人工审核,将这些照片贴上标签分类,似乎不太现实。其实有一个简单的方式是从网站上抓取一些已经被用户贴好标签的照片。
取得数据之后,接下来要对照片进行数据预处理。每张照片都可以表示为一个RGB密度直方图,也就是说,照片中的每一个像素点的色彩都可以表示为该点的三原色组合的密度值。
红绿蓝是计算机处理位图图像的一种方式,其中每个颜色的数值大小都可以用一个介于0-225之间的数值表示。而所有的颜色都可以表示为红绿蓝三基色的某个特定的强度组合,也就是一个RGB密度直方图。
一个图像可以由三个密度直方图,分别为R、G、B对应的红、绿、蓝三基色在该图像上的密度分布。因为255 是个较大的数值,传统的直方图表示会变的比较杂乱。因此我们可以用块状直方图替代,这样我们需要表示的密度范围久锁键为0~51了。也就是说,一张图像可以表示15个数值,因为我们总共需要3种基本颜色,而每种颜色又被细分成了5个色块,当然,我们在这里假设了每张照片的像素点个数是相同的。
k-近邻算法
使用k近邻模型进行分类,例如挑选“蓝色”作为分类条件,k近邻很可能会根据蓝色分布上的不同将风景照和人物肖像照成功分离开来。
R语言
R语言中支持k近邻算法的packages非常多。这里例举一个。
require(graphics) # a 2-dimensional example x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2), matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2)) colnames(x) <- c("x", "y") (cl <- kmeans(x, 2)) plot(x, col = cl$cluster) points(cl$centers, col = 1:2, pch = 8, cex = 2) # sum of squares ss <- function(x) sum(scale(x, scale = FALSE)^2) ## cluster centers "fitted" to each obs.: fitted.x <- fitted(cl); head(fitted.x) resid.x <- x - fitted(cl) ## Equalities : ---------------------------------- cbind(cl[c("betweenss", "tot.withinss", "totss")], # the same two columns c(ss(fitted.x), ss(resid.x), ss(x))) stopifnot(all.equal(cl$ totss, ss(x)), all.equal(cl$ tot.withinss, ss(resid.x)), ## these three are the same: all.equal(cl$ betweenss, ss(fitted.x)), all.equal(cl$ betweenss, cl$totss - cl$tot.withinss), ## and hence also all.equal(ss(x), ss(fitted.x) + ss(resid.x)) ) kmeans(x,1)$withinss # trivial one-cluster, (its W.SS == ss(x)) ## random starts do help here with too many clusters ## (and are often recommended anyway!): (cl <- kmeans(x, 5, nstart = 25)) plot(x, col = cl$cluster) points(cl$centers, col = 1:5, pch = 8)
以上是关于数据挖掘案例:朴素贝叶斯——图像识别的主要内容,如果未能解决你的问题,请参考以下文章