Hexo


  • 首页

  • 标签

  • 分类

  • 归档

shatter

发表于 2018-04-07 |

本文主要讲述shatter的含义,发生的条件,形式,应用

##

##

Lecture7.The VC Dimension

发表于 2018-04-07 |

交叉验证

发表于 2018-04-02 | 分类于 机器学习 |

why use Training set

  • 用于检查过拟合
  • 对模型在一个独立数据集的表现

How

分离训练集&测试集

1
2
3
4
from sklearn.model_selection import train_test_split

features_train, features_test, labels_train, labels_test = cross_validation.train_test_split(
iris.data, iris.target, test_size=0.4, random_state=0)

week5

发表于 2018-04-02 | 分类于 计划 |

周一

  • Udacity
    • 回归
    • 异常值
    • 交叉验证
    • 评估指标
    • 误差原因
  • 机器学习基石
    • week2

      周二

  • 机器学习基石
    • 复习
    • week6,弄明白了为什么mh不能直接代换

week4

发表于 2018-03-19 | 分类于 计划 |

周一

  • 邹博算法课——数组
    • 绝对众数
    • 局部最大值
    • 第一个缺失的整数
    • 查找旋转数组的最小值
    • 零子数组
    • 最大子数组和
  • LeetCode
      1. Majority Element
      1. Majority Element II
  • Udacity
    • P0 titanic_survival_exploration
  • Python
    • 《利用Python进行数据分析》4.1,4.2

周日

  • Udacity 安然数据集
  • 线性代数
    • 复习值最小二乘法

用Python玩转数据——week4

发表于 2018-03-16 | 分类于 用Python玩转数据 |

便捷数据获取

  • csv文件,json格式文件导入

    1
    2
    3
    4
    # Filename: quotes_fromcsv.py
    import pandas as pd
    quotesdf = pd.read_csv('axp.csv')
    print(quotesdf)
  • web API获取数据

    获取的已经是数据部分 而不是HTML文件,不需要再进行解析

    1
    2
    >>> r = requests.get('https://api.douban.com/v2/book/1084336') 
    >>> r.text '{"rating":{"max":10,"numRaters":218148,"average":"9.0","min":0 },"subtitle":"","author":["[法] 圣埃克苏佩里"],"pubdate":"2003- 8","tags":[{"count":52078,"name":"小王子","title":"小王子 "},{"count":43966,"name":"童话", ... , "price":"22.00元"}'
  • NLTK语料库

数据准备

数据形式

  • 修改索引
    • 行索引: index
    • 列索引: columns
1
2
3
4
5
6
7
8
9
10
11
import requests 
import re
import pandas as pd
def retrieve_dji_list():
...
return dji_list
dji_list = retrieve_dji_list()
djidf = pd.DataFrame(dji_list)
cols = ['code', 'name', 'lasttrade']
djidf.columns = cols print(quotesdf)
djidf.index = range(1, len(djidf) + 1)
  • 时间数据格式化
    • 转换成常规时间
    • 转换成固定格式
    • 创建时间序列
1
2
3
4
5
6
7
8
9
10
11
转换成常规时间
>>> from datetime import date
>>> firstday = date.fromtimestamp(1464010200)
>>> firstday
datetime.date(2016, 5, 23)

转换成固定格式
y = date.strftime(x,'%Y-%m-%d')

创建时间序列
dates = pd.date_range('20170520', periods=7)

数据显示

显示属性

  • 显示行索引
  • 显示列索引
  • 显示数据的值
  • 显示数据描述

显示方式

  • 显示行
    • 专用方式
      • head
      • tail
    • 切片
  • 显示列

数据选择

选择方式

  • 选择行
    • 切片
    • 索引
1
2
索引
quotesdf['2017-05-01':'2017-05-05']
  • 选择列
    • obj[‘attr’]
    • obj.attr
  • 选择区域
    • 标签label(loc)
1
djidf.loc[1:5, ['code','lasttrade']]
  • 筛选(条件选择)
1
quotesdf[(quotesdf.index >= '2017-01-01') & (quotesdf.index <= '2017- 03-31') & (quotesdf.close >= 80)]

统计与处理

  • diff()
  • 排序

    1
    tempdf = djidf.sort_values(by = 'lasttrade', ascending = False)
  • 计数统计

    1
    tempdf['month'].value_counts()

KMP时间复杂度分析

发表于 2018-03-16 | 分类于 Algorithm |

比较过程分析

比较次数

比较次数: 红色 + 蓝色
蓝色部分是相比暴力求解,节省下的比较次数

周期

从比较次数可以看出,呈现 1 1 1 1 5 这样的周期

  • 一个周期内的比较次数:8
  • 周期长度:5
  • 周期个数:n/5
  • 比较总次数: 周期个数 * 一个周期内额比较次数 = 1.8n

