乐正

Actions speak louder than words.

数据挖掘导论读书笔记-绪论

数据挖掘的起源

提取有用的信息已经称为一项巨大的挑战,来自不同学科的研究者汇集到一起,开发可以处 理不同数据类型的更有效的、可伸缩的工具。特别地,数据挖掘利用了来自如下领域思想:

  • 来自统计学的抽样、估计和假设检验
  • 人工智能、模式识别和机器学习的搜索算法、建模技术和学习理论
  • 最优化、进化计算、信息论、信号处理、可视化和信息检索
  • 提供有效存储、索引和查询处理支持的数据库系统
  • 源于高性能(并行)计算的技术

什么是数据挖掘?

数据挖掘是一种将传统的数据分析与处理大量数据的复杂算法相结合的一种技术;是在大型 数据存储库中,自动地发现有用信息的过程。

数据挖掘要解决的问题

  • 可伸缩
  • 高维性
  • 异种数据和复杂数据
  • 数据的所有权与分布
  • 非传统的分析

数据挖掘的任务

  • 预测任务:根据说明变量(自变量)预测目标变量(因变量)的值
  • 描述任务:导出概括数据中潜在联系的模式
  • 预测建模:为目标变量提供两类的预测建模任务:分类和回归
  • 关联分析:用来发现数据中强关联特征的模式
  • 聚类分析:旨在发现紧密相关的观测值组群,使得与不同簇的观测值相比,属于同一 簇的观测值相互之间尽可能接近
  • 异常检测:识别其特征显著不同于其他数据的观测值

Vim 技巧

在Github上看到的一些挺有用的技巧,转载、汇总过来。文章最后会有来源。

行为一致的n和N

nN在搜索中用来查找下一个或者上一个搜索结果。但是在使用/或者?搜索时,它 移动的方向不同,这个经常会混淆。所以,如果你希望n总是查找下一个搜索结果,N总 是查找上一个搜索结果的话,你可以这么做:

1
2
nnoremap <expr> n  'Nn'[v:searchforward]
nnoremap <expr> N  'nN'[v:searchforward]

快速移动当前行

如果你想将当前行快速上移或者下移几行的话,你可以这么做:

1
2
nnoremap [e  :<c-u>execute 'move -1-'. v:count1<cr>
nnoremap ]e  :<c-u>execute 'move +'. v:count1<cr>

上面两个映射接受数字做为参数,例如:2]e表示将当前行下移两行。

快速宏编辑

这条非常有用!这个快捷键打开了一个命令历史窗口,你可以编辑,然后按<cr>键执行。

1
nnoremap <leader>m  :<c-u><c-r>='let @'. v:register .' = '. string(getreg(v:register))<cr><c-f><left>

<leader>m使用这条技巧。

高亮光标所在当前行和当前列

1
2
3
au WinLeave * set nocursorline nocursorcolumn
au WinEnter * set cursorline cursorcolumn
set cursorline cursorcolumn

显示多余的空白字符

1
set list listchars=tab:»·,trail:·

在GUI中快速改变字体大小

测试在控制台的Vim中无效。

1
2
command! Bigger  :let &guifont = substitute(&guifont, '\d\+$', '\=submatch(0)+1', '')
command! Smaller :let &guifont = substitute(&guifont, '\d\+$', '\=submatch(0)-1', '')

参考

计算机程序的构造和解释-习题解答

目标是完成《计算机程序的构造和解释》一书所有的习题。会不断更新,希望在年底之前能 完成。

第一章: 构造过程抽象

1.1 程序设计的基本元素

1.2 过程与它们所产生的计算

1.3 用高阶函数做抽象

第二章: 构造数据抽象

2.1 数据抽象导引

2.2 层次性数据和闭包性质

2.3 符号数据

