精华内容
下载资源
问答
  • 企业需要什么样的人才 企业需要两类大数据人才,一是数据平台建设人才;二是数据挖掘应用人才。大数据是因应结合应用来体现其价值……例如推动大数据技术在金融、气象、行政管理等领域的应用,推进基于大数据技术的...

    企业需要什么样的人才

    企业需要两类大数据人才,一是数据平台建设人才;二是数据挖掘应用人才。大数据是因应结合应用来体现其价值……例如推动大数据技术在金融、气象、行政管理等领域的应用,推进基于大数据技术的个人信贷和医疗保健等。

    三种能力成就大数据人才

    一是技术相关人才,包括IT、系统、硬件和软件;二是数量相关人才,包括统计、数学、建模、算法;三是业务,就是要有一定的专业领域知识。建立大数据的数据存储本身需要技术能力,但是怎么通过数据去做分析?这就需要数量能力。

    image

    大数据时代热门职业

    1、数据规划师

    在一个产品设计之前,为企业各项决策提供关键性数据支撑,实现企业数据价值的最大化,更好地实施差异化竞争,帮助企业在竞争中获得先机。

    2、数据工程师

    大数据基础设施的设计者、建设者和管理者,他们开发出可根据企业需要进行分析和提供数据的架构。同时,他们的架构还可确保系统能够平稳运行。

    3、数据架构师

    擅长处理散乱数据、各类不相干的数据,精通统计学的方法,能够通过监控系统获得原始数据,在统计学的角度上解释数据。

    4、数据分析师

    职责是通过分析将数据转化为企业能够使用的信息。他们通过数据找到问题,准确地找到问题产生的原因,为下一步的改进找到关键点。

    5、数据应用师

    将数据还原到产品中,为产品所用。他们能够用常人能理解的语言表述出数据所蕴含的信息,根据数据分析结论推动企业内部做出调整。

    6、数据科学家

    大数据中的领导者,具备多种交叉科学和商业技能,能够将数据和技术转化为企业的商业价值。

    大数据只需要学习Java的标准版JavaSE就可以了,像Servlet、JSP、Tomcat、Struct、Spring、Hibernate,Mybites都是JavaEE方向的技术在大数据技术里用到的并不多,只需要了解就可以了,当然Java怎么连接数据库还是要知道的,像JDBC一定要掌握一下,有同学说Hibernate或Mybites也能连接数据库啊,为什么不学习一下,我这里不是说学这些不好,而是说学这些可能会用你很多时间,到最后工作中也不常用,我还没看到谁做大数据处理用到这两个东西的,当然你的精力很充足的话,可以学学Hibernate或Mybites的原理,不要只学API,这样可以增加你对Java操作数据库的理解,因为这两个技术的核心就是Java的反射加上JDBC的各种使用。点击领取免费资料及课程

    Linux:因为大数据相关软件都是在Linux上运行的,所以Linux要学习的扎实一些,学好Linux对你快速掌握大数据相关技术会有很大的帮助,能让你更好的理解hadoop、hive、hbase、spark等大数据软件的运行环境和网络环境配置,能少踩很多坑,学会shell就能看懂脚本这样能更容易理解和配置大数据集群。还能让你对以后新出的大数据技术学习起来更快。

    好说完基础了,再说说还需要学习哪些大数据技术,可以按我写的顺序学下去。#

    image

    Hadoop:这是现在流行的大数据处理平台几乎已经成为大数据的代名词,所以这个是必学的。Hadoop里面包括几个组件HDFS、MapReduce和YARN,HDFS是存储数据的地方就像我们电脑的硬盘一样文件都存储在这个上面,MapReduce是对数据进行处理计算的,它有个特点就是不管多大的数据只要给它时间它就能把数据跑完,但是时间可能不是很快所以它叫数据的批处理。

    YARN是体现Hadoop平台概念的重要组件有了它大数据生态体系的其它软件就能在hadoop上运行了,这样就能更好的利用HDFS大存储的优势和节省更多的资源比如我们就不用再单独建一个spark的集群了,让它直接跑在现有的hadoop yarn上面就可以了。其实把Hadoop的这些组件学明白你就能做大数据的处理了,只不过你现在还可能对"大数据"到底有多大还没有个太清楚的概念,听我的别纠结这个。

    等以后你工作了就会有很多场景遇到几十T/几百T大规模的数据,到时候你就不会觉得数据大真好,越大越有你头疼的。当然别怕处理这么大规模的数据,因为这是你的价值所在,让那些个搞Javaee的php的html5的和DBA的羡慕去吧。

    Zookeeper:这是个万金油,安装Hadoop的HA的时候就会用到它,以后的Hbase也会用到它。它一般用来存放一些相互协作的信息,这些信息比较小一般不会超过1M,都是使用它的软件对它有依赖,对于我们个人来讲只需要把它安装正确,让它正常的run起来就可以了。

    Mysql:我们学习完大数据的处理了,接下来学习学习小数据的处理工具mysql数据库,因为一会装hive的时候要用到,mysql需要掌握到什么层度那?你能在Linux上把它安装好,运行起来,会配置简单的权限,修改root的密码,创建数据库。这里主要的是学习SQL的语法,因为hive的语法和这个非常相似。点击领取免费资料及课程

    Sqoop:这个是用于把Mysql里的数据导入到Hadoop里的。当然你也可以不用这个,直接把Mysql数据表导出成文件再放到HDFS上也是一样的,当然生产环境中使用要注意Mysql的压力。

    Hive:这个东西对于会SQL语法的来说就是神器,它能让你处理大数据变的很简单,不会再费劲的编写MapReduce程序。有的人说Pig那?它和Pig差不多掌握一个就可以了。

    Oozie:既然学会Hive了,我相信你一定需要这个东西,它可以帮你管理你的Hive或者MapReduce、Spark脚本,还能检查你的程序是否执行正确,出错了给你发报警并能帮你重试程序,最重要的是还能帮你配置任务的依赖关系。我相信你一定会喜欢上它的,不然你看着那一大堆脚本,和密密麻麻的crond是不是有种想屎的感觉。

    Hbase:这是Hadoop生态体系中的NOSQL数据库,他的数据是按照key和value的形式存储的并且key是唯一的,所以它能用来做数据的排重,它与MYSQL相比能存储的数据量大很多。所以他常被用于大数据处理完成之后的存储目的地。

    Kafka:这是个比较好用的队列工具,队列是干吗的?排队买票你知道不?数据多了同样也需要排队处理,这样与你协作的其它同学不会叫起来,你干吗给我这么多的数据(比如好几百G的文件)我怎么处理得过来,你别怪他因为他不是搞大数据的,你可以跟他讲我把数据放在队列里你使用的时候一个个拿,这样他就不在抱怨了马上灰流流的去优化他的程序去了,因为处理不过来就是他的事情。

    而不是你给的问题。当然我们也可以利用这个工具来做线上实时数据的入库或入HDFS,这时你可以与一个叫Flume的工具配合使用,它是专门用来提供对数据进行简单处理,并写到各种数据接受方(比如Kafka)的。

    Spark:它是用来弥补基于MapReduce处理数据速度上的缺点,它的特点是把数据装载到内存中计算而不是去读慢的要死进化还特别慢的硬盘。特别适合做迭代运算,所以算法流们特别稀饭它。它是用scala编写的。Java语言或者Scala都可以操作它,因为它们都是用JVM的。
    在这里插入图片描述
    查看更多文章:

    没有基础想学大数据难吗?

    大数据入门学习,你要掌握这些技能

    大数据领域三个大的技术方向

    自学大数据从哪入手

    大数据专业未来就业前景如何?

    教你大数据必修三大技能 ,快快记录下来

    展开全文
  • 算法,底层框架源码可能没有过多地要求必须要掌握的技能有:一、基础语法1 变量2 逻辑判断3 循环4 函数二、数据结构1 数字(加减乘除)2 字符串(一串字符)3 布尔 (真假)4 元组 (不修改的列表)5 列表(Python...

    谢邀。小公司的要求不是很高。但是基本的做项目,解决问题的思路还是要有的。对算法,底层框架源码可能没有过多地要求

    必须要掌握的技能有:

    一、基础语法

    1 变量

    2 逻辑判断

    3 循环

    4 函数 />

    />

    二、数据结构

    1 数字(加减乘除)

    2 字符串(一串字符)

    3 布尔 (真假)

    4 元组 (不能修改的列表)

    5 列表(Python的苦力,最重要的结构)

    有顺序,索引

    6 字典(索引可以使任意不变的结构)

    7 集合 (元素不能重复)

    验证数据结构和基础语法学习结果

    如何统计一段文字里,出现次数前3的字符?

    />

    />

    三、文件处理

    open

    read 、readline、readlines

    write、writelines

    tell

    seek

    web框架 Flask VS Django

    核心思路是一致的

    路由解析

    监听端口

    渲染模板

    重定向

    用户认证

    />

    user.html

    />

    />

    四、数据库入门

    喊麦增删改查四大语句

    增加 我 insert

    删除 他 delete

    修改 这 update

    查询 那 select

    Python链接数据库

    MySQLdb

    connect 链接

    cursor 游标对象

    execute 执行sql

    fetchall 获取执行的结果

    orm(SqlAlchemy 下期敬请期待)

    五、简单的前端

    展示数据

    table,tbody,tr,td

    提交数据

    form ,input,name,submit

    超链接a

    图片img

    六、前后端交互

    前端给后端

    http协议

    form 、a 、ajax

    get/post

    后端给前端

    直接渲染模板+jinji2

    ajax

    七、发送http请求

    requests />

    调用别的系统接口

    输入ip,返回地址,调用百度地图的api />

    />

    八、简单的爬虫—PyQuery

    喜闻乐见的豆瓣电影

    先用requests下载网页html内容

    PyQuery解析页面,获取想要数据

    />

    />

    入门python与其他语言都是一个道理,大致可分为以下三个方面:找一本好的书

    一个好的师傅

    一个好的地方

    1.1、入门书籍:《简明python教程》又名《AByte of Python》

    《零基础入门学习Python》

    《python学习手册(第四版)》又名《 Learning Python》 -------- 作者:Mark Lutz、侯靖译

    《Python核心编程(第3版)》 -------- 丘恩

    《python编程:从入门到实践》等

    1.2、视频资源:

    慕课网

    优达学城

    中国大学MOCC

    可汗学院

    当然如果身边有个python高手也是不错的

    1.3、好的地方:

    找一个好的地方,安安静静,每天抽点时间学习下python

    关注python大神的博客、公众号

    公众号推荐:菜鸟学python、python之禅、廖雪峰老师、菜鸟教程

    待入门后可试着在github上参与项目

    2、爬虫

    2.1、三个阶段:掌握基础知识(python基础、网络请求等)

    模仿(模仿别人代码,多看代码弄懂每行代码,熟悉主流爬虫工具)

    上手

    2.2、需要了解的知识:

    HTML 知识、HTTP 协议的基本知识、正则表达式、数据库知识

    常用抓包工具的使用、爬虫框架的使用

    涉及到大规模爬虫还需要了解分布式的概念、消息队列、常用的数据结构和算法、缓存,甚至还包括机器学习的应用等

    2.3、学习路线:学习了解python(基础语法)

    了解html,教程推荐:爬虫原理:通过网络请求从远程服务器下载数据的过程,网络请求背后的技术基于http协议,入门爬虫需要了解http协议的基本原理

    网络请求框架是对http协议的实现,了解http协议后,就可以有针对性的学习和网络相关的模块,python(自带):urllib,httplib,Cookie等

    爬取下来的数据需要处理:如JSON数据用python自带的json,html数据用beeautifulsoup4、lxml库,xml数据除了可以用untangle、还可以使用xmltodict等第三方库。

    爬虫工具:学会浏览器的审查元素,去跟踪请求信息

    正则表达式:非必须(建议学),可以对爬取下来的数据进行清洗,对不能使用常规字符串操作符时可以使用正则,python的re模块可以用来处理正则,推荐教程:数据持久化存储:文件存储(CSV文件),数据库存储(sqlite、MySQL)、分布式文档数据库(MongoDB),这些数据库对python都非常友好,都有现成库支持,熟悉API如何使用。

    Python爬虫知识点梳理

    爬虫部分的知识参考的是,原文链接可关注微信公众号:Python之禅

    3、推荐书籍《零基础入门学习Python》 -------- 小甲鱼

    《python学习手册(第四版)》又名《 Learning Python》 -------- 作者:Mark Lutz、侯靖译

    《Python核心编程(第3版)》 -------- 丘恩

    《python编程:从入门到实践》

    适合小白,兼顾2.7和3.5,精简,有动手试一试环节,翻译质量高

    《流畅的python》

    从最佳编程实践到底层实现原理《简明python教程》又名《AByte of Python》

    非常推荐《深入浅出python》

    通俗易懂,培养大量插图,无长篇大论《父与子的编程之旅》

    《Effective Python》

    帮你掌握Pythonic的编程方式《Python源码剖析》

    《集体智慧编程》

    注重实践,以机器学习与计算统计为主题背景,讲述如何挖掘和分析web上的数据和资源

    可以学习人工智能和数据挖掘《利用python进行数据分析》

    数据分析库pandas作者写的,数据分析入门首选

    4、python知识

    python应用广泛,所需要学习的东西也有很多,当已经熟悉了解基础后,差不多已经入门,以下为python进阶发展学的几个方面:入门(python基础)

    爬虫

    数据挖掘与机器学习

    web开发

    自动化运维等

    当然我之前也有回答过类的问题,可以参考:请问一下我要学习Python,但是是完全零基础的,有没有什么书籍推荐一下?​www.zhihu.comv2-e770441044a5e31c3aa6a46d14bffb76_180x120.jpg

    好了 希望对你学习Python有一点帮助!关注个人公众号【终端研发部】

    搜索不到的,可以通过这个图片地址进行扫描:

    另外,同学们有什么具体的困惑,欢迎在留言区积极探讨回复【Python】可以得到python全套学习视频,让你技术得到更高的提升

    回复【面试题】可以领取各种非常实用的大厂面试题

    回复【提升学习】上面提到了,可以进一步交流学历提升的方法

    回复【职业规划】即可免费获得8技术大牛的职业规划课程,职业不再迷茫。

    回复【Java】即可免费获得Java全套视频教程详解及java后端学习资料

    另外,同学们有什么具体的困惑,欢迎在留言区积极探讨

    展开全文
  • 1. 为啥要数据结构? 应用:机器学习,数据挖掘,自然语言处理,密码,计算机图形 研究:时空复杂度问题 找工作常用:贪心,分治,动态规划,树,图 ...可行性(人类能做的到的) 输入&输出 3.常

    1. 为啥要学数据结构?

    • 应用:机器学习,数据挖掘,自然语言处理,密码学,计算机图形学
    • 研究:时空复杂度问题
    • 找工作常用:贪心,分治,动态规划,树,图

    2.什么是算法?

    把大象装进冰箱分为几步?打开冰箱门,把大象放进去,关上冰箱门。没错,这是一个算法。

    算法的条件:

    • 又穷性(在人类毁灭前算完)
    • 确定性(你好漂亮,我有点喜欢你。计算机:这TM怎么衡量)
    • 可行性(人类能做的到的)
    • 输入&输出

    3.常用的算法

    • 穷举(万能算法)
      俗称暴力破解
    • 分而治之(减而治之)
      二分查找——减而治之
      归并查找——分而治之
    • 贪心
      最小生成树Prim,Kruskal
      单源最短路Dijkstra
    • 动态规划
      背包
      士兵路径

    4.复杂度

    谈算法不谈复杂度==耍流氓

    使用大O记号(最坏情况,忽略系数)
    时间:基本操作次数(汇编指令条数)
    空间:占用内存字节数
    区别:空间可以再利用
    时空互换(Hash表)

    时间和空间权衡的艺术

    常见复杂度

    • O(1)
      最快,例如基本运算,+,—,*,/,寻址等
    • O(logn)
      二分查找(看见log跟分治相关,默认以2为底,实际上不同底之间可以转换)
    • O(n^(1/2))
      枚举约数
    • O(n)
      线性查找
      如果算上输入的复杂度,则输入n个数的时间复杂度的下线为O(n)
    • O(n^2)
      冒泡,选择排序
    • O(n^3)
      Floyd最短路
    • O(nlog(n))
      归并排序
      快速排序的期望复杂度
      基于比较的算法的下界
    • O(2^n)
      枚举全部的子集
    • O(n!)
      枚举全排列

    总结
    相对比较好的复杂度:O(1)< O(logn)< O(n)< O(nlog(n))
    可能还可以优化的复杂度 :O(n^2)< O(n^3)< O(2^n)< O(n!)

    常见的复杂度分析方法

    • 输入输出
      如果算上输入输出的复杂度,那么需要注意时间复杂度的下线

    • 循环次数
      两次循环的复杂度至少为n^2

    5.数据结构分类

    wiki上给的常见数据结构的分类为:

    • 数组(Array)
    • 堆栈(Stack)
    • 队列(Queue)
    • 链表(Linked List)
    • 树(Tree)
    • 图(Graph)
    • 堆(Heap)
    • 散列表(Hash)

    总结一下大概分为:

    • 线性结构(栈,队列,链表,哈希表(散列表))
    • 树和堆(二叉树等各种树,二叉堆等)

    出了基本的各种结构之外,数据结构很普遍的一种体现方式就是排序算法了,掌握基本结构和排序算法也是入门数据结构与算法的第一步。

    6.最大子数组

    leetcode上的53题:
    Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
    For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
    the contiguous subarray [4,-1,2,1] has the largest sum = 6.

    第一种方法:暴力破解,枚举所有的情况

    两重循环,时间复杂度O(n^2)

    class Solution:
        def maxSubArray(self, A):
            sum_temp=0
            maxSum=-2147483648
            for i in range(len(A)):
                for j in range(i,len(A)):    
                    sum_temp+=A[j]
                    maxSum=max(maxSum,sum_temp)
                sum_temp=0
            return maxSum

    第二种方法:问题转化:用一层循环解决问题

    目标:Max(A[i]+A[i+1]+···+A[j])
    定义:S[j]=A[0]+A[1]+····+A[j]

    目标转换:Max(S[j]-S[i-1])
    结果:将目标转换为一个减法的问题
    时间复杂度O(n)

    class Solution:
        def maxSubArray(self, A):
            si=0    #前i项之和(因为sj先加,所以准确来讲每次循环使用的是前i-1项之和)
            sj=0    #前j项之和
            minsi=0 #应减去的前i-1项
            ans=-2147483648 #int中最大的负数
            for i in range(len(A)):
                sj+=A[i]
                if minsi > si :
                    minsi=si
                if sj-minsi>ans:  #极端:1.如果加上一个负数ans不变,2.开始第一个为负数,后面可以减去  
                    ans = sj-minsi
                si+=A[i]
            return ans

    为了更好的理解这种方法的可行性,取两个极端的例子试一下:

    • A=[-2,1,2,3,4]
      sj先是等于-2,而后si=-2,ans=-2
      sj=-2+1,minsi=-2,然后发现如果不加前面的-2,ans会更大,所以减去minsi,ans=1
      如此一来就减去了前面的-2对最大值的负影响

    • A=[1,2,3,4,-2]
      sj=1+2+3+4后,minsi=0,循环结束时si=1+2+3+4,ans=1+2+3+4
      当sj+-2后,发现sj-minsi不大于ans,所以ans不变

    上述是一个简单的数据结构与算法的例题,可见问题的转化可以很大程度的简化处理问题所需复杂度,这也是数据结构可爱之处。

    展开全文
  • 机器学习决策树学习算法(C++实现)

    万次阅读 多人点赞 2017-12-02 16:49:50
    C++ 实现决策树学习算法 史上最简单写在前面当看到自己的程序能够将简单的例子...刚刚还在知乎上面搜索了一个词是什么意思,可能大家都听过这个词:造轮子,我这次工作算是造轮子吧, 大牛说:放到编程中,就是说

    #C++ 实现决策树学习算法 史上最简单
    ##写在前面
    当看到自己的程序能够将简单的例子成功运行,证明自己程序的逻辑性没有问题,真的是非常高兴,虽然需要做的事情还有很多很多,总之还是有一些喜悦的啦,所以将我的这段工作以这篇博客记录下来,如果有人看到能和我相互交流那再好不过了。刚刚还在知乎上面搜索了一个词是什么意思,可能大家都听过这个词:造轮子,我这次做的工作算是造轮子吧,大牛说:放到编程中,就是说业界已经有公认的软件或者库了,你明知道自己不可能比它做得更好,却还坚持要做。作为练习,造轮子可以增加自己的经验,很多事情看起来简单,但只有自己动手,才会发现其中的难点。

    首先介绍一下我在做这件事情时的起因,最近大家似乎都在学习机器学习,搞计算机的人说自己是搞人工智能的,机器学习是基础。然后搞数学的人说要做一些应用(比如说我)锻炼一下实践能力,所以机器学习、数据挖掘、深度学习这些词汇就映入了我们的生活。搞经济管理的也要学习机器学习预测经济走势,等等好多方面我甚至都没听过。反正总结一点就是几乎所有学科在Alpha Go打败李世石的那天后都开始了机器学习的研究。然后我就比较好奇,大家说的机器学习到底是个什么?他怎么就那么火呢?所以我也和大家一样开始走在了机器学习的道路上。我个人的特点是比较注重实践操作的,也就是遇到学过的算法总想自己用编程语言实现一下也就是俗称的造轮子。怎么说呢,这种习惯真的是有利也有弊。先说弊端,就是同样在学习一本教材,你的同学可能在一个月时间内已经看了一半甚至更多了,而我才刚刚把第一章的编程实完。在学习和实践的过程中代码复现浪费了大部分时间。好处呢,可能大家已经都想到了,就是通过代码复现,我对某一知识理解的更加深刻,并且不但清楚原理,而且明白在实际中算法是如何起作用的。能达到这样的目的的不仅仅有代码复现这一种方式,做笔记、写博客、讨论分享往往都会对知识本身的认识加深。当然这些方式并不矛盾,有时候往往是同时进行的。有时候很难找到一个和你能谈论某个具体算法的同志,这个时候我选择了代码复现的方式。我要强调一下,自己写代码其实是一件很困难的时,困难之一在于你要客服使用现成代码的那种懒惰心理,有时候我们在这第一步就走不下去了。克服了懒惰还要克服困难,在代码复现的过程中,你不仅仅要懂算法的原理和思想,在算法的进行的每一步都需要做到心里清楚,考虑好用哪些数据结构去存储、用什么样的流程去实现。总之,代码复现不是一件简单的事情。
    就以这次的决策树算法来说吧,算法本身并不复杂,但是我只是用C++实现了基本的功能,剪枝操作、C4.5算法、CART算法还没有完善的情况下我仍然花费了很多时间。这可能和自己的水平有关,所以越是觉得自己水平不行,就应该迎难而上,挑战一下自己的韧性和耐力。以上就是这篇文章出现的原因。

    ##文章内容
    我将从下面几个方面介绍我整个工作历程,当然代码,思路我也将毫无保留的提供,毕竟菜鸟,还要多学习学习
    也希望大家能够批评指正,小弟编程经验及实际经验尚显不足,也希望能和互联网的广大朋友们多多交流,多多
    学习。

    1. 决策树算法背景介绍介绍
    2. 决策树算法原理
    3. C++编程实现决策树算法
    4. 利用DecisionTree C++类执行一个分类的功能

    决策树背景介绍

    为什么首先要讲背景呢,可能大家已经迫不及待翻到算法讲解及编程实现部分了,不过我觉得背景、故事这
    些东西看似无关紧要但有时往往要比知识本身的内容重要的多,通过了解背景能加深我们对算法本质的理解,
    同时也可以学习先辈们是如何在这个算法上一步一步走过来的,这些信息往往能给我们很多灵感,借此实现我们
    自己的想法也说不定哦。

    读过周志华老师的《机器学习》一书的同学应该都知道,周老师在每一章的最后都安排了一个“休息一会儿”的
    模块,这里介绍本章节相关算法的发展和重要奠基人的故事,我觉得这里的故事非常精彩,有时候我深知会读3,4遍
    下面就是Ross Quinlan(罗斯 昆兰)和决策树的故事。昆兰是来自澳大利亚的计算机科学家,2011年获得了
    数据挖掘领域最高荣誉奖KDD创新奖,昆兰发明了著名的决策树学习算法ID3、C4.5。
    最初的决策树算法是心理学家兼计算机科学家
    E.B.Hunt 1962年在研究人类概念学习过程中提出的CLS(Concept Learning System),这个算法确立了
    决策树 “分而治之”的学习策略。罗斯昆兰在Hunt的指导下于1968年在美国华盛顿大学获得计算机博士学位,
    然后到悉尼大学任教。1978年他在学术假时到斯坦福大学访问,选修了图灵的助手D。Michie开设的一门
    研究生课程。课上有一个大作业,要求写程序来学习出完备正确的规则,以判断国际象棋残局中的一方是否会
    在两步棋后被将死。昆兰写了一个类似于概念学习系统(CLS)的程序来完成作业,其中最重要的改进是引入了
    信息增益准则。后来他把这个工作整理出来在1979年发表,这就是著名的ID3算法。
    1986年Machine Learning 杂志创刊,昆兰应邀在创刊号上重新发表了ID3算法,掀起了决策树研究的
    浪潮。短短几年间众多决策树算法问世,ID4、ID5等名字迅速被其他研究者提出算法占用,昆兰只好将自己
    的ID3后续算法命名为ID4.0,在此基础上进一步提出了著名的C4.5。有趣的是,昆兰自称C4.5仅是对C4.0
    做了一些小改进,因此将它命名为 “第4.5代分类器”,而将后续的商业化版本称为C4.5(故事摘自
    《机器学习》 by 周志华)。

    决策树算法原理

    一个简单的生活中的例子

    举一个现实生活中最普遍的例子,就拿小学生谈恋爱来说吧,不,是大学生谈恋爱。每一个女孩都想要找一个
    她自己心目中的白马王子在小学(不,是大学)的校园里谈一场美好的恋爱,在人生的后半段相互扶持。当然了,每个
    男生也想找一个白雪公主谈一场无关金钱利益的恋爱。搞gay的除外,不太好去讲,因为不太来了解,我的生活中还真就没有
    遇到过。那么在挑选白马王子的过程中,每个人在自己的心目中建立了一棵决策树。比如说,我就想找一个帅的就行了,其他
    条件没有,恭喜你,可以联系我了。如果只有帅这样一个标准的话,那么你的决策树就只有一层,类似这样

    如果你要求长得帅、皮肤白、身高180、均分90+、会打篮球的才可以和你谈恋爱,那可就要精挑细选了,你心目中
    的决策树就会有很多层。类似这样

    看到这里我们应该大概知道决策树是怎么一回事了,但是真正用决策树的这种思想和算法去进行分类,我们用计算机
    是怎样编程的呢?我们进行下一阶段的内容

    上面举的例子只是帮助我们更直观的理解决策树的原理,但现实中绝对不会像例子中那么简单,需要考虑的不仅仅表面上
    的客观条件,当然还要看对方能不能和你合得来,这个就比较复杂了,性格呀、感觉呀、爱情啊、好多变量是无法量化
    的,所以上面的例子大家不要认真,千万别去问你心目中的女神找男朋友的决策树是怎样建立的,如果你问了,我敢保证,
    你应该是不能谈恋爱的那个集合中的一个。

    算法的数学原理

    DecisionTree算法没有过多的数学原理,如果说有的话,就是在划分选择那里不同的划分选择会有不同形式的计算
    方式。。决策树中的主要数学知识源于信息论理论。就是著名的科学家香农提出并作出重要贡献的信息论。

    划分选择

    1. 信息增益(ID3算法)
      信息熵是度量样本集合纯度最常用的一种指标。源于信息论,如果学过信息论的同学就很容易理解了,没有学过
      信息论的同学可以借一本信息论基础的书籍都会有介绍。有些教程会说如果对数学原理不是很感兴趣,或者不能
      理解数学公式的话可以跳过这一节,但是我不建议这样做,其实所有的知识都是由一个一个知识点组成的,特别
      难的问题可能只是它的知识点比较多,这个时候不要逃避,去攻克一个又一个的小知识点我们才能有所成长。比如
      这里的信息熵我们可以花上两个小时读一下信息论的知识,就会对整个决策树算法有了不同的理解方式,如果总是
      逃避自己没有学过的知识那进步是非常缓慢的,我们要对未知的知识怀有挑战心,而不是畏惧心。这不仅是我给大
      家的建议,同时也是给我自己的督促,大部分的时候我也会畏惧,我也会懒惰,所以遇到新知识要有征服的欲望而
      不是逃跑,这对我们正在学习任何知识都是必要的。

      闲话少说,回到信息熵。
      信息论中一个离散型随机变量X的熵定义为
      H(X)=−∑x∈Xp(x)log2p(x)H(X)=-\sum_{x\in X}p(x)log_{2}p(x)H(X)=xXp(x)log2p(x)
      p(x)p(x)p(x)表示随机变量X取值为x的概率。信息熵就是信息论中的离散平均自信息量。

      假定当前样本集合U中第k类样本所占总样本树的比例为pkp_kpk, 则集合U的信息量为
      H(U)=−∑k=1npklog2pkH(U)=-\sum_{k=1}^n p_{k}log_{2}p_kH(U)=k=1npklog2pk
      U中的类别越多代表需要确定某种类型所需要的信息量就会越多,也就是H(U)也会越大,这就是信息量的直观理解

      假定某一离散属性用A表示,假设A表示的是人的身高段位,A可能的取值4个(认为划分),假设有分别是(a1,a2,a3,a4)(a_1, a_2, a_3, a_4)(a1,a2,a3,a4),分别表示150以下、150-170、170-180、180以上。若使用属性A对集合U进行划分,那么就会产生4个分支节点,
      第i个分支节点包含U中样本AiA^iAi个,这AiA^iAi个样本组成了一个新的集合计为UiU^iUi。我们可以根据上面计算
      信息熵的公式计算出UiU^iUi的信息量,怎么计算呢?假设身高在180以上的集合也就是U4U^4U4总共有20人,其中女
      神中意的有2个,不中意的有18个,那么该集合按照中意这个标准的随机变量获得的信息量就是
      −(220log2220+1820log21820)-(\frac{2}{20}log_{2}\frac{2}{20}+\frac{18}{20}log_{2}\frac{18}{20})(202log2202+2018log22018)
      同样的也可以求出其他分支集合的信息熵。
      于是可计算出用属性A对样本U进行划分所获得信息增益(Information gain)
      定义如下
      IG(U,A)=H(U)−∑i=14∣Ui∣∣U∣H(Ui)IG(U,A)=H(U)-\sum_{i=1}^{4}\frac{|U^i|}{|U|}H(U^i)IG(U,A)=H(U)i=14UUiH(Ui)
      其中∣Ui∣|U^i|Ui表示属于第i个分支中的样本数。一般而言,IG越大,意味着使用属性A进行划分获得的划分效果就越
      好,因此我们可用信息增益来进行决策树的划分属性选择,著名的ID3决策树学习算法就是以信息争议为准则来选择
      划分属性。

    2. 信息增益率(C4.5)
      实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种票好可能带来的不利影响,可以不直接使用
      信息增益,而是使用信息增益率来选择最优的划分属性。
      信息增益率(Information gain ratio)的定义如下:
      IGR(U,A)=IG(U,a)IV(A)IGR(U,A)=\frac{IG(U,a)}{IV(A)}IGR(U,A)=IV(A)IG(U,a)
      其中IV(A)=−∑i=1n∣Ui∣∣U∣log2∣Ui∣∣U∣IV(A)=-\sum_{i=1}^{n}\frac{|U^i|}{|U|}log_{2}\frac{|U^i|}{|U|}IV(A)=i=1nUUilog2UUi
      称为属性A的固有值,属性A的可能取值数目越多,则IV(A)就会越大。增益率准则不是直接选取增益率最大的候选划分
      属性,而是使用一种启发式先从候选划分属性中找到信息怎以高于平均水平的属性,再从中选择增益率最高的。

    3. 基尼指数(CART)
      CART决策树使用了基尼指数来选择划分属性。基尼系数是1943年美国经济学家阿尔伯特·赫希曼根据洛伦兹曲线所定义的
      判断收入分配公平程度的指标。基尼系数是比例数值,在0和1之间,是国际上用来综合考察居民内部收入分配差异状况的
      一个重要分析指标。关于这部分内容可以参考
      Classification_and_Regression_Trees
      这本书里有详细介绍,这里不做为重点讨论。

    总之,上述三种算法的整体思想是一样的,就是通过划分属性来一步一步构建决策树,不同的地方在于划分的方法有所差异,我们在编程序过程中就可以根据不同的划分标准使用不同的函数。但整体的思路不变。

    剪枝处理

    剪枝是决策树学习算法解决“过拟合”问题的主要手段。在决策树学习中,也就是决策树的构建过程中,为了尽量
    正确分类训练样本,结点划分过程将不断重复,有时候会造成分支过多,这时就是过拟合了,在神经网络学习过程
    中可以通过提前结束训练或正则化方法来解决过拟合问题,在决策树学习中通常采用剪枝操作。剪枝操作又分为两种情况:预剪枝和后剪枝。下面分别阐述这两种方法。
    
    1. 预剪枝
      预剪枝是指在决策树生成过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化能力的
      提升,则停止划分,将当前节点标记为叶子节点。如何判断泛化性能提升呢?可以利用机器学习算法的评估方法(如
      留出法)对剪枝前和剪枝后的性能进行评估,如果剪枝可以提高学习器的泛化性能,那么就进行剪枝操作,否则不进
      行剪枝操作。
    2. 后剪枝
      后剪枝先从训练集中生成一棵完整的决策树,然后分别考虑各个节点,如果去掉该节点后的决策树泛化能力更强那就
      将此节点去掉即进行了剪枝操作,反之不进行剪枝操作。

    以一个实例来进行讲解算法

    C++实现

    经过上面的原理介绍和细节的探讨估计大家已经指导决策树是怎样进行目标分类的了。
    这里面我构建了一个DecisionTree的类,

    DecisionTree说明文档

    class DedisionTree
    {
    public:
            struct Attr    //每一列的属性
            {
                int colIndex;
                string Attribute;
                int typeNum;   //属性取值的个数
                vector<string> AttributeValue;
                map<string, unsigned char>  typeMap; //属性取值对应的整数值;
            };
            struct TreeNode
            {   //节点信息
                string Attribute;   //此节点对应的属性
                bool LeafNode; //如果是叶子节点,此值反映分类结果。 //其他情况都是0;
                vector<TreeNode*> children; //孩子节点的地址。
                map<string, TreeNode*> AttributeLinkChildren;  
                //属性指向孩子节点,也就是对应的树形结构中的树枝
            };     
           //attributes
            cv::Mat trainDataMat;
            vector<vector<string>> predictedDataMat;
            //MatInfo trainMatrixInfo;
            TreeNode *root;  //根节点
            vector<Attr> vectorAttr; //存储所有的矩阵信息,但不存储矩阵。
    
            //functions
            DecisionTree();    //默认构造函数
            int ReadTrainDataFile(string fileAddress);  //数据预处理
            TreeNode* BuildTree(cv::Mat &data, vector<Attr> &dataAttr, string AlgorithmName); 
            // 指定是哪种算法
            vector<vector<string>> ReadPredictedDataFile(string fileAddreess);
            vector<string> Predicted(TreeNode* root, vector<vector<string>> &pData);  
            //返回值为int类型表示数据的分类。
            ~DecisionTree();
    }
    

    TreeNode
    TreeNode 结构体用来存储树的节点信息, Attribute 是std::string类型的数据用来存储当前节点的属性名称,如果该节点是中间节点(分支节点),那么该值就是对应的属性名称,如果该节点是叶子节点,那么该值就是对应的分类结果。
    **Attr **
    Attr 结构体用来存储每一种属性的信息,包括这种属性有多少种不同的离散值,如下表所示表示根据不同的信息得出是否去打高尔夫的简单数据,以第一列数据为例,第一列表示天气属性,那么这一列信息对应着一个Attr结构,Attribute在这里的值就是Outlook,LeafNode及是标志,是否为叶子节点,如果是叶子节点,那么Attr存储的是最后一行分类的某个结果,比如说yes,children存储的是孩子节点的地址,AttributeLinkChildren存储的是孩子节点和属性值的映射关系,仍然以第一列数据为例,如果Outlook的结果是sunny那么此时指向sunny对应的叶子节点的地址。

    trainDataMat
    cv::Mat trainDataMat 存储训练集的数据,此结构由函数ReadTrainDataFile()生成

    predictedDataMat
    vector<vector<string> > predictedDataMat存储的是待预测的数据矩阵,此矩阵由vector<vector<string>> ReadPredictedDataFile()函数生成

    root
    TreeNode *root 该属性存储决策树的根节点地址

    vectorAttr
    vector<Attr> vectorAttr; 存储所有的属性信息

    DecisionTree() 默认构造函数

    ReadTrainDataFile()
    int ReadTrainDataFile(string fileAddress)
    此函数执行读取训练数据的功能,输入值为待训练的数据集的地址,数据集的文件要求是必须为csv文件,关于csv文件参考百度百科 并且第一行的属性名称行是不能省略的,如下图的红色部分。此函数内部运行结束直接生成trainDataMat和vectorAttr数据,这两个数据在后面的操作中非常重要。

    BuildTree()
    TreeNode* BuildTree(cv::Mat &data, vector<Attr> &dataAttr, string AlgorithmName)
    此函数用于生成决策树,函数的返回值是决策树根节点的地址,需要将此值返回给root属性,留给后面的预测时使用。

    • data 是训练集数据,类型为OpenCV中的Mat类型,对应类中的trainDataMat
    • dataAttr 是训练数据的属性信息,对应类中的vectorAttr
    • AlgorithmName 是需要指定的决策树划分节点属性类型的方法,这个类中只支持ID3、C4_5、和Gini这三种方法。

    ReadPredictedDataFile()
    vector<vector<string>> ReadPredictedDataFile(string fileAddreess);
    此函数执行读取待预测数据信息的功能,函数输入为待预测的数据,输出为字符串格式的矩阵。同样该文件是csv文件格式,但和ReadTrainDataFile有所差别就是该数据集不需要第一行的属性信息,如果有第一行的属性信息程序可能会出错,同时也不需要最后一列的标签列,对应的该矩阵的列数一定比训练矩阵的列数少1,行数没有限制。此函数输入的文件格式如下图,

    Predicted()
    vector<string> Predicted(TreeNode* root, vector<vector<string>> &pData)
    此函数执行预测的功能,函数的输入参数包括根节点地址root和预测数据矩阵pData。

    Example

    下面是简单的应用举例

    输入数据说明

    该类的两次输入分别是训练集和预测的测试集,并且都是csv格式的文件,此外目前算法只支持离散数据的分类,对于连续性数据不能使用,且每一列的属性个数不得多于255种,这是因为在程序设计中,每一列的数据个数的这个属性是采用uchar数据类型,所以不能多于255种,当然我们也可以根据自己的实际情况进行更改。程序的执行流程如下图所示

        //生成决策树对象
        DecisionTree myDecisionTree; 
        //读取训练集数据并对训练数据进行操作
        myDecisionTree.ReadTrainDataFile("data.csv");  
        //构建决策树,需要指明决策树划分的方法:ID3、C4.5、CART这三种
        myDecisionTree.root = myDecisionTree.BuildTree(myDecisionTree.trainDataMat, myDecisionTree.vectorAttr, "ID3");
        //
        vector<string> result;
        vector<vector<string>> predictedData;
        //对待预测数据进行读取并进行处理
        predictedData = myDecisionTree.ReadPredictedDataFile("pre.csv");
        //预测结果
        result = myDecisionTree.Predicted(myDecisionTree.root, predictedData);
    

    在最后一步的预测中也可以不额外开辟 predictedData数据,因为在ReadPredictedDataFile()函数执行过程中已经备份一份数据到对象的predictedDataMat属性中,所以按照下面的方法会节省空间和时间
    result = myDecisionTree.Predicted(myDecisionTree.root, myDecisionTree.predictedDataMat);直接调用对象中的数据即可。

    ~DecisionTree()
    ~DecisionTree() 为构析函数

    总结程序的优缺点

    最开始的版本我刚刚开始学习C++,所以对于内存溢出的问题还不是特别敏感,所以在DecisionTree 类中动态开辟的内存空间都没有手动释放掉,主要是决策树的构建过程中开辟了许多堆空间,所以最终的版本需要加一个DestroyTree()函数将构建决策树过程中手动开辟的内存空间都释放掉。将内存泄漏的问题解决掉。还有程序中我遗留了四个问题 1.C4.5算法 2.CART算法 3.预剪枝 4. 后剪枝 这4个部分我还没有完成,我会慢慢完善所有功能,目前的版本只支持了ID3算法,其他算法也预留了函数位置,但是函数是空的,在调用过程中肯定会出错。

    程序运行实例

    #include "DecisionTree.hpp"
    int main()
    {
    	string fileAddress;
    	cout << "请输入文件的地址:";
    	cin >> fileAddress;
    	//cout << sizeof(unsigned int) << endl;
    	DecisionTree myDecisionTree;
    	myDecisionTree.ReadTrainDataFile(fileAddress);
    	myDecisionTree.root = myDecisionTree.BuildTree(myDecisionTree.trainDataMat, myDecisionTree.vectorAttr, "ID3");
    
        //查看经过处理的样本矩阵
    	// cout << myDecisionTree.dataMat << endl;
    	cv::FileStorage fs("out.yml", cv::FileStorage::WRITE);
    	int t = int(myDecisionTree.vectorAttr.size());
    	for (int i = 0; i < t; i++)
    	{
    		fs << "Attribute" << myDecisionTree.vectorAttr[i].Attribute;
    		fs << "typeNum" << myDecisionTree.vectorAttr[i].typeNum;
    		// fs << "AttribureValue";
    		for (int j = 0; j < myDecisionTree.vectorAttr[i].AttributeValue.size(); j++)
    		{
    			fs << "value "<< myDecisionTree.vectorAttr[i].AttributeValue[j];
    		}
    	}
    	fs << "dataMat" << myDecisionTree.trainDataMat;
    	fs.release();
    
        //进行预测
    	vector<string> result;
    	vector<vector<string>> predictedData;
    	predictedData = myDecisionTree.ReadPredictedDataFile("pre.csv");
    	result = myDecisionTree.Predicted(myDecisionTree.root, predictedData);
    	cout << "预测的结果如下:" << endl;
    	for (int i = 0; i < result.size(); i++)
    	{
    		cout << result[i] << endl;
    	}
    	system("pause");
    	return 0;
    }
    

    DecisionTree源代码
    如果你是刚刚接触C++也不懂文件的依赖关系,也不懂的怎么用makefile编译,仅仅是想调用一下这个Decision用
    一下的话,我建议你可以把我源代码中的DecisionTree的头文件和cpp文件放到你的工程里,然后include 头文件即可。

    在下才疏学浅,很多地方还需要做的更好,如果有任何建议,请不吝赐教,我的昵称是PiggyGaGa,名为小猪嘎嘎。git同名。
    欢迎留言。文章中有些内容借鉴周志华老师的西瓜书中的内容,仅当学习使用。
    掌管天堂的空之王者,于地狱唱响荣光之歌!

    展开全文
  • 软件开发学好算法的重要性

    千次阅读 2019-01-08 20:51:49
    程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点。 很多人觉得像人工智能、数据搜索与挖掘这样高薪的工作才用得上算法,觉得算法深不可测。但是这些其实都不是具体的...
  • c/c++到底能做什么

    千次阅读 2010-03-14 14:54:00
    这两天学习C++累了,看了很多的网站论坛,突然感觉迷茫了,c/c++到底能做什么呢?现在JAVA很热,也很好找工作,而且起来还听说很容易入门。不用计算机基础类的知识,可C/C++就不同了,只编程还不行,还得...
  • Ceph学习之Crush算法—— 整体介绍

    万次阅读 2015-07-30 14:36:12
    这篇博文主要回答三个问题:什么是CRUSH?它能做什么?它是怎么工作的?
  • 编者按:当初学者第一次接触机器算法时,直观了解算法正在做什么是一项非常重要的任务,这也是论智一直推崇可视化方法的原因之一。虽然初级算法的数学计算并不难掌握,但当他们一看到满篇的数学理论和符号,学习下去...
  • 排序算法 随笔

    2015-08-29 21:58:49
    一直在换,我也不知道我喜欢干什么,也一直在思考我能做什么,我一直想我想要什么生活,我不知道。我也一直思考N年之久我还记得计算机方面什么东西,我想想只有算法吧?新的工作做APP,1年多没做,很多新的知识...
  • 数据结构与算法

    千次阅读 2021-01-06 20:07:26
    了几个项目,现在比较火的技术基本都过了,仅仅停留在会用的阶段,自己基础太薄弱了,前几年基本没学习,现在离秋招还有几个月时间想把基础过一遍,边边记一下笔记,希望各位2021届毕业生都找到自己满意的...
  • 前言非常欣慰的看到如今越来越多的运维人员也开始开发了,it's a good sign, 毕竟行业大势不可违,我依然坚信,不出3年,不会开发的运维连工作都找不到,很多人可能依然嗤之以鼻,就像3年前我呼吁运维的一定要会...
  • 新一届的挑战杯已经开始,在大二这个传说中最出成绩的时间段,我也不禁为自己捏一把冷汗,我能够什么?有时候不仅仅只是个人的技术能力问题,而是说这个世界需要你的地方何在?我觉得如果能够实现从事自己喜欢...
  • 新一届的挑战杯已经开始,在大二这个传说中最出成绩的时间段,我也不禁为自己捏一把冷汗,我能够什么?有时候不仅仅只是个人的技术能力问题,而是说这个世界需要你的地方何在?我觉得如果能够实现从事自己喜欢...
  • 详细解释数据挖掘的十大算法

    千次阅读 2017-09-22 12:07:45
    一旦你知道了这些算法是什么、怎么工作能做什么、在哪里能找到,我希望你能把这篇博文当做一个跳板,学习更多的数据挖掘知识。 还等什么?这就开始吧! 1.C4.5算法 C4.5是做什么的?C4.5 以决策树的...
  • 什么有些人刷刷LeetCode就Offer拿到手软,而有些人LeetCode滚瓜烂熟,项目也了一两个,还找不到工作呢? 我参加校招也参加几年了,今天我们跟大家讲讲大学生校招到底需要什么能力? 记得帮我点赞哦。 一...
  • 程序设计一 算法与流程图 时间2017.9.06 一计算机是生活的必需品 二什么时候需要编程 三学习编程的目的 一计算机与编程 理解计算机是怎么工作的知道计算机能做什么擅长什么 一人是怎么工作的 二计算机是怎么工作的 ...
  • 之前大学完了《数据结构》、《操作系统》、《组成原理》等课程,马上面临找工作面试等问题。在学长学姐的推荐下 我了解到了leetcode这个网站,诚然,这个网站对学习算法是很有帮助的。于是我开始上面的题,顺便...
  • 不止于此,学习和练习算法锻炼人的思维能力,不管你做什么事都会有潜移默化的影响。所以,总之一句话,让我们现在就开始学习算法吧! 今年实习生招聘差不多也接近尾声了,各大厂的笔试题目在网上都找到。今天...
  • 详细解释数据挖掘中的10大算法

    千次阅读 2015-09-07 20:39:02
    一旦你知道了这些算法是什么、怎么工作能做什么、在哪里能找到,我希望你能把这篇博文当做一个跳板,学习更多的数据挖掘知识。 还等什么?这就开始吧! 1.C4.5算法 C4.5是做什么的?C4.5 以决策树的...
  • 在一份调查问卷中,三...一旦你知道了这些算法是什么、怎么工作能做什么、在哪里能找到,我希望你能把这篇博文当做一个跳板,学习更多的数据挖掘知识。 还等什么?这就开始吧! 1.C4.5算法 C4.5是
  • 想初步了解下怎样数据挖掘,看到一篇不错的文章转载过来啦~...一旦你知道了这些算法是什么、怎么工作能做什么、在哪里能找到,我希望你能把这篇博文当做一个跳板,学习更多的数据挖掘知识。 还等什么?这就开始吧...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 487
精华内容 194
关键字:

学算法能做什么工作