随机变量

Posted on Wed 24 February 2016 in 概率论 • Tagged with 概率论

离散型随机变量

若一个随机变量最多有可数多个可能的值,则称这个随机变量为离散型的。对一个离散型随机变量\(X\),记\(X\)的概率质量函数(probability mass function) \(p(x)\)为:

$$p(a) = P\{X = a\}$$

\(p(a)\)最多在可数的\(a\)上取正值,即如果\(X\)的可能值为\(x_{1}, x_{2},x_{3}, ....\), 那么:

$$p(x_{i}) \geq 0,i = 1, 2, 3...$$
$$p(x) = 0, 所有其他x$$

由于\(X\)必定取值于 …


Continue reading

selenium+PhantomJS使用总结

Posted on Fri 25 December 2015 in 爬虫 • Tagged with selenium, PhantomJS

selenium 是一套web自动化测试工具,其可以模拟真实的浏览器,执行JavaScript等功能。正因为如此,其功能的丰富和强大,让它不单单是个一个web自动化的测试工具。本篇文章主要讲的是其在爬虫抓取上的应用,不会涉及的自动化web测试相关的东西,对于复杂的动态页面,普通的正常抓取只是抓取到其源码页面,真正的内容可能是通过JavaScript,ajax等动态加载,使用selenium来模拟正常的浏览器来帮助进行抓取是一种很有效的方法。selenium支持不同的WebDriver,包括:google chrome ,firefox, IE, PhantomJs等。Python的selenium库提供了一系列简单易用的API, 可以让我们通过代码逻辑模拟点击,拖动,翻页等效果。

对于Python的selenium模块的安装很简单,直接pip install selenium就可以搞定。对于webDriver,可以根据自己的喜好来进行选着,我目前使用的google chrome和PhantomJS。在下载完webDriver后可以直接放入到/usr/bin/或者/bin目录下,那样在启动webDriver的时候就不需要指定路径了,如果放入别的路径的话,那就需要在启动的时候指定路径了。google chrome的webDriver的下载地址, PhantomJS的可以直接在官网上下载已经编译过的,源码下载编译太蛋疼了。

selenium webDriver提供了相当灵活和设置,可以伪造User_Agent和各种头信息,如 …


Continue reading

scrapy 中间件

Posted on Sun 20 December 2015 in 源码分析, scrapy • Tagged with scrapy, Middlewares

Scrapy框架提供的中间件共有两个:Downloader middlewares 和 Spider Middlewares。这两个中间件分别作用在不同的数据流向上。

Downloader middlewares

Downloader middlewares顾名思义就是下载中间件,该中间件会在Scrapy的引擎从调度器获取到下一个要爬去的Request,并转发给下载器进行下载这个中间过程进行调用。以及下载器把需要爬取的Request爬取后生成的Response对象返回给Scrapy的引擎的过程中会调用Downloader middlewares。

管理Downloader middlewares的类是scrapy.middleware.DownloaderMiddlewares对象。该对象在生成Scrapy的下载器的时候会被调用,该对象通过 读取配置文件中DOWNLOADER_MIDDLEWARES来构建该对象。

class DownloaderMiddlewareManager(MiddlewareManager):

  component_name = 'downloader middleware'

  @classmethod
  def _get_mwlist_from_settings(cls, settings):
    return build_component_list(
        settings.getwithbase('DOWNLOADER_MIDDLEWARES'))

在'构造'的时候,首先是从配置文件获取Downloader middlewares的中间件字典,该字典的key为中间件对象的字符串表示,值为该中间件的权重。Scrapy在运行的时候从配置文件获取的中间件集合不仅包括settings/default_settings.py中默认的配置DOWNLOADER_MIDDLEWARES_BASE,还包括用户自定义的settings.py文件中的DOWNLOADER_MIDDLEWARES。

# settings/__init__ …

Continue reading

使用C/C++扩展Python之二

Posted on Thu 26 November 2015 in Python • Tagged with Python, C/C++, Python扩展

Python 引用计数 在上一篇文章中,简单的介绍了使用C/C++开发Python模块的一般步骤。还借用上一篇文中的代码:

static PyObject* py_reverse(PyObject* self, PyObject* args)
{
    char* result;
    char* target = NULL;
    PyObject* retval = NULL;

    int ret = PyArg_parseTuple(args, "s", &target);
    if (!ret) {
        return NULL;
    }   

    result = reverse(target);
    retval = (PyObject*)Py_BuildValue("s", result);
    return retval;
}

上篇文章说道,这只是一个很简陋的封装,还缺少错误处理和引用计数处理的逻辑。 Python …


Continue reading

使用C/C++扩展Python之一

Posted on Thu 12 November 2015 in Python • Tagged with Python, C/C++, Python扩展

假设我们需要使用C/C++实现一个翻转字符串的扩展功能, 下面是C语言的实现

#include <stdio.h>
#include <stdlib.h>

