{ 知识课堂 }

  • 为什么公交车来的总比时间表上说的还久?

    | /

    十字路口的红绿灯,每分钟交替一次的话,你在红灯的时候到达的平均等待时间是多久?

    1/2=0.51/2 = 0.5 分钟

    公交车平均五分钟来一次的话你等公交车要多久?

    5/2=2.55/2 = 2.5 分钟

    错啦!这就是经典的等车悖论,因为公交车平均每五分钟来一辆,那么你的平均等待时间将是五分钟。

    均匀分布和指数分布

    红绿灯和公交车有什么不同的地方呢?

  • 第一次的机器学习:机器学习基础概念和名词

    | /

    尽管机器学习从分类上而言只是人工智能(也就是常说的AI)的分支之一,但其本身也是一个相当巨大的命题。在未来的一段时间里,我将花时间在专栏写一些我比较熟悉的机器学习相关的概念和算法,最主要的目的是为了梳理自己的知识体系,也是希望和大家分享学习的历程和感悟,以达到交流的目的。

    这两年大数据火了,机器学习、神经网络、数据挖掘、强化学习等等这些名词都火了,然而我常常在想,把这些名词挂在嘴边的我们,究竟能否在这个领域飞速发展的情况下,清楚地了解到自己说的每一个名词——谁是谁的分支,哪个和哪个又是同等关系或是没有关系的——在名词爆炸的状态下,想学什么,了解其基础概念是必不可少的。

    与数据相关的概念

    假如我们有一组天气数据,是来自全世界不同国家和地区的每日天气,内容包括最高温度、最低温度、平均湿度、风速之类的相关数据,例如数据的一部分是这样的:

    城市 最高温度 最低温度 相对湿度 某时刻风速
    A市 36℃ 28℃ 58% 16.7km/h
    B市 28℃ 17℃ 86% /
    C市 34℃ 29℃ 39% 20.4km/h

    在这组数据中,我们将称A市、B市、C市等市以及其情况的总和称为数据集(data set)。表格中的每一行,也就是某城市和它的情况被称为一个样例(sample/instance)。表格中的每一列(不包括城市),例如最高温度、最低温度,被称为特征(feature/attribute),而每一列中的具体数值,例如36℃ 、28℃,被称为属性值(attribute value)。数据中也可能会有缺失数据(missing data),例如B市的某时刻风速,我们会将它视作缺失数据。

  • 猴子都能学会的20行代码登录微博

    | /

    如何登录新浪微博是令许多数据新手(包括我)头疼的大问题。由于新浪的反爬虫策略,网上的教程往往撑不过几个月,查阅到的资料在半年前或是一年前——而它们早就无法使用了,在你想开始爬虫的时候被活生生卡在了第一步。

    简单而言,我使用的方法是通过 Selenium 模拟浏览器的行为,直接在浏览器中输入用户名和密码并登录,然后直接从浏览器中获取 Cookies。虽然听起来十分简单(实际上也十分简单),但是确实是十分有效的方式。只要一个网站能通过浏览器登陆,我们就可以简单改造这个程序来登录并获得想要的资料。

    什么是Selenium?如何使用?

    Selenium 是一个项目的名称,都与浏览器和网页测试相关。主要的工具也就是今天我们所要使用的,是WebDriver,是一个浏览器自动化工具。它为很多不同的语言提供了库,包括 Python、Java、Ruby 等。本文中我选择使用 Python 来进行操作,当然你也可以使用你熟悉的语言来进行操作。

    在 Python中使用 Selenium 只需要通过pip安装 Selenium 提供的 Python 库。

    1
    pip3 install selenium  # 如果你使用 Python 2 ,请使用 pip install selenium

    仅仅安装 Selenium 本身是不够的,你同时还需要安装 Driver 。你可以将 Driver 理解为浏览器本身的『驱动』,在程序中使用 Driver 就相当于你打开了一个浏览器做了些什么事情。

  • 从零开始微信机器人(四):监控机器人程序

    | /

    由于使用网页版微信,机器人往往不能够永远地在线。如果无法一直在线,也就失去了自动回复程序的意义。在此,我们使用两种方式来监控机器人程序:

    1. 自动定时发送消息
    2. 使用supervisor进行监控

    自动发送消息

    准备

    如果需要定时发送消息,使用sleep方式来等待计时会阻塞线程,因此我们会使用threading来进行多线程的操作。把一个线程分配给自动给特定人发送微信消息。

    定义自动发送消息的方法

    在进行多线程操作之前,我们先定义一个自动发送消息的方法以备调用:

    1
    2
    3
    4
    5
    def send_online_notification(name):
    my_friend = ensure_one(bot.search(name))
    while True:
    my_friend.send('Hello!') # 你想发送的消息
    time.sleep(3600) # 一小时后在进行发送

    wxpy的ensure_one()方法会确认返回的内容仅有一个值,如果返回的列表超过一个值(或是没有返回),它会进行报错。我们在这里寻找name相关的好友,并且保证只有一个这样的好友。如果你需要给多个好友发送消息,我建议再使用一个循环来遍历好友列表。

  • 从零开始微信机器人(三):表情机器人的制作

    | /

    本篇的诞生来自于一朋友制作的表情机器人。当时觉得十分有趣,也希望加入到群聊机器人中,因此就向他讨要了源代码并制作了表情功能。在此我也再次感谢吴毅凡同学的协助!

    准备工作

    由于需要读取网页内容,本文中由于我个人偏好使用xpath来选择网页中元素,使用了lxml包,安装的话需要:

    1
    pip install lxml

    如果你想要使用BeautifulSoup来处理网页,请安装:

    1
    pip install beautifulsoup4
  • 从零开始微信机器人(二):使用图灵机器人和api.ai相关接口

    | /

    图灵机器人相关接口

    图灵机器人是一个中文语境下的对话机器人,免费的机器人每天有5000次调用的,如果放在群聊中是完全够用的(如果只有@的消息才使用机器人回复的)。图灵机器人也包括一些简单的能力,比如讲笑话、故事大全、成语接龙、新闻资讯等,我们将介绍如何简单调用图灵机器人接口。

    前期准备

    1. 前往注册图灵机器人,增加一个机器人,并记录机器人的APIKey。具体注册方法可以前往图灵API查看。(如果你觉得很麻烦, 也可以暂时使用itchat提供的几个key

    2. 安装Requests: HTTP for Humans

      1
      2
      # 从 pip 安装 ()
      pip install requests

      并在机器人中导入Requests包(写在程序最初):

      1
      import requests
  • 从零开始微信机器人(一):wxpy简介

    | /

    在过去的几个月中,由于在新生群中回答问题费时费力,同时又有许多重复而又有固定答案的回答,我受到一些知乎文章的启发,维护了一个基于itchat的群聊机器人。从刚开始接入图灵机器人时只会尬聊的机器人,之后又加入了api.ai的按照消息内容自动回复,而后再加入了回复表情功能,使得机器人变得越来越有趣。

    现在,由于itchat的更新和被wxpy一些更有趣的功能所吸引,我计划将这个机器人分步重写,并将完整的机器人构建步骤展现给大家。这是我第一次做这样的事,有诸多不足之处,也希望多多谅解和指正。