2.4 抽象数据的多重表示

  • 2.4.1 复数的表示
  • 2.4.2 带标志数据
  • 2.4.3 数据导向的程序设计的可加性(练习 2.73,练习 2.74,练习 2.75,练习 2.76)

2.5 带有通用型操作的系统

  • 2.5.1 通用型算术运算(练习 2.77,练习 2.78,练习 2.79, 练习 2.80)
  • 2.5.2 不同类型数据的组合(练习 2.81,练习 2.82,练习 2.83,练习 2.84,练习 2.85,练习 2.86)
  • 2.5.3 实例: 符号代数(练习 2.87,练习 2.88,练习 2.89,练习 2.90,练习 2.91,练习 2.92,练习 2.93,练习 2.94,练习 2.95,练习 2.96,练习 2.97)

第三章: 模块化、对象和状态

3.1 赋值和局部状态

  • 3.1.1 局部状态变量(练习 3.1,练习 3.2,练习 3.3,练习 3.4)
  • 3.1.2 引进赋值带来的利益(练习 3.5,练习 3.6)
  • 3.1.3 引进赋值的代价(练习 3.7,练习 3.8)

3.2 求值的环境模型

  • 3.2.1 求值规则
  • 3.2.2 简单过程的应用(练习 3.9)
  • 3.2.3 将框架看作局部状态的展台(练习 3.10)
  • 3.2.4 内部定义(练习 3.11)

3.3 用变动数据做模拟

  • 3.3.1 变动的表结构(练习 3.12,练习 3.13,练习 3.14,练习 3.15,练习 3.16,练习 3.17,练习 3.18,练习 3.19,练习 3.20)
  • 3.3.2 队列的表示(练习 3.21,练习 3.22,练习 3.23)
  • 3.3.3 表格的表示(练习 3.24,练习 3.25,练习 3.26,练习 3.27)
  • 3.3.4 数字电路的模拟器(练习 3.28,练习 3.29,练习 3.30,练习 3.31,练习 3.32)
  • 3.3.5 约束的传播(练习 3.33,练习 3.34,练习 3.35,练习 3.36,练习 3.37)

3.4 并发:时间是一个本质问题

  • 3.4.1 并发系统中时间的性质(练习 3.38)
  • 3.4.2 控制并发的机制(练习 3.39,练习 3.40,练习 3.41,练习 3.42,练习 3.43,练习 3.44,练习 3.45,练习 3.46,练习 3.47,练习 3.48,练习 3.49)

3.5 流

  • 3.5.1 流作为延时的表(练习 3.50,练习 3.51,练习 3.52)
  • 3.5.2 无穷流(练习 3.53,练习 3.54,练习 3.55,练习 3.56,练习 3.57,练习 3.58,练习 3.59,练习 3.60,练习 3.61,练习 3.62)
  • 3.5.3 流计算模式的使用(练习 3.63,练习 3.64,练习 3.65,练习 3.66,练习 3.67,练习 3.68,练习 3.69,练习 3.70,练习 3.71,练习 3.72,练习 3.73,练习 3.74,练习 3.75,练习 3.76)
  • 3.5.4 流和延时求值(练习 3.77,练习 3.78,练习 3.79,练习 3.80)
  • 3.5.5 函数式程序的模块化和对象的模块化(练习 3.81,练习 3.82)

第四章: 元语言抽象

4.1 元循环求值器

  • 4.1.1 求值器的内核(练习 4.1)
  • 4.1.2 表达式的表示(练习 4.2,练习 4.3,练习 4.4,练习 4.5,练习 4.6,练习 4.7,练习 4.8,练习 4.9,练习 4.10)
  • 4.1.3 求值器数据结构(练习 4.11,练习 4.12,练习 4.13)
  • 4.1.4 作为程序运行这个求值器(练习 4.14)
  • 4.1.5 将数据作为程序(练习 4.15)
  • 4.1.6 内部表示(练习 4.16,练习 4.17,练习 4.18,练习 4.19,练习 4.20,练习 4.21)
  • 4.1.7 将语法分析和执行分离(练习 4.22,练习 4.23,练习 4.24)

