决策树
开篇决策树,可以看做一个if-else规则的集合,比如下图就是一棵决策树:
其中,圆圈代表特征,矩形代表最终的类别,圆圈和矩形都可以称为树的节点,决策树正是由这样一个个节点组成的。
本文的主要内容是从零开始构建一棵决策树,中间过程会涉及诸如熵,信息增益以及决策树等概念。
按照老规矩,先上栗子。
信贷决策问题这里有一份数据集,其中每个ID代表一个人,类别列代表是否同意这个人的贷款申请,中间列(年龄,有工作,有自己的房子,信贷情况)是4个特征,现在要求你利用这四个特征及类别标签,构建一棵决策树来决定是否同意贷款申请人的贷款申请。| ID| 年龄| 有工作 | 有自己的房子| 信贷情况 |类别|| ——– | —–: | :—-: |:—–:|:—–:|:—–:|| 1 | 青年 | 否 |否|一般|否|2 | 青年 | 否 |否|好|否| 3 | 青年 | 是 |否|好|是|| 4 | 青年 | 是 |是|一般|是| 5 | 青年 | 否 ...
异常处理_Python基础连载(十五)
开篇本期介绍Python的异常处理方法。
为什么需要做异常处理看下面的函数:
12def div(a,b): return a/b
这个函数用于求解两数相除的结果
我们可以调用它:
12345678#求解1/2>>> div(1,2)0.5#求解3/4>>> div(3,4)0.75
程序貌似没问题
但是我们知道,除数是不能为0的,现在来尝试让除数为0:
1234567>>> div(1,0)Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> div(1,0) File "C:/Users/fanxi/Desktop/swe.py", line 2, in div return a/bZeroDivisionError: division by zero
毫无疑问,程序报错了!
报错信息也很明显:ZeroDivisionError: divis ...
排序_不止于升降-Python基础连载(十四)
开篇本期将介绍排序方法,注意是方法而不是算法,因此更侧重方法的使用,而不对其内部细节的实现原理进行深究。
简单的列表(list)排序list自带有sort()方法可实现排序
默认是升序排列:
1234>>> lis=[1,3,2,5,4,8,6,9]>>> lis.sort()>>> lis[1, 2, 3, 4, 5, 6, 8, 9]
可通过传入reverse=True来实现降序:
1234>>> lis=[1,3,2,5,4,8,6,9]>>> lis.sort(reverse=True)>>> lis[9, 8, 6, 5, 4, 3, 2, 1]
你应该已经发现,上述的排序操作是直接在原列表中进行的。
除了上面的sort(),Python语言本身也有一种排序的函数,叫做sorted()
同样默认是升序排列:
1234>>> lis=[1,3,2,5,4,8,6,9]>>> sorted_lis=sorted(lis)>>& ...
Python将批量图片转pdf
最近在整理以前的书籍和资料,发现了一堆自己写的笔记:
摊开之后的画面是这样的:
丢了吧,太可惜,留着呢,又用不到,而且还占地方。思来想去,我决定将它们扫描做成电子档,永久储存在云端。
说干就干,先拿<操作系统笔记>开刀。我用手机摄像头充当扫描仪,开始了漫长的扫描,这真是个体力活。
许久,终于扫描完了,共134张图片。二话不说,在手机相册中选中扫描的图片,传送到手机wps,开始合成pdf…
然后就好了………………………………………………………吗?
事实是:wps最高只支持一次将50张图片合成pdf,而且还是在开会员的前提下才能操作。emm, 看来要另寻他法了。
一个新的想法是,把图片全部弄进word里,导出pdf就好了
这确实可行,但是每两张图片之间的间隔实在是太大了,有点丑
而且作为一个Python爱好者,一遇到问题,就习惯性的想着能不能用Python来解决
因为如果下次,你有1000份文档的图片需要转pdf,使用word的话,你需要手动创建1000个word文档,然后做1000次导入图片的操作,这可真让人手酸。
拥抱Python吧!
经过一番搜索,我发现了img2pdf这 ...
kd树
开篇在讲解k-近邻算法的时候,我们提供的思路是:对于新到来的样本,计算该样本与训练集中所有样本之间的距离,选取训练集中距离新样本最近的k个样本中大多数样本的类别作为新的样本的类别。
也就是说,每次都要计算新的样本与训练集中全部样本的距离。但是,在实际应用中,训练集的样本量和特征维度都是比较庞大的,这就导致该算法不得不在计算距离上花费大量的时间,那有没有什么方法可以在时间开销上对之前的k-近邻算法进行优化呢?
采用以空间来换时间的思想,就引出了今天的主角:kd树。
构造kd树kd树是一种二叉树,它可以将k维特征空间中的样本进行划分存储,以便实现快速搜索。
一头雾水?没关系,来看一个经典的构造kd树的例子。
现给定一个二维的训练集:T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}
要求构造一个平衡kd树
第一步,选取第0个维度作为被划分的坐标轴,并按照第0个维度从小到大排列全部样本,得到:
{(2,3),(4,7),(5,4),(7,2),(8,1),(9,6)}
第二步,找到第0个维度的中位数对应的样本。注意,这里的中位数与我们之前认知的中位数有些不 ...
k-近邻算法
开篇k-近邻算法是比较简单的一种机器学习算法,其核心思想可以用一句话来概括:近朱者赤,近墨者黑。
在具体介绍该算法之前,先通过一个栗子对该算法做一个感性上的认识。
Python爱好者 or C爱好者 ?
上图中,每一个形状(三角形,圆形)都代表了一个人。总共有两种形状,说明这些人总共可以分为两类:Python爱好者、C爱好者。
三角形一共有7个,代表喜欢写Python的总共有7人;
圆形一共有6个,代表喜欢写C语言的总共有6人。
现在,突然来了一个不知道是喜欢写Python还是C语言(并且只可能属于其中之一)的人—–五角星,要求你来判定这个人所属的类别。
emm…
你可能会说,那看看图上距离这个人(五角星)最近的几个人所属类别就可以了啊!比如就看距离这个人最近的3个人:其中有两个人喜欢写Python,而只有一个人喜欢写C语言(如下图所示)
按照少数服从多数的原则,将这个新来的人(五角星)归类到三角形(Python爱好者)类别就搞定啦!
最终 ...
从模型演化的角度看待国家的发展
时代在发展,社会也在不断地前进。得益于中国特色社会主义,近些年来,我们的生活也发生了翻天覆地的变化,这不仅仅体现在我们的衣食住行,更体现在精神与文化层面。科技日益发达,大国之间的竞争的焦点也渐渐转移到科学技术上来,尤其是进入21世纪以后,深度学习技术的突飞猛进,人工智能技术迅速发展,并且随着算力的不断提升,以前不可能实现的实验,现在都可交由计算机来实现。依托其强大的运算能力和重复特性,如今的人工智能已经有了许多不错的落地成果。我们国家也在大力倡导发展大数据与人工智能,为促进新时代科技强国打下坚实的基础,这也正是我选择跨考进入计算机专业并准备在机器学习、人工智能方向深耕的原因之一。
中国特色社会主义结合了马克思主义与中国的实际国情,在先辈们前仆后继的不断摸索中,才有了今天来之不易的幸福生活,才给了发展高新科技的前提条件。生于20世纪与21世纪的交叉点的我们,更应该珍惜这来之不易的生活,同时也要根据自身条件,努力为社会主义的建设添砖加瓦,贡献自己的力量。于我而言,作为一名计算机专业并对机器学习技术非常热爱的研究生,更要努力学习相关知识。从小的说,是为了自己,往大了说,真心希望自己可以学有所 ...
遗传算法的Python实现
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465import numpy as npimport matplotlib.pyplot as pltDNA_SIZE=10POP_SIZE=100CROSS_RATE=0.8MUTATION_RATE=0.003N_GENERATIONS=200X_BOUND=[0,5]#定义目标函数def F(x): return np.sin(10*x)*x+np.cos(2*x)*x#计算适应度,并使其大于0def get_fitness(pred): return pred+1e-3-np.min(pred)#将二进制串的DNA转为10进制数并限制范围在0到5之间def translateDNA(population): return population.dot(2**np.arange(DNA_SIZE)[::-1])/float(2* ...
手写kmeans算法
开篇在本系列的前面几期中,我们介绍了包含决策树及其相关算法在内的一系列有监督学习算法。本期不妨换换口味,学习一种比较简单的无监督学习算法: k-means.
k-means 算法理论讲解你可能已经听说过这个算法,没有也不要紧,它的原理并不复杂,让我们来看看~
给你一批样本的数据,就像这样:其中不同的id代表不同样本,共10个样本。x和y是两个特征,每一个样本都有且只有这两个特征。
现在希望你能够对这些样本进行分类。
我们知道,在属于有监督学习的分类问题中,训练数据往往会包含类别标签。而上面这份数据本身是不含标签的,所以这并不是一个分类问题。
既然不知道类别标签,你又让我对这些样本进行分类,那如何聚类?又要聚成几类呢?
其实,在k-means中,最终聚成几类是由我们自己决定的;这里的类别标签通常用数字表示,如0,1,2等;当我们指定好类别总数后,每一个样本被归到哪一类,就需要聚类算法自己去学习了。
k-means算法学习将相似的样本聚在一起,称为一个类别(也称为一个”簇”),而将不相似的样本划分到不同的类别(“簇”)中。
这里的相似程度,通常是用样本之间的距离来度量的,比如最常用的欧氏距 ...
BrainF语言解释器的Python实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960def interp(code): data=[0 for _ in range(30000)] pc=0 ptr=0 st=[]#list模拟stack while(pc<len(code)): c=code[pc] print("正在处理字符'{}'".format(c)) if c=='<': ptr-=1 elif c=='>': ptr+=1 elif c=='+': data[ptr]+=1 ...