char* reverse(char *s)
{
    if (NULL == s) {
        return NULL;
    }
    int low = 0;
    int higth = strlen(s) - 1;
    while (low < hight) {
        char tmp = s[low];
        s[low] = s[hight]
        s[hight] = tmp;
        ++low;
        --hight;
    }
    return s;
}

首先,我们需要解决的问题是,怎样在Python环境下传递参数,即在Python …


Continue reading

Scrapy框架组件之调度器

Posted on Fri 06 November 2015 in 源码分析 • Tagged with scrapy

本片文章分析的是Scrapy框架的调度器的实现。在Scrapy框架中,调度器的作用是调度Request对象,弹出Request对象提交给Scrapy引擎进行fetch,压入新的需要fetch的Request对象,涉及到Request的存储调度。

在进行下面之前,需要了解一个Python的开源库queuelib, 它现在从Scrapy框架中独立出去,作为一个单独的库开源出去,其实现了一系列的队列。 下面简单的说下:

FifoDiskQueue: 这是个FIFO队列,使用文件块来实现落地磁盘的功能。每个文件块存储的数据的个数为chunksize的大小,这个值默认的情况下是100000条,且在落地的文件夹里面会有个info.json文件,其内容格式为

 {"tail": [0, 0, 0], "head": [10, 0], "chunksize": 100000, "size": 1000000}

size为当前FifoDiskQueue的大小;chunksize为每个文件块能够存储多少条数据;head的第一个元素为要写入数据的文件块的下标,第二个元素为该文件块已经写了多少条数据;tail的第一个元素为要读的文件块的下标,第二个元素为累计读取了多少条数据,第三个元素文件的offset记录读取了多少字节。需要注意的是在每次操作完了FifoDiskQueue实例后,都需要调用其成员函数close,以写入状态到info.json这个文件中,每次在实例化FifoDiskQueue的时候,都会通过info …


Continue reading

scrapy排重机制

Posted on Wed 16 September 2015 in 源码分析 • Tagged with scrapy, Python, 爬虫

本篇文章主要的内容是scrapy在单机排重下的机制, 并提共分布式scrapy爬虫服务的url排重方案

scrapy在单机下设置url是否排重过滤很简单, 在每次抛出对该url构造的Request对象给调度器(schedler)时候, 设置Request的参数dont_filter 是否为True来让schedler判断时候对其走排重过滤的逻辑, dont_filter的默认值为False, 即该url会走排重逻辑 源码逻辑如下:

    def enqueue_request(self, request):
        if not request.dont_filter and self.df.request_seen(request):
            self.df.log(request, self.spider)
            return False
        dqok = self._dqpush(request)
        if dqok:
            self.stats.inc_value('scheduler/enqueued/disk', spider=self.spider)
        else …

Continue reading

Hive 总结

Posted on Thu 27 August 2015 in 大数据 • Tagged with Hive

安装

1.因为要把元数据存入mysql,需要下载mysql的jar包并移动到hive的lib目录下

2.进入conf文件夹把hive-default.xml.template 拷贝一份,重命名为hive-site.xml

3.修改hive-site.xml配置文件中的几个重要的参数

4.hive.metastore.warehouse.dir 这个hive的数据仓库的存储位置,其值一般都是HDFS中的路径,如:/user/hive/warehouse

5.javax.jdo.option.ConnectionURL,这个参数需要填写的时JDBC连接字符串,如:jdbc:mysql://localhost:3306/hive?characterEncoding=UTF-8

6.javax.jdo.option.ConnectionDriverName,设置JDBC的Driver,如:com.mysql.jdbc.Driver …


Continue reading

Native Bayes Classifier

Posted on Sat 22 August 2015 in ML

1.概率

某个试验的样本空间为\(S\)。对应于其中任一事件\(E\)。记\(P(E)\),它满足如下3个公理

公理1: \(0 <= P(E) <= 1\)

公理2: \(P(S) = 1\)

公理3: 对任一列互不相容的事件\(E_1,E_2\), ...(即如果\(i \neq j\)\(E_IE_J\neq\phi\)),有

$$P(\bigcup_{i=1}^{n}E_i) = P(\sum_{i=1}^nE_i)$$

就称\(P(E)\)为事件\(E\)的概率

2 …

Continue reading

STL -- Insert Iterator 简单分析

Posted on Mon 20 July 2015 in STL • Tagged with C/C++, STL, 源码分析

【以下代码都来自 SGI STL -- stl_iterator.h】

工作中STL用的很多, 多次用到insert iterator系列函数,但是一直都没有注意过为什么要这么用。只是知道inserter是'插入',front_inserter是'头插',back_inserter是'尾插'。当然这些叫法只是为我自己记住怎么使用这系列的函数。本着知其然知其所以然,本篇文章将简单的分析下Insert Iterator的实现细节。 现看inserter的这个函数的实现吧:

template <class _Container, class _Iterator>
inline
insert_iterator<_Container> inserter(_Container& __x, _Iterator __i)
{
    typedef typename _Container::iterator __iter;
    return insert_iterator<_Container>(__x, __iter …

Continue reading