• 作者:谢科链接:https://www.zhihu.com/question/20899988/answer/24923424来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 “入门”是良好的动机,但是可能作用缓慢。如果你...
    作者:谢科
    链接:https://www.zhihu.com/question/20899988/answer/24923424
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    “入门”是良好的动机,但是可能作用缓慢。如果你手里或者脑子里有一个项目,那么实践起来你会被目标驱动,而不会像学习模块一样慢慢学习。

    另外如果说知识体系里的每一个知识点是图里的点,依赖关系是边的话,那么这个图一定不是一个有向无环图。因为学习A的经验可以帮助你学习B。因此,你不需要学习怎么样“入门”,因为这样的“入门”点根本不存在!你需要学习的是怎么样做一个比较大的东西,在这个过程中,你会很快地学会需要学会的东西的。当然,你可以争论说需要先懂python,不然怎么学会python做爬虫呢?但是事实上,你完全可以在做这个爬虫的过程中学习python :D

    看到前面很多答案都讲的“术”——用什么软件怎么爬,那我就讲讲“道”和“术”吧——爬虫怎么工作以及怎么在python实现。

    先长话短说summarize一下:
    你需要学习
    1. 基本的爬虫工作原理
    2. 基本的http抓取工具,scrapy
    3. Bloom Filter: Bloom Filters by Example
    4. 如果需要大规模网页抓取,你需要学习分布式爬虫的概念。其实没那么玄乎,你只要学会怎样维护一个所有集群机器能够有效分享的分布式队列就好。最简单的实现是python-rq:
    5. rq和Scrapy的结合:darkrho/scrapy-redis · GitHub
    6. 后续处理,网页析取(grangier/python-goose · GitHub),存储(Mongodb)

    以下是短话长说:

    说说当初写的一个集群爬下整个豆瓣的经验吧。

    1)首先你要明白爬虫怎样工作。
    想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。

    在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。

    突然你发现, 在国内新闻这个页面上,有一个链接链回“首页”。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。

    好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。

    那么在python里怎么实现呢?
    很简单
    import Queue
    
    initial_page = "http://www.renminribao.com"
    
    url_queue = Queue.Queue()
    seen = set()
    
    seen.insert(initial_page)
    url_queue.put(initial_page)
    
    while(True): #一直进行直到海枯石烂
        if url_queue.size()>0:
            current_url = url_queue.get()    #拿出队例中第一个的url
            store(current_url)               #把这个url代表的网页存储好
            for next_url in extract_urls(current_url): #提取把这个url里链向的url
                if next_url not in seen:      
                    seen.put(next_url)
                    url_queue.put(next_url)
        else:
            break
    

    写得已经很伪代码了。

    所有的爬虫的backbone都在这里,下面分析一下为什么爬虫事实上是个非常复杂的东西——搜索引擎公司通常有一整个团队来维护和开发。

    2)效率
    如果你直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容。更别说Google这样的搜索引擎需要爬下全网的内容了。

    问题出在哪呢?需要爬的网页实在太多太多了,而上面的代码太慢太慢了。设想全网有N个网站,那么分析一下判重的复杂度就是N*log(N),因为所有网页要遍历一次,而每次判重用set的话需要log(N)的复杂度。OK,OK,我知道python的set实现是hash——不过这样还是太慢了,至少内存使用效率不高。

    通常的判重做法是怎样呢?Bloom Filter. 简单讲它仍然是一种hash的方法,但是它的特点是,它可以使用固定的内存(不随url的数量而增长)以O(1)的效率判定url是否已经在set中。可惜天下没有白吃的午餐,它的唯一问题在于,如果这个url不在set中,BF可以100%确定这个url没有看过。但是如果这个url在set中,它会告诉你:这个url应该已经出现过,不过我有2%的不确定性。注意这里的不确定性在你分配的内存足够大的时候,可以变得很小很少。一个简单的教程:Bloom Filters by Example

    注意到这个特点,url如果被看过,那么可能以小概率重复看一看(没关系,多看看不会累死)。但是如果没被看过,一定会被看一下(这个很重要,不然我们就要漏掉一些网页了!)。 [IMPORTANT: 此段有问题,请暂时略过]


    好,现在已经接近处理判重最快的方法了。另外一个瓶颈——你只有一台机器。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈的话,那么你只有加快这个速度。用一台机子不够的话——用很多台吧!当然,我们假设每台机子都已经进了最大的效率——使用多线程(python的话,多进程吧)。

    3)集群化抓取
    爬取豆瓣的时候,我总共用了100多台机器昼夜不停地运行了一个月。想象如果只用一台机子你就得运行100个月了...

    那么,假设你现在有100台机器可以用,怎么用python实现一个分布式的爬取算法呢?

    我们把这100台中的99台运算能力较小的机器叫作slave,另外一台较大的机器叫作master,那么回顾上面代码中的url_queue,如果我们能把这个queue放到这台master机器上,所有的slave都可以通过网络跟master联通,每当一个slave完成下载一个网页,就向master请求一个新的网页来抓取。而每次slave新抓到一个网页,就把这个网页上所有的链接送到master的queue里去。同样,bloom filter也放到master上,但是现在master只发送确定没有被访问过的url给slave。Bloom Filter放到master的内存里,而被访问过的url放到运行在master上的Redis里,这样保证所有操作都是O(1)。(至少平摊是O(1),Redis的访问效率见:LINSERT – Redis)


    考虑如何用python实现:
    在各台slave上装好scrapy,那么各台机子就变成了一台有抓取能力的slave,在master上装好Redis和rq用作分布式队列。


    代码于是写成
    #slave.py
    
    current_url = request_from_master()
    to_send = []
    for next_url in extract_urls(current_url):
        to_send.append(next_url)
    
    store(current_url);
    send_to_master(to_send)
    
    #master.py
    distributed_queue = DistributedQueue()
    bf = BloomFilter()
    
    initial_pages = "www.renmingribao.com"
    
    while(True):
        if request == 'GET':
            if distributed_queue.size()>0:
                send(distributed_queue.get())
            else:
                break
        elif request == 'POST':
            bf.put(request.url)
            
    


    好的,其实你能想到,有人已经给你写好了你需要的:darkrho/scrapy-redis · GitHub

    4)展望及后处理
    虽然上面用很多“简单”,但是真正要实现一个商业规模可用的爬虫并不是一件容易的事。上面的代码用来爬一个整体的网站几乎没有太大的问题。

    但是如果附加上你需要这些后续处理,比如
    1. 有效地存储(数据库应该怎样安排)
    2. 有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的大民日报都爬一遍)
    3. 有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,“朝阳区奋进路中华道”),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛...
    4. 及时更新(预测这个网页多久会更新一次)

    如你所想,这里每一个点都可以供很多研究者十数年的研究。虽然如此,
    “路漫漫其修远兮,吾将上下而求索”。

    所以,不要问怎么入门,直接上路就好了:)
    展开全文
  • 从零开始掌握Python机器学习:十四步教程 - 知乎专栏Python 可以说是现在最流行的机器学习语言,而且你也能在网上找到大量的资源。你现在也在考虑从 Python 入门机器学习吗?本教程或许能帮你成功上手,从 0 到 1 ...

    从零开始掌握Python机器学习:十四步教程 - 知乎专栏

    Python 可以说是现在最流行的机器学习语言,而且你也能在网上找到大量的资源。你现在也在考虑从 Python 入门机器学习吗?本教程或许能帮你成功上手,从 0 到 1 掌握 Python 机器学习,至于后面再从 1 到 100 变成机器学习专家,就要看你自己的努力了。本教程原文分为两个部分,机器之心在本文中将其进行了整合,原文可参阅:7 Steps to Mastering Machine Learning With Python 和 7 More Steps to Mastering Machine Learning With Python。本教程的作者为 KDnuggets 副主编兼数据科学家 Matthew Mayo。

    「开始」往往是最难的,尤其是当选择太多的时候,一个人往往很难下定决定做出选择。本教程的目的是帮助几乎没有 Python 机器学习背景的新手成长为知识渊博的实践者,而且这个过程中仅需要使用免费的材料和资源即可。这个大纲的主要目标是带你了解那些数量繁多的可用资源。毫无疑问,资源确实有很多,但哪些才是最好的呢?哪些是互补的呢?以怎样的顺序学习这些资源才是最合适的呢?

    首先,我假设你并不是以下方面的专家:

    • 机器学习

    • Python

    • 任何 Python 的机器学习、科学计算或数据分析库

    当然,如果你对前两个主题有一定程度的基本了解就更好了,但那并不是必要的,在早期阶段多花一点点时间了解一下就行了。

    基础篇

    第一步:基本 Python 技能

    如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。幸运的是,因为 Python 是一种得到了广泛使用的通用编程语言,加上其在科学计算和机器学习领域的应用,所以找到一个初学者教程并不十分困难。你在 Python 和编程上的经验水平对于起步而言是至关重要的。

    首先,你需要安装 Python。因为我们后面会用到科学计算和机器学习软件包,所以我建议你安装 Anaconda。这是一个可用于 Linux、OS X 和 Windows 上的工业级的 Python 实现,完整包含了机器学习所需的软件包,包括 numpy、scikit-learn 和 matplotlib。其也包含了 iPython Notebook,这是一个用在我们许多教程中的交互式环境。我推荐安装 Python 2.7。

    如果你不懂编程,我建议你从下面的免费在线书籍开始学习,然后再进入后续的材料:

    如果你有编程经验,但不懂 Python 或还很初级,我建议你学习下面两个课程:

    • 谷歌开发者 Python 课程(强烈推荐视觉学习者学习):suo.im/toMzq

    • Python 科学计算入门(来自 UCSB Engineering 的 M. Scott Shell)(一个不错的入门,大约有 60 页):suo.im/2cXycM

    如果你要 30 分钟上手 Python 的快速课程,看下面:

    当然,如果你已经是一位经验丰富的 Python 程序员了,这一步就可以跳过了。即便如此,我也建议你常使用 Python 文档:Welcome to Python.org

    第二步:机器学习基础技巧

    KDnuggets 的 Zachary Lipton 已经指出:现在,人们评价一个「数据科学家」已经有很多不同标准了。这实际上是机器学习领域领域的一个写照,因为数据科学家大部分时间干的事情都牵涉到不同程度地使用机器学习算法。为了有效地创造和获得来自支持向量机的洞见,非常熟悉核方法(kernel methods)是否必要呢?当然不是。就像几乎生活中的所有事情一样,掌握理论的深度是与实践应用相关的。对机器学习算法的深度了解超过了本文探讨的范围,它通常需要你将非常大量的时间投入到更加学术的课程中去,或者至少是你自己要进行高强度的自学训练。

    好消息是,对实践来说,你并不需要获得机器学习博士般的理论理解——就想要成为一个高效的程序员并不必要进行计算机科学理论的学习。

    人们对吴恩达在 Coursera 上的机器学习课程内容往往好评如潮;然而,我的建议是浏览前一个学生在线记录的课堂笔记。跳过特定于 Octave(一个类似于 Matlab 的与你 Python 学习无关的语言)的笔记。一定要明白这些都不是官方笔记,但是可以从它们中把握到吴恩达课程材料中相关的内容。当然如果你有时间和兴趣,你现在就可以去 Coursera 上学习吴恩达的机器学习课程:Machine Learning - Stanford University | Coursera

    除了上面提到的吴恩达课程,如果你还需要需要其它的,网上还有很多各类课程供你选择。比如我就很喜欢 Tom Mitchell,这里是他最近演讲的视频(一起的还有 Maria-Florina Balcan),非常平易近人。

    目前你不需要所有的笔记和视频。一个有效地方法是当你觉得合适时,直接去看下面特定的练习题,参考上述备注和视频恰当的部分,

    第三步:科学计算 Python 软件包概述

    好了,我们已经掌握了 Python 编程并对机器学习有了一定的了解。而在 Python 之外,还有一些常用于执行实际机器学习的开源软件库。广义上讲,有很多所谓的科学 Python 库(scientific Python libraries)可用于执行基本的机器学习任务(这方面的判断肯定有些主观性):

    学习这些库的一个好方法是学习下面的材料:

    在本教程的后面你还会看到一些其它的软件包,比如基于 matplotlib 的数据可视化库 Seaborn。前面提到的软件包只是 Python 机器学习中常用的一些核心库的一部分,但是理解它们应该能让你在后面遇到其它软件包时不至于感到困惑。

    下面就开始动手吧!

    第四步:使用 Python 学习机器学习

    首先检查一下准备情况

    • Python:就绪

    • 机器学习基本材料:就绪

    • Numpy:就绪

    • Pandas:就绪

    • Matplotlib:就绪

    现在是时候使用 Python 机器学习标准库 scikit-learn 来实现机器学习算法了。

    scikit-learn 流程图

    下面许多的教程和训练都是使用 iPython (Jupyter) Notebook 完成的,iPython Notebook 是执行 Python 语句的交互式环境。iPython Notebook 可以很方便地在网上找到或下载到你的本地计算机。

    同样也请注意,以下的教程是由一系列在线资源所组成。如果你感觉课程有什么不合适的,可以和作者交流。我们第一个教程就是从 scikit-learn 开始的,我建议你们在继续完成教程前可以按顺序看一看以下的文章。

    下面是一篇是对 scikit-learn 简介的文章,scikit-learn 是 Python 最常用的通用机器学习库,其覆盖了 K 近邻算法:

    下面的会更加深入、扩展的一篇简介,包括了从著名的数据库开始完成一个项目:

    下一篇关注于在 scikit-learn 上评估不同模型的策略,包括训练集/测试集的分割方法:

    第五步:Python 上实现机器学习的基本算法

    在有了 scikit-learn 的基本知识后,我们可以进一步探索那些更加通用和实用的算法。我们从非常出名的 K 均值聚类(k-means clustering)算法开始,它是一种非常简单和高效的方法,能很好地解决非监督学习问题:

    接下来我们可以回到分类问题,并学习曾经最流行的分类算法:

    在了解分类问题后,我们可以继续看看连续型数值预测:

    我们也可以利用回归的思想应用到分类问题中,即 logistic 回归:

    第六步:Python 上实现进阶机器学习算法

    我们已经熟悉了 scikit-learn,现在我们可以了解一下更高级的算法了。首先就是支持向量机,它是一种依赖于将数据转换映射到高维空间的非线性分类器。

    随后,我们可以通过 Kaggle Titanic 竞赛检查学习作为集成分类器的随机森林:

    降维算法经常用于减少在问题中所使用的变量。主成份分析法就是非监督降维算法的一个特殊形式:

    在进入第七步之前,我们可以花一点时间考虑在相对较短的时间内取得的一些进展。

    首先使用 Python 及其机器学习库,我们不仅已经了解了一些最常见和知名的机器学习算法(k 近邻、k 均值聚类、支持向量机等),还研究了强大的集成技术(随机森林)和一些额外的机器学习任务(降维算法和模型验证技术)。除了一些基本的机器学习技巧,我们已经开始寻找一些有用的工具包。

    我们会进一步学习新的必要工具。

    第七步:Python 深度学习

    神经网络包含很多层

    深度学习无处不在。深度学习建立在几十年前的神经网络的基础上,但是最近的进步始于几年前,并极大地提高了深度神经网络的认知能力,引起了人们的广泛兴趣。如果你对神经网络还不熟悉,KDnuggets 有很多文章详细介绍了最近深度学习大量的创新、成就和赞许。

    最后一步并不打算把所有类型的深度学习评论一遍,而是在 2 个先进的当代 Python 深度学习库中探究几个简单的网络实现。对于有兴趣深挖深度学习的读者,我建议从下面这些免费的在线书籍开始:

    1.Theano

    链接:Welcome - Theano 0.8.2 documentation

    Theano 是我们讲到的第一个 Python 深度学习库。看看 Theano 作者怎么说:

    Theano 是一个 Python 库,它可以使你有效地定义、优化和评估包含多维数组的数学表达式。

    下面关于运用 Theano 学习深度学习的入门教程有点长,但是足够好,描述生动,评价很高:

    2.Caffe 

    链接:Caffe | Deep Learning Framework

    另一个我们将测试驱动的库是 Caffe。再一次,让我们从作者开始:

    Caffe 是一个深度学习框架,由表达、速度和模块性建构,Bwekeley 视觉与学习中心和社区工作者共同开发了 Caf fe。

    这个教程是本篇文章中最好的一个。我们已经学习了上面几个有趣的样例,但没有一个可与下面这个样例相竞争,其可通过 Caffe 实现谷歌的 DeepDream。这个相当精彩!掌握教程之后,可以尝试使你的处理器自如运行,就当作是娱乐。

    我并没有保证说这会很快或容易,但是如果你投入了时间并完成了上面的 7 个步骤,你将在理解大量机器学习算法以及通过流行的库(包括一些在目前深度学习研究领域最前沿的库)在 Python 中实现算法方面变得很擅长。

    进阶篇

    机器学习算法

    本篇是使用 Python 掌握机器学习的 7 个步骤系列文章的下篇,如果你已经学习了该系列的上篇,那么应该达到了令人满意的学习速度和熟练技能;如果没有的话,你也许应该回顾一下上篇,具体花费多少时间,取决于你当前的理解水平。我保证这样做是值得的。快速回顾之后,本篇文章会更明确地集中于几个机器学习相关的任务集上。由于安全地跳过了一些基础模块——Python 基础、机器学习基础等等——我们可以直接进入到不同的机器学习算法之中。这次我们可以根据功能更好地分类教程。

    第1步:机器学习基础回顾&一个新视角

    上篇中包括以下几步:

    1. Python 基础技能

    2. 机器学习基础技能

    3. Python 包概述

    4. 运用 Python 开始机器学习:介绍&模型评估

    5. 关于 Python 的机器学习主题:k-均值聚类、决策树、线性回归&逻辑回归

    6. 关于 Python 的高阶机器学习主题:支持向量机、随机森林、PCA 降维

    7. Python 中的深度学习

    如上所述,如果你正准备从头开始,我建议你按顺序读完上篇。我也会列出所有适合新手的入门材料,安装说明包含在上篇文章中。

    然而,如果你已经读过,我会从下面最基础的开始:

    如果你正在寻找学习机器学习基础的替代或补充性方法,恰好我可以把正在看的 Shai Ben-David 的视频讲座和 Shai Shalev-Shwartz 的教科书推荐给你:

    • Shai Ben-David 的机器学习介绍视频讲座,滑铁卢大学。地址:suo.im/1TFlK6

    • 理解机器学习:从理论到算法,作者 Shai Ben-David & Shai Shalev-Shwartz。地址:suo.im/1NL0ix

    记住,这些介绍性资料并不需要全部看完才能开始我写的系列文章。视频讲座、教科书及其他资源可在以下情况查阅:当使用机器学习算法实现模型时或者当合适的概念被实际应用在后续步骤之中时。具体情况自己判断。

    第2步:更多的分类

    我们从新材料开始,首先巩固一下我们的分类技术并引入一些额外的算法。虽然本篇文章的第一部分涵盖决策树、支持向量机、逻辑回归以及合成分类随机森林,我们还是会添加 k-最近邻、朴素贝叶斯分类器和多层感知器。

    Scikit-learn 分类器

    k-最近邻(kNN)是一个简单分类器和懒惰学习者的示例,其中所有计算都发生在分类时间上(而不是提前在训练步骤期间发生)。kNN 是非参数的,通过比较数据实例和 k 最近实例来决定如何分类。

    朴素贝叶斯是基于贝叶斯定理的分类器。它假定特征之间存在独立性,并且一个类中任何特定特征的存在与任何其它特征在同一类中的存在无关。

    多层感知器(MLP)是一个简单的前馈神经网络,由多层节点组成,其中每个层与随后的层完全连接。多层感知器在 Scikit-learn 版本 0.18 中作了介绍。

    首先从 Scikit-learn 文档中阅读 MLP 分类器的概述,然后使用教程练习实现。

    第3步:更多聚类

    我们现在接着讲聚类,一种无监督学习形式。上篇中,我们讨论了 k-means 算法; 我们在此介绍 DBSCAN 和期望最大化(EM)。

    Scikit-learn聚类算法

    首先,阅读这些介绍性文章; 第一个是 k 均值和 EM 聚类技术的快速比较,是对新聚类形式的一个很好的继续,第二个是对 Scikit-learn 中可用的聚类技术的概述:

    期望最大化(EM)是概率聚类算法,并因此涉及确定实例属于特定聚类的概率。EM 接近统计模型中参数的最大似然性或最大后验估计(Han、Kamber 和 Pei)。EM 过程从一组参数开始迭代直到相对于 k 聚类的聚类最大化。

    首先阅读关于 EM 算法的教程。接下来,看看相关的 Scikit-learn 文档。最后,按照教程使用 Python 自己实现 EM 聚类。

    如果高斯混合模型初看起来令人困惑,那么来自 Scikit-learn 文档的这一相关部分应该可以减轻任何多余的担心:

    高斯混合对象实现期望最大化(EM)算法以拟合高斯模型混合。

    基于密度且具有噪声的空间聚类应用(DBSCAN)通过将密集数据点分组在一起,并将低密度数据点指定为异常值来进行操作。

    首先从 Scikit-learn 的文档中阅读并遵循 DBSCAN 的示例实现,然后按照简明的教程学习:

    第4步:更多的集成方法

    上篇只涉及一个单一的集成方法:随机森林(RF)。RF 作为一个顶级的分类器,在过去几年中取得了巨大的成功,但它肯定不是唯一的集成分类器。我们将看看包装、提升和投票。

    给我一个提升

    首先,阅读这些集成学习器的概述,第一个是通用性的;第二个是它们与 Scikit-learn 有关:

    然后,在继续使用新的集成方法之前,请通过一个新的教程快速学习随机森林:

    包装、提升和投票都是不同形式的集成分类器,全部涉及建构多个模型; 然而,这些模型由什么算法构建,模型使用的数据,以及结果如何最终组合起来,这些都会随着方案而变化。

    • 包装:从同一分类算法构建多个模型,同时使用来自训练集的不同(独立)数据样本——Scikit-learn 实现包装分类器

    • 提升:从同一分类算法构建多个模型,一个接一个地链接模型,以提高每个后续模型的学习——Scikit-learn 实现 AdaBoost

    • 投票:构建来自不同分类算法的多个模型,并且使用标准来确定模型如何最好地组合——Scikit-learn 实现投票分类器

    那么,为什么要组合模型?为了从一个特定角度处理这个问题,这里是偏差-方差权衡的概述,具体涉及到提升,以下是 Scikit-learn 文档:

    • 单一评估器 vs 包装:偏差-方差分解,Scikit-learn 文档。地址:suo.im/3izlRB

    现在你已经阅读了关于集成学习器的一些介绍性材料,并且对几个特定的集成分类器有了基本了解,下面介绍如何从 Machine Learning Mastery 中使用 Scikit-learn 在 Python 中实现集成分类器:

    第5步:梯度提升

    下一步我们继续学习集成分类器,探讨一个当代最流行的机器学习算法。梯度提升最近在机器学习中产生了显著的影响,成为了 Kaggle 竞赛中最受欢迎和成功的算法之一。

    给我一个梯度提升

    首先,阅读梯度提升的概述:

    接下来,了解为什么梯度提升是 Kaggle 竞赛中「最制胜」的方法:

    虽然 Scikit-learn 有自己的梯度提升实现,我们将稍作改变,使用 XGBoost 库,我们提到过这是一个更快的实现。

    以下链接提供了 XGBoost 库的一些额外信息,以及梯度提升(出于必要):

    现在,按照这个教程把所有汇聚起来:

    你还可以按照这些更简洁的示例进行强化:

    第6步:更多的降维

    降维是通过使用过程来获得一组主变量,将用于模型构建的变量从其初始数减少到一个减少数。

    有两种主要形式的降维:

    • 1. 特征选择——选择相关特征的子集。地址:Feature selection

    • 2. 特征提取——构建一个信息性和非冗余的衍生值特征集。地址:Feature extraction

    下面是一对常用的特征提取方法。

    主成分分析(PCA)是一种统计步骤,它使用正交变换将可能相关变量的一组观测值转换为一组称为主成分的线性不相关变量值。主成分的数量小于或等于原始变量的数量。这种变换以这样的方式定义,即第一主成分具有最大可能的方差(即考虑数据中尽可能多的变率)

    以上定义来自 PCA 维基百科条目,如果感兴趣可进一步阅读。但是,下面的概述/教程非常彻底:

    线性判别分析(LDA)是 Fisher 线性判别的泛化,是统计学、模式识别和机器学习中使用的一种方法,用于发现线性组合特征或分离两个或多个类别的对象或事件的特征。所得到的组合可以用作线性分类器,或者更常见地,用作后续分类之前的降维。

    LDA 与方差分析(ANOVA)和回归分析密切相关,它同样尝试将一个因变量表示为其他特征或测量的线性组合。然而,ANOVA 使用分类独立变量和连续因变量,而判别分析具有连续的独立变量和分类依赖变量(即类标签)。

    上面的定义也来自维基百科。下面是完整的阅读:

    你对 PCA 和 LDA 对于降维的实际差异是否感到困惑?Sebastian Raschka 做了如下澄清:

    线性判别分析(LDA)和主成分分析(PCA)都是通常用于降维的线性转换技术。PCA 可以被描述为「无监督」算法,因为它「忽略」类标签,并且其目标是找到使数据集中的方差最大化的方向(所谓的主成分)。与 PCA 相反,LDA 是「监督的」并且计算表示使多个类之间的间隔最大化的轴的方向(「线性判别式」)。

    有关这方面的简要说明,请阅读以下内容:

    • LDA 和 PCA 之间的降维有什么区别?作者 Sebastian Raschka。地址:Machine Learning FAQ

    第 7 步:更多的深度学习

    上篇中提供了一个学习神经网络和深度学习的入口。如果你的学习到目前比较顺利并希望巩固对神经网络的理解,并练习实现几个常见的神经网络模型,那么请继续往下看。

    首先,看一些深度学习基础材料:

    接下来,在 Google 的机器智能开源软件库 TensorFlow(一个有效的深度学习框架和现今几乎是最好的神经网络工具)尝试一些简明的概述/教程:

    最后,直接从 TensorFlow 网站试用这些教程,它实现了一些最流行和常见的神经网络模型:

    此外,目前一篇关于 7 个步骤掌握深度学习的文章正在写作之中,重点介绍使用位于 TensorFlow 顶部的高级 API,以增模型实现的容易性和灵活性。我也将在完成后在这儿添加一个链接。

    相关的:


    转载至:从零开始掌握Python机器学习:十四步教程 - 知乎专栏

    展开全文
  •   作者:匿名用户 ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。   以前的雇主,是3-4万人大厂,最核心业务有一个核心大数据系统python写的: 使用各...

    https://www.zhihu.com/question/21017354

     

    作者:匿名用户
    链接:https://www.zhihu.com/question/21017354/answer/503463522
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     

    以前的雇主,是3-4万人大厂,最核心业务有一个核心大数据系统python写的:

    1. 使用各类数据库实时维护的人类最完整某类型文件库,含数亿文档的数十亿文档版本
    2. 各类传统的分析工具、估价、OCR了的文档的错误估算等等等
    3. 各类查询、搜索、阅读、手工分组分类、标注工具等等等
    4. 机器学习的文档分类,全套自己做的,算法部分C++写的,别的都是Python
    5. 对接各类通用或自研大数据分析的接口,对接公司别的平台的各类接口
    6. 各类爬虫,爬整个互联网,在互联网上找出所有相关的信息,匹配起来

    我全程参与,负责1/4/5/6部分,最保守计算,全套50万行python这个量级肯定有的

    做了好几年,离职回国才开始看zhihu,第一次在zhihu上听说python不适合写大项目。当然,也有可能各位口中的大项目都是那种好几百万行上千万行的,那种我倒真没有经验。

    不必说python怎么怎么好,它问题很多,比如:

    1. 慢,真的很慢
    2. 因为慢,很多时候得花时间去做其它语言看起来无谓的“优化”
    3. GIL这种几十年不变的东西,让人对Python社区是否有诚意改进表示怀疑
    4. Unicode支持烂
    5. Python2/3的分裂是教科书级别的悲剧
    6. 部署起来各种奇葩

    但这不改变python写起来飞快、生态完备、在技术够的情况下可折腾的东西特别多等等优点。现在我用Golang最多,回想上面项目部分比如第六项爬虫相关那个,当时用Python做,从头到底几个人一个月时间就上线,我不认为Golang可以这么快。第一版上线一个月完成的东西包括:

    1. ec2上spot instance一个独立的竞价库,在规定的时限、预算目标、爬虫性能预估模型基础上,可以尽力去拍卖竞购所需要的计算资源提供平台。
    2. 爬整个alexa ranking前100万排名的网站的头几层页面,根据其内容选择数万和我们所需要信息相关的网站,把它们全站爬一次。初次爬,要求24小时内出结果。
    3. 一个自己设计的web mining组合算法,从上述爬回来的几个T的数据里挖出我们有价值的某类产品信息。注意,数万网站、数百万网页格式,直接regex/xpath都是完全没有用的。数万网站涉及M个国家、N种语言。
    4. 数据清洗,给出一个自动估算的准确度预测
    5. 和内部一个百万级数据的产品数据库整合,把上述爬回来处理好的数据做成一个“网上如此描述本产品”的功能,展示一段机器通过上述挖掘处理以后的数据的综述。
    6. 和内部一个百万级数据的产品数据库整合,把上述爬回来处理好的数据中出现的却无法匹配到我方内部数据的产品做置信评估,选出数万高置信的,供人工分析、排查并最终。
    7. 每天增量更新上述各项。

    语言永远不核心,工具永远不关键,只有人是关键。

    国内互联网圈子最关键的问题是水平不高,人却自大了。知乎上无意义的讨论某个语言好、某个语言不好,似乎特别起劲。反正cool的东西99%的团队做不出那是肯定的,反正可以来知乎怪语言、怪系统、怪体制,总之都是别人的错,写代码的小白最正确!

    欢迎来怼。我的发言的核心思想就一条:国内互联网圈子这种从来没有成功设计推广过任何一种语言的总体上公认技术落后的团体,成天从python怼到golang,只是在反复给明眼人解释为什么国内技术落后。各主流语言的编译器、runtime、标准库等等都开源了,空谈真的误事,你觉得哪个语言哪个方面不好,请拿出你的解决方案和实现来说话,哪怕你的pull request被否决掉了,请给出详情,大家就事论事看解决方案。还请键盘侠们回归技术人员的淳朴本质,吹骗混蒙的方式开口闭口某个语言怎么怎么有问题,真的很low很丢脸。

     

    很多年轻新入行的朋友评论区的留言让我感觉他们其实是现在行业浮躁氛围的受害者。我没有能力说去一一帮助他们,但愿意提供一些CS PhD毕业全职写代码很多年的过来人的意见:

    1. 语言是有好坏,肯定要有所选择,但除非你是做编译器、标准库等直接语言方向的,过度关注语言就是本末倒置。
    2. 最容易走弯路形成这种本末倒置的原因就是没有自己一个感兴趣且擅长的CS领域。数据库、大数据、分布式、人工智能、机器学习、图形学、UI、操作系统、高性能、安全、理论计算等等等等领域,不去好好选几个自己喜欢的然后持续投入,过度关注语言这种工具,自己亏太大了。
    3. 当你身边有人并非从事语言直接相关的工作,但开口闭口就是这个流行的语言有这样那样毛病,那个小众语言多优美高效,千万要看清楚,此人不是已经走了上述弯路,就是靠谈语言来吹、蒙、混、骗。
    4. 语言不是一个可以长久获得回报的东西。C++在15年前很热,Java/C#在10年前很热,Python热了几年了,Golang这几年开始热了。但你真的只能年轻一次,投入在语言上不值得,成天在网上和人吹Python多烂Golang多差,其实最对不起自己。
    展开全文
  • python爬虫抓取知乎有效问题一、介绍二、原理三、完整代码四、结果展示 一、介绍 平时知乎首页给推的问题有点看腻了,而且推荐算法的味道太重,我想看点不一样的东西,并且要考虑问题的关注量和被浏览量,那就自己...

    一、介绍

    平时知乎首页给推的问题有点看腻了,而且推荐算法的味道太重,我想看点不一样的东西,并且要考虑问题的关注量和被浏览量,那就自己动手爬取吧。

    二、原理

    易发现知乎问题的地址为"https://www.zhihu.com/question/"+一串数字,如下:
    在这里插入图片描述
    但是不是所有数字都可以搜到问题,所以存在一个有效性的问题。

    分析源代码:
    在这里插入图片描述

    关注者量和被浏览量分别被保存在class为“NumberBoard-itemValue”的两个strong标签的title属性里。

    如果是无效地址是不会有这两个量的,所以可以根据关注者量和被浏览量来判断某一地址是否有效,同时这也可以为我们筛选较受关注问题提供依据。

    三、完整代码

    import urllib
    from bs4 import BeautifulSoup
    
    Eff_url=[] #保存有效地址
    f = open('temp.txt','w') #将关注者量或浏览量足够高的问题地址写入文档里,方便以后查看
    
    ######################################定义函数
    def Find_Eff(url):
        html = urllib.urlopen(url)
        bsobj = BeautifulSoup(html.read())
    
        namelist=bsobj.findAll("strong",{"class":"NumberBoard-itemValue"})
    
    #如果是有效地址,namelist应该包含两个元素,分别为关注者量和浏览量的标签
        if len(namelist)>1:
            Eff_url.append(url)
            print url + '\0\0' + namelist[0]['title'] + '\0\0' + namelist[1]['title']
    
    #如果关注者量大于100或浏览量大于10000则判定为较受关注问题,写入文档
            if int(namelist[0]['title']) > 100 or int(namelist[1]['title']) > 10000:
                f.write(url + '\0\0' + namelist[0]['title'] + '\0\0' + namelist[1]['title'])
                f.write('\r\n')
    
        else:
            print url
    ######################################
    
    num = 365224610 #初始数字,可更改
    for i in range(100):
        num += 1
        url = "https://www.zhihu.com/question/" + str(num)
    
        Find_Eff(url)
    
    f.close()
    
    
    

    四、结果展示

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 在浏览打开一个隐私模式的浏览窗口,主要是为了避免浏览器已经保存的cookies的干扰,然后再打开知乎登录页面并打开控制台,故意输错手机号或密码便于观察请求,然后登录 注意红色的名为sing_in的文件,这就是知乎...

    分析登录页面的请求

    在浏览打开一个隐私模式的浏览窗口,主要是为了避免浏览器已经保存的cookies的干扰,然后再打开知乎登录页面并打开控制台,故意输错手机号或密码便于观察请求,然后登录
    在这里插入图片描述
    注意红色的名为sing_in的文件,这就是知乎登录的API接口,也是我们模拟登录的链接。我们需要模拟构建POST请求所需要的Headers和Form-Data这两个对象

    构建 Headers

    在这里插入图片描述
    继续看Requests Headers信息,和登录页面的 GET 请求对比发现,这个 POST 的头部多了三个身份验证字段,经测试x-xsrftoken是必需的,x-xsrftoken则是防 Xsrf 跨站的 Token 认证。首先我们去Cookie里面看一下有没有这个值。
    在这里插入图片描述
    可以看到在Cookie的_xsrf里面找到了这个值,既然在我们未登录的情况下已经有了这个Cookie值,那么服务器肯定在返回的请求中设置了这个Cookie。我们在之前的请求中查找一下。
    在浏览器无Cookie的情况下可以看到

    可以看到在我们访问首页时从Response Headers的Set-Cookie字段中可以找到了这个字段(注意:需要在浏览器没有Cookie的情况下才能看到)。

    构建Form-Data

    在这里插入图片描述

    找出Form-Data的完整键值对

    可以看到Form部分目前已经是加密的,无法再直观看到,登陆url是https://www.zhihu.com/api/v3/oauth/sign_in。那我们可以直接搜 sign_in 试试。搜了发现和上面的 signature 是在同一个JS文件上的,可以在 JS代码 里打断点的方式调试。
    在断点处可以看到传入的Form表单

    然后我们逐个构建上图这些参数:

    经过调试发现会变的就只有timestamp,signature,username,password,captcha这几个字段。

    timestamp 时间戳,这个很好解决,区别是这里是13位整数,Python 生成的整数部分只有10位,需要额外乘以1000

    timestamp = str(int(time.time()*1000))
    

    在这里插入图片描述
    signature 通过 Crtl+Shift+F 搜索找到是在一个 JS 里生成的,是通过 Hmac 算法对几个固定值和时间戳进行加密,那么只需要在 Python 里也模拟一次这个加密即可。

    Python的内置Hmac函数可以非常方便的模拟加密,需要注意的是这里的时间戳需要与后面Form-Data中的时间戳保持一致,否则会登录失败。

        def get_signature(self):
            #伪造signature
            client_id="c3cef7c66a1843f8b3a9e6a1e3160e20"
            sk="d1b964811afb40118a12068ff74a12f4"
            h=hmac.new(sk.encode("utf-8"),digestmod=sha1)
            h.update('password'.encode("utf-8"))
            h.update(client_id.encode("utf-8"))
            h.update("com.zhihu.web".encode("utf-8"))
            h.update(self.timestamp.encode("utf-8"))
            return h.hexdigest()
    

    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    captcha 验证码,是通过 GET 请求单独的 API 接口返回是否需要验证码(无论是否需要,都要请求一次),如果是 True 则需要再次 PUT 请求获取图片的 base64 编码。
    知乎的验证码有两种形式,一种是点击倒立文字,还有一种是英文字符串。这里只实现第二种验证方式。

        def getcapture(self):
            #获取验证码
            message=self.session.get(url="https://www.zhihu.com/api/v3/oauth/captcha?lang=en").json()
            if message["show_captcha"]=="False":
                self.picture=""
            else:
                print("需要验证码")
                while True:
                    self.picture_url=self.session.put(url="https://www.zhihu.com/api/v3/oauth/captcha?lang=en").json()
                    with open("captcha.jpg","wb") as f:
                        f.write(base64.b64decode(self.picture_url["img_base64"]))
                    image=Image.open('captcha.jpg')
                    image.show()
                    self.picture=input("请输入验证码:")
                    time.sleep(2)
                    message1=self.session.post(url="https://www.zhihu.com/api/v3/oauth/captcha?lang=en",data={'input_text':self.picture})
                    # print("{},{}".format(message1.status_code,message1.text))
                    if message1.status_code==201:
                        break
                    else:
                        print("{} 请提交正确的验证码".format(message1.status_code))
    

    加密Form-Data

    现在知乎必须先将 Form-Data 加密才能进行 POST 传递,所以我们还要解决加密问题,可由于我们看到的 JS 是混淆后的代码,想窥视其中的加密实现方式是一件很费精力的事情。

    加密一般都用到 encrypt 名字之类的,可以直接根据这个名字搜。

    通过调试,可以看到,我们需要的加密字符串出来了。

    找出Form-Data的所有加密方法

    在这里插入图片描述
    知道位置后,我们可以直接把这个加密的 js 方法都扣出来,放在一个 html 文件内执行就好。可以将js源码复制到vscode编辑器里查找。
    在这里插入图片描述
    格式化后有400多行,里面全是混淆

    在这里插入图片描述
    为了看看这个正确不正确,我们可以把函数里面的内容直接拿出来,就是去掉最外层的function (module, exports, webpack_require) ,并把exports相关的代码去掉。然后调用下面的函数 b,把我们的 fromdata 传进去
    在这里插入图片描述
    将上面的 JavaScript 弄到一个 html 文件中,放在 script 标签内即可
    在这里插入图片描述
    用浏览器打开就可以看到加密的字符串了。
    接下来就是用Python来操作了。由于这个加密的方法有400多行,还全是混淆,所以用Python来模拟是不太可能的,我们就用Python的 execjs 来执行 JavaScript 代码直接获得就可以了。
    但是这里又会有一个问题,我们用浏览器打开的是为它提供了一个浏览器的运行环境,我们在 python 使用的 execjs 提供的是 node 环境,两个环境的不一样,就会产生不同的效果,下面我们可以选择使用 webstorm 编辑器来提供 nodejs 环境来进行尝试以下。

    修改加密代码

    需要修改的地方有两个
    在这里插入图片描述
    这里它会先去判断有没有 window 这个对象来判断是不是在浏览器上面运行的,所以我们可以直接把它修改成 true 或者其他表示成 true 的值都可以
    在这里插入图片描述
    在这里插入图片描述
    这个 atob 是将 base64 加密的字符串给解密,在 node 环境下是没有这个方法的,我们需要使用 Buffer.toString()替代即可,因为在浏览器上的 base64 加密的是 binary 编码,解密之后也就同样需要使用 binary 编码。
    在这里插入图片描述
    可以看到,成功的模拟出了加密字符串,但是不知道是什么原因我每次模拟出来的加密字符串的末尾都会多出4位没用的字符。所以在Python中调用加密函数得到加密字符串后需要用切片将这4位多余的字符串去掉。

    接下来就是用Python环境测试了
    在这里插入图片描述
    在这里插入图片描述
    注意需要先安装 PyExecJS 库

    登录顺序是先获取Cookie,然后在获取验证码,最后登录。

    下面是完整的Python代码:

    import os
    from urllib import parse
    import requests
    import base64
    import execjs
    from PIL import Image
    import time
    import hmac
    from hashlib import sha1
    
    class zhihu_login(object):
        def __init__(self):
    
            self.session = requests.session()
            self.header = {
    
                "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 Edg/80.0.361.69"
            }
            self.session.headers.update(self.header)
            self.timestamp=None
            self.picture=None
            self.signature=None
            self.picture_url=None
    
    
        def getcapture(self):
            #获取验证码
            message=self.session.get(url="https://www.zhihu.com/api/v3/oauth/captcha?lang=en").json()
            # print(message["show_captcha"])
    
            if message["show_captcha"]=="False":
                self.picture=""
            else:
                print("需要验证码")
                while True:
                    self.picture_url=self.session.put(url="https://www.zhihu.com/api/v3/oauth/captcha?lang=en").json()
                    with open("captcha.jpg","wb") as f:
                        f.write(base64.b64decode(self.picture_url["img_base64"]))
                    image=Image.open('captcha.jpg')
                    image.show()
                    self.picture=input("请输入验证码:")
                    time.sleep(2)
                    message1=self.session.post(url="https://www.zhihu.com/api/v3/oauth/captcha?lang=en",data={'input_text':self.picture})
                    # print("{},{}".format(message1.status_code,message1.text))
                    if message1.status_code==201:
                        break
                    else:
                        print("{} 请提交正确的验证码".format(message1.status_code))
    
        def getcookies(self):
            #获取cookice
            homepage = "https://www.zhihu.com/"
            self.session.post(homepage)
    
        def get_signature(self):
            #伪造signature
            client_id="c3cef7c66a1843f8b3a9e6a1e3160e20"
            sk="d1b964811afb40118a12068ff74a12f4"
            h=hmac.new(sk.encode("utf-8"),digestmod=sha1)
            h.update('password'.encode("utf-8"))
            h.update(client_id.encode("utf-8"))
            h.update("com.zhihu.web".encode("utf-8"))
            h.update(self.timestamp.encode("utf-8"))
            return h.hexdigest()
    
    
        def login(self):
            self.getcapture()
            post_url = "https://www.zhihu.com/api/v3/oauth/sign_in"
            self.timestamp = str(int(time.time()) * 1000)
            self.getcookies()
            xsrf=self.session.cookies.get("_xsrf")
    
            post_data={
                "client_id": "c3cef7c66a1843f8b3a9e6a1e3160e20",
                'grant_type':'password',
                "timestamp": self.timestamp,
                "source": "com.zhihu.web",
                "signature": self.get_signature(),
                "username": "+86你的账户名",
                "password": "你的密码",
                "captcha": self.picture,
                "lang": "en",
                "utmSource":"",
                "refSource":"https://www.zhihu.com/signin?next/",
            }
            header={
                "x-xsrftoken":xsrf,
                "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 Edg/80.0.361.69",
                "content-type": "application/x-www-form-urlencoded",
                "x-zse-83": "3_2.0",
            }
            self.session.headers.update(header)
    
            post_data=parse.urlencode(post_data)#将字典转换为字符串
            post_data=self.get_formdata(post_data)
            response = self.session.post(post_url,data=post_data)
    
            if response.status_code==201:
                print(response.status_code,response.text)
                print("登录成功")
            else:
                print("登录失败")
    
        def get_formdata(self,post_data):
            #调用formdata加密方法
            with open("zhihu.js") as f:
                jsdata=f.read()
            ctx=execjs.compile(jsdata)
            enprty_data=ctx.call('b',post_data)[:-4]
            return enprty_data
    if __name__=="__main__":
        zh=zhihu_login()
        data=zh.login()
    
    

    在这里插入图片描述
    可以看到已经登录成功了,可以进行后续的数据爬取操作了。

    参考

    https://zhuanlan.zhihu.com/p/57375111
    https://zhuanlan.zhihu.com/p/34073256

    展开全文
  • 大V推荐作为一个可怜弱小又无助的小萌新,求知若渴却找不到良好的渠道去学习,只能看着教科书苦哈哈的抓瞎学习?不用担心,这里为大家带来如下几个Python知乎的大佬们!迷茫...
  • 2019年最新 Python 模拟登录知乎 支持验证码和保存 Cookies 知乎的登录页面已经改版多次,加强了身份验证,网络上大部分模拟登录均已失效,所以我重写了一份完整的,并实现了提交验证码 (包括中文验证码),本文我对...
  • 目前关于 Python 算法和数据结构的中文资料比较欠缺,笔者尝试录制视频教程帮助 Python 初学者掌握常用算法和数据结构,提升开发技能。本教程是付费教程(文字内容和代码免费),因为笔者录制的过程中除了购买软件、...
  • AI前线导读:知乎从问答起步,已逐步成长为一个大规模的综合性知识内容平台,截止目前,用户数突破2.2亿,有超过3000万的问题被提出,并获得超过1.3亿个回答。同时,知乎内还沉淀了数量众多的优质文章、电子书以及...
  • Python数据结构与算法视频培训教程:本课程内容包含了程序员常用的数据结构知识,涉及快速排序、树与二叉树、堆、堆排序、图的概念与遍历、Python常用的内置算法与数据结构等开发知识。数据结构和算法是每个程序员...
  • 知乎上看到的一个回答,感觉蛮好滴原答案链接(另外推荐一下看见那个答主的网站,小白被惊艳到了)纸上得来终觉浅!纸上得来终觉浅!纸上得来终觉浅!//假装的注释:各位有什么好的开源练手项目可以在评论区分享,...
  • 这是我们学校的软件工程课程设计的题目,要求自行编写爬虫或者利用开放的API获取新浪微博、知乎等社交网站的用户信息,利用数据挖掘的相关算法进行分析, 从大规模的用户群体中, 分别找出其中具有海淘或母婴购物意向...
  • python-知乎模拟登录

    2017-09-04 15:47:08
    本篇文章用于记录如何实现知乎模拟登录本篇采用firefox浏览器,按F12开发者工具来进行HTTP交互的获取和分析。需要设置开发者工具中的preserve log选项,否则会因为HTTP交互过多,无法参考中间过程的HTTP请求和回应...
  • Python数据结构与算法视频教程 知乎 Python 后端工程师。 htt...
  • 环境:python2.7+BeautifulSoup的库,如果安装了pip,就直接pip install BeautifulSoup就ok。 直接上代码吧。 # -*- coding: utf-8 -*- import urllib2 from BeautifulSoup import BeautifulSoup f = open('Answer...
  • 选取知乎的某个热门主题:https://www.zhihu.com/topic/19606591/hot,这是个恐怖片主题,大半夜的小心查看。 取出该主题下所有帖子里面提到的片名,所有的片名大部分都是《》包括的,就以此匹配出片名,去重并写入...
  • python数据挖掘系列教程 1. GBDT概述  GBDT也是集成学习Boosting家族的成员,但是却和传统的Adaboost有很大的不同。回顾下Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的...
  • 转载自知乎 Wayne Shi,仅仅为了方便收藏查看,侵权删。 阶段1:入门知识 零编程基础的可以先从下面几个教程了解编程及环境入门知识。(已有编程基础直接从阶段2起步) 1. 编程新手指南 2. Linux 基础...
  • 关于模拟退火算法的介绍在知乎,CSDN都有很多前辈给出了自己的介绍,我认为都讲得很好。其实模拟退火算法应用于一维搜索的话,以概率为1收敛于最优,而且早熟收敛发生的概率很低。和粒子群相比,收敛速度慢,依赖于...
1 2 3 4 5 ... 20
收藏数 13,456
精华内容 5,382
关键字:

python算法教程知乎