我是
靠谱客的博主
尊敬超短裙,最近开发中收集的这篇文章主要介绍
机器学习决策树算法解决图像识别,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
算法介绍
什么是决策树算法
决策树又称判定树,是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布。树的最顶层是根结点。
构造决策树的基本算法
主要评估标准,准确率,速度,健壮性,可规模性,可解释性
样例:研究某人今天会不会出去玩?
历史数据:
![](https://img-blog.csdn.net/20161219180819351?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvu2phbxa=/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/dissolve/70/gravity/center)
从图片中可以看出来,此人前14天中9天出去玩,5天没有出去玩,其中由于天气情况原因,晴天2天出去玩,3天没有出去玩,阴天4天出去玩,0天没有出去玩,雨天3天出去玩,2天没有出去玩,然后由于湿度和风力影响,又有了下一轮决策是否出去玩的情况。以此类推分析分类此人是否会出去玩。
2.1.3 熵
例子:猜世界杯冠军,假如一无所知,假如每个队夺冠的几率都是相等的,那么需要猜多少次?
过程:是否是在前16只队伍中,32/2,用二分法可知,需要猜5次。
熵的单位是bit
info(D) = -(1/32*log(1/32)+1/32*log(1/32)+1/32*log(1/32) +1/32*log(1/32)+1/32*log(1/32)...)累加32次
info(D)= 5bit
结论:数据量越大,熵值越大,不准确率越高
熵的差值则为有条件后的概率优化程度,以前面的案例分析,如果直接猜测某人会不会出去玩。结果为:
如果加上天气情况分析,结果为:
所以在已知天气情况的条件下,数据准确率优化了0.246
2.1.4 算法优缺点
优点:直观,便于理解,小规模数据集有效
缺点:处理连续变量不好,类别较多时,错误增加的比较快,可规模性一般
2.2 逻辑分析
此时不得不让我非常开心,那如何利用决策树来做图像识别呢?对此还是让很多人无法理解,现在就慢慢向大家阐述。
再次对上述案例进行分析
天气 | 湿度 | 风力 | 是否出去玩 |
sunny | <=70 | 无 | 玩 |
sunny | <=70 | 无 | 玩 |
sunny | >70 | 无 | 不玩 |
sunny | >70 | 无 | 不玩 |
sunny | >70 | 无 | 不玩 |
overcast | 无 | 无 | 玩 |
overcast | 无 | 无 | 玩 |
overcast | 无 | 无 | 玩 |
overcast | 无 | 无 | 玩 |
rain | 无 | 风 | 不玩 |
rain | 无 | 风 | 不玩 |
rain | 无 | 没风 | 玩 |
rain | 无 | 没风 | 玩 |
rain | 无 | 没风 | 玩 |
然后程序化上述程序:
天气为三维,设置晴天为[1,0,0],那么多云为[0,1,0],雨天为[0,0,1]
湿度为三维,设置<=70为[1,0,0],那么>70为[0,1,0],无为[0,0,1]
风力为三维,设置有风为[1,0,0],那么无风为[0,1,0],无为[0,0,1]
是否出去玩为二维,设置玩为[1],不玩为[0]
由此可知第一项则为 [1,0,0,1,0,0,0,0,1],结果为[1]
以此类推。
之后得出矩阵的计算其最优单位向量个数,
[1,0,0,1,0,0,0,0,1
1,0,0,1,0,0,0,0,1
1,0,0,0,1,0,0,0,0]
每三列则为一个特征向量,然后进行计算熵值最小情况下哪些向量所占权重最大。
但是如何去分析图像相似还是有很大距离,在图像中会有很大像素,例如60*60像素的图片,每个像素点会转换为类似[255,200,10]RGB类型,本报告进行简单分析,首先将图片进行灰度图化,转化为例如[245],然后对下个像素点大小与之比较,大则为0,小则为1,由于图像像素点大,之后会转换为复杂矩阵,之后再对矩阵进行特征向量切割,例如:
[1,0,0,1,0,0,0,0,1
1,0,1,1,0,1,0,0,1
1,0,0,0,1,0,0,0,0]
此矩阵特征向量则为2,1,2,3,1分列,然后在进行熵值计算,权重比对,计算出最合理向量权重占比,之后再对测试图像中的向量进行比对,就可以进算出其相似度。
图像分析结果相当出众,可以对动态相似图片与其他图片有比较大的区分。
6.3 代码实现
编程语言为python ,利用Anaconda2环境编写,测试图片见附录
# -*- coding: utf-8 -*- import os from PILimport Image from PILimport ImageFilter from PILimport ImageOps from sklearnimport tree def getCode(img,size): pixel_Y = [] featurelist = [] for xin range(0,size[0]): global tmp pixel_X = [] for yin range(0,size[1]): pixel = img.getpixel((x, y)) pixel_next = img.getpixel((x, y+1))if y < size[1]-1else None if pixel_nextis not None: feature = 0 ifpixel < pixel_next else1 pixel_X.append(feature) else: featurelist.append(tmp) pixel_X.pop() feature = 0 tmp = feature pixel_Y.append(pixel_X) return pixel_Y,featurelist def OrginCode(dummyX,dummyY): clf = tree.DecisionTreeClassifier(criterion='entropy') clf.fit(dummyX, dummyY) return clf def Cmpcode(cls,dummyX, dummyY): equal = 0 predictedY = cls.predict(dummyX) for n,y inenumerate(predictedY): if y == dummyY[n]: equal += 1 return equal class imageOragin(object): def __init__(self,size=(1366,768),*image): dummyX = [] dummyY = [] for iin image: i = i.resize(size).convert('L') i = ImageOps.equalize(i) code1 = getCode(i, size) dummyX += code1[0] dummyY += code1[1] self.size = size self.cls = OrginCode(dummyX,dummyY) def cmp(self,image): # image.resize(self.size).convert('L').filter(ImageFilter.BLUR)图像模糊化 filter为图像增强手段,不建议使用 # 更多关于ImageFilter推荐博客http://blog.csdn.net/icamera0/article/details/50708888 # resize重新定义图片大小 image = image.resize(self.size).convert('L') # ImageOps.equalize均衡图像的直方图。该函数使用一个非线性映射到输入图像,为了产生灰色值均匀分布的输出图像。 # 更多关于ImageOps推荐博客http://blog.csdn.net/icamera0/article/details/50785776 image = ImageOps.equalize(image) code2 = getCode(image, self.size) equal = Cmpcode(self.cls,*code2) return equal *1.00 / self.size[0] if __name__ =='__main__': image = [] image1 = Image.open(r'C:MLimagetesta1.png',"r") image2 = Image.open(r'C:MLimagetesta3.png',"r") image3 = Image.open(r'C:MLimagetest24.png',"r") image4 = Image.open(r'C:MLimagetesta8.png',"r") image.append(image4) image5 = Image.open(r'C:MLimagetesta12.png',"r") image.append(image5) image6 = Image.open(r'C:MLimagetest1.png',"r") image.append(image6) image7 = Image.open(r'C:MLimagetest3.png',"r") image.append(image7) image.append(image1) image.append(image2) image.append(image3) size = (1366,768) ora = imageOragin(size, *image) path = 'C:\ML\imagetest\' files = os.listdir(path) for iin files: print path+i imaged = Image.open(path+i, "r") print ora.cmp(imaged) |
最后
以上就是尊敬超短裙为你收集整理的机器学习决策树算法解决图像识别的全部内容,希望文章能够帮你解决机器学习决策树算法解决图像识别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复