4.2 Scheme 的变形 —— 惰性求值

  • 4.2.1 正则序和应用序(练习 4.25,练习 4.26)
  • 4.2.2 一个采用惰性求值的解释器(练习 4.27,练习 4.28,练习 4.29,练习 4.30,练习 4.31)
  • 4.2.3 将流作为惰性的表(练习 4.32,练习 4.33,练习 4.34)

4.3 Scheme 的变形 —— 非确定性求值

  • 4.3.1 amb 和搜索(练习 4.35,练习 4.36,练习 4.37)
  • 4.3.2 非确定性程序的实例(练习 4.38,练习 4.39,练习 4.40,练习 4.41,练习 4.42,练习 4.43,练习 4.44,练习 4.45,练习 4.46,练习 4.47,练习 4.48,练习 4.49)
  • 4.3.3 实现 amb 求值器(练习 4.50,练习 4.51,练习 4.52,练习 4.53,练习 4.54)

4.4 逻辑程序设计

  • 4.4.1 演绎信息检索(练习 4.55,练习 4.56,练习 4.57,练习 4.58,练习 4.59,练习 4.60,练习 4.61,练习 4.62,练习 4.63)
  • 4.4.2 查询系统如何工作
  • 4.4.3 逻辑程序设计是数理逻辑吗(练习 4.64,练习 4.65,练习 4.66,练习 4.67,练习 4.68,练习 4.69)
  • 4.4.4 查询系统的实现(练习 4.70,练习 4.71,练习 4.72,练习 4.73,练习 4.74,练习 4.75,练习 4.76,练习 4.77,练习 4.78,练习 4.79)

第五章: 寄存器机器里的计算

5.1 寄存器机器的设计(练习 5.1)

  • 5.1.1 一种描述寄存器机器的语言(练习 5.2)
  • 5.1.2 机器设计的抽象(练习 5.3)
  • 5.1.3 子程序
  • 5.1.4 采用堆栈实现递归(练习 5.4,练习 5.5,练习 5.6)
  • 5.1.5 指令总结

5.2 一个寄存器机器模拟器(练习 5.7)

  • 5.2.1 机器模型
  • 5.2.2 汇编程序(练习 5.8)
  • 5.2.3 为指令生成执行过程(练习 5.9,练习 5.10,练习 5.11,练习 5.12,练习 5.13)
  • 5.2.4 监视机器执行(练习 5.14,练习 5.15,练习 5.16,练习 5.17,练习 5.18,练习 5.19)

5.3 存储分配和废料收集

  • 5.3.1 将存储看作向量(练习 5.20,练习 5.21,练习 5.22)
  • 5.3.2 维持一种无穷存储的假象

5.4 显式控制的求值器

  • 5.4.1 显式控制求值器的内核
  • 5.4.2 序列的求值和尾递归
  • 5.4.3 条件、赋值和定义(练习 5.23,练习 5.24,练习 5.25)
  • 5.4.4 求值器的运行(练习 5.26,练习 5.27,练习 5.28,练习 5.29,练习 5.30)

5.5 编译

  • 5.5.1 编译器的结构(练习 5.31,练习 5.32)
  • 5.5.2 表达式的编译
  • 5.5.3 组合式的编译
  • 5.5.4 指令序列的组合
  • 5.5.5 编译代码的实例(练习 5.33,练习 5.34,练习 5.35,练习 5.36,练习 5.37,练习 5.38)
  • 5.5.6 词法地址(练习 5.39,练习 5.40,练习 5.41,练习 5.42,练习 5.43,练习 5.44)
  • 5.5.7 编译代码和求值器的互连(练习 5.45,练习 5.46,练习 5.47,练习 5.48,练习 5.49,练习 5.50,练习 5.51,练习 5.52)