一般化结论:

  • 一个周期内的比较次数:1 * (M - 1) + M
  • 周期长度:M
  • 周期个数:N/M
  • 比较总次数: 周期个数 * 一个周期内额比较次数 = (2 - 1/M)*N < 2N

因此是线性

接下来证明,上述情况是KMP算法的最差情况

最差情况

  1. 模式串
    当模式串长度为M,首字符和其他字符全都相等(假定都为a),模式串存在最长的k前缀和k后缀, next数组呈现递增样式:-1,0,1,2…
  2. 需要匹配的字符串
    • 串成周期性分布,周期为M
    • 前M-1都为a,第M位不等于a

模式串

模式串的最坏情况比较好理解,因为每次当s[i] 不等于 P[j]时,j = next[j],一直按照next数组值进行回溯,当模式串全相等时,next数组呈现递增,每次回溯一个位子,因此比较次数是最多的

待匹配字符串

  1. 为什么呈现周期性的字符串满足
    假设存在一个字符串,使得模式串匹配完,比较次数最多,那么以这个子串为基础形成的周期性字符串一定也是匹配次数最多的
  2. 一个比较次数最多的子串,如何构造
    假设不在M处失配,而是在k处就失配了,那么匹配次数为(k - 1)*1 + k,由上面的公式可以得到,当k = m时,比较次数是最多

    比较总次数:15 < 18

最好情况

  1. 模式串
    当模式串的首字符和其他字符都不相等时,模式串不存在相等的k前缀和k后缀,next数组全为-1
  2. 需要匹配的字符串
    无要求

用Python玩转数据-week3

发表于 2018-03-15 |

ndarray

ndarray基本概念

  • 维度(dimensions)称为轴 (axes),轴的个数称为秩(rank)
  • 基本属性
    • ndarray.ndim(秩)
    • ndarray.shape(维度)
    • ndarray.size(元素总个数)
    • ndarray.dtype(元素类型)
    • ndarray.itemsize(元素字节大小)

      ndarray的创建

DataFrame

基本操作

  • 取DataFrame对象的列和行可获 得Series
    • frame[‘name’]
    • frame.pay
  • DataFrame对象的修改和删除
    • frame[‘name’] = ‘admin’
    • del frame[‘pay’]

用Python玩转数据——week2

发表于 2018-03-13 | 分类于 用Python玩转数据 |

本地数据获取

文文件的打开,读写和关闭件

  • 打开后才能进行读写
  • 为什么需要关闭?

    因为Python可能会缓存写入的数据 如果程序异常崩溃了 数据就不能写入到文件中 所以为了安全起见 文件用完以后要养成 主动关闭文件的习

文件的打开

  • 格式

    1
    file_obj = open(filename, mode='r', buffering=-1)
  • mode为可选参数,默认值为r

  • buffering也为可选参数,默认值为-1(0代表不缓冲,1或大于1的值表示缓冲一行或指定缓冲区大小)
    • 在Python中 二进制文件可以不使用缓冲
    • 文本文件必须要使用缓冲
  • open()函数-mode
  • 返回值
    • open()函数返回一个文件(file)对象
    • 文件对象可迭代

文件相关函数

  • f.write(str)

    1
    2
    3
    4
    5
    6
    >>> f = open('firstpro.txt', 'w') 
    >>> f.write('Hello, World!')
    >>> f.close()

    with open(‘firstpro.txt’, ‘w’) as f:
    f.write() #能进行文件异常处理,更加简洁有效
  • f.read()

    • file_obj.read(size)
      • 从文件中至多读出size字节数据,返回一个字符串
    • file_obj.read()
      • 读文件直到文件结束,返回一个字符串
    • 注意文件指针的概念,可以用f.tell() 查看
  • f.readlines()

    • readlines返回一个列表 Python中不删除换行符,需要程序员自己完成
      1
      2
      3
      4
      5
      6
      7
      f = open(r'companies.txt') 
      cNames = f.readlines()
      print cNames
      f.close()

      Output:
      ['GOOGLE Inc.\n', 'Microsoft Corporation\n', 'Apple Inc.\n', 'Facebook, Inc.']
  • f.seek(offset , whence=0)
    − 在文件中移动文件指针,从 whence(0表示文件头部,1表示 当前位置,2表示文件尾部)偏 移offset个字节
    – whence参数可选,默认值为0

网络数据获取

获取过程

  • 抓取
    • urllib内建模块
      • urllib.request : 已经逐渐被Request第三方库替代
    • Requests第三方库:适合中小型网络爬虫的开发
    • Scrapy框架:大型
  • 解析
    • BeautifulSoup库 : https://www.crummy.com/softwa re/BeautifulSoup/bs4/doc/
    • re模块 : https://docs.python.org/3.5/libr ary/re.html

Requests库

  • Requests官网:http://www.python-requests.org/

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> import requests
    >>> r = requests.get('https://book.douban.com/subject/1084336/comments/')
    # get方法返回一个Response对象,这个对象里面包含Request请求信息 和服务器的Response响应信息 而Requests会自动解码 来自服务器的信息 假设某个网页的格式是json格式 那我们就可以利用Requests库中 内置的json解码器来解码 类似于这样的方式 :
    # re.json()
    '

    '
    >>> r.status_code
    200 #代表一切正常
    >>> print(r.text)
    • 解码
      • json格式

        re.json()

      • 二进制格式

        re.content()

      • re.text

        自动推测文本编码,并进行解码

      • re.encoding = ‘utf-8’

        修改编码

  • 遵循网站爬虫协议 robots.txt
    • 例如 www.douban.com/robots.txt

BeautifulSoup

  • 常用解析器
    • LXML
  • BeautifulSoup对象
    • Tag : HTML,XML中的标签,大多数BeautifulSou对象都是Tag
      • 属性
        • name
        • attrs
    • NavigableString
    • BeautifulSoup
    • Comment : NavigableString的子类
  • 例子
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    from bs4 import BeautifulSoup

    markup = '<p class="title"><b>The little Prince</b></p>'

    soup = BeautifulSoup(markup, 'lxml')

    print(soup.text)
    The little Prince

    type(soup.b)
    Out[5]: bs4.element.Tag

    soup.b
    Out[6]: <b>The little Prince</b>

    tag = soup.p

    tag.name
    Out[8]: 'p'

    tag.attrs
    Out[9]: {'class': ['title']}

    #Tag属性的操作 和我们后面要讲的字典一样的 所以可以通过这样的方式来获取属性
    tag['class']
    Out[10]: ['title']

    # NavigableString对象可以用string属性来表示
    tag.string
    Out[11]: 'The little Prince'

    type(tag.string)
    Out[12]: bs4.element.NavigableString # 后期很常用

    soup.find_all('b') # 参数可以是标签或者属性名, 只需要找第一个可以用find方法
    Out[13]: [<b>The little Prince</b>]

    #find_all 方法返回一个列表

正则表达式

  • 在线测试/调试工具
    • https://regex101.com/

数据表示

序列

  • 成员
    • 字符串
    • 元祖
    • 列表
  • 访问模式
    • 元素从0开始通过下标偏移量访问
    • 一次可访问一个或多个元素
  • 操作

    • 标准类型运算符

      1
      2
      3
       值比较: < > <= >= == !=
      布尔运算: not and or
      对象身份比较: is is not
    • 序列类型运算符

      获取,重复,连接,判断

    • 内减函数运算符
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
       序列类型转换内建函数: list() str() tuple()
      >>> list('Hello, World!')
      ['H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!']
      >>> tuple("Hello, World!")
      ('H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!')

      序列类型可用内建函数
      enumerate()
      reversed()
      len()
      sorted()
      max()
      sum()
      min()
      zip()

字符串

  • 输出形式
    • format_string % (arguments_to_convert)
    • format_string.format(arguments_to_convert)

列表

  • 可扩展的容器对象
  • 包含不同类型对象
  • 列表方法
    • append()
    • copy()
    • count()
    • extend()
    • index()
    • insert()
    • pop()
    • remove()
    • reverse()
    • sort()
  • 列表解析
    1
    2
    3
    4
    5
    6
    7
    8
    >>> [x for x in range(10)]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> [x ** 2 for x in range(10)]
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> [x ** 2 for x in range(10) if x ** 2 < 50]
    [0, 1, 4, 9, 16, 25, 36, 49]
    >>> [(x+1, y+1) for x in range(2) for y in range(2)]
    [(1, 1), (1, 2), (2, 1), (2,

第三周

发表于 2018-03-12 | 分类于 计划 |

周一

  • 邹博算法课——字符串
  • 用Python玩转数据整理

周二

  • 用Python玩转数据 作业
  • LeetCode
    • Climbing Stairs
  • 总结:
    • 字符串算法部分,比自己想象地更花费时间,还得单独拿出一天来实现算法
    • 用Python玩转数据,一周的内容量还是挺大,也需要花费更多的时间

周三

  • LeetCode
    • Longest Palindromic Substring
  • 用Python玩转数据- week2 整理
  • 邹博算法课
    • LCS
    • Manacher算法实现

周四

  • 用Python玩转数据- week3 整理
  • 邹博算法课
    • KMP实现
    • KMP时间复杂度思考
    • 字符串周期性思考
  • LeetCode
    • Implement strStr()

周五

  • 用Python玩转数据——week4
  • 博客整理
    • KMP时间复杂度分析
12345
Kai Niu

Kai Niu

Hello World!

41 日志
8 分类
31 标签
GitHub
© 2018 Kai Niu
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4