第一章 准备工作
1.1、编程环境搭建
本教程采用的编程语言为python,推荐使用Anaconda,这样可以不用自己安装各种库。要知道,现在在windows安装python的库时,经常出现安装失败。安装了Anaconda后,应该是已经有了numpy 、scipy、matplotlib、sklearn。如果你是在linux上使用python,那么可以不需要Anaconda了,可以下载库的源码,自己编译即可(一般库里面都有个Readme.md之类的文件,自己看看就知道怎么安装了)。
本教程假定读者已经有了Python编程的基础,所以不会过多讲解Python基础知识。如果不懂python语法,可以阅读《Python基础教程》,如果想深入了解Python的特性,可以阅读《Python Cookbook》。
1.2、编程上手
1.2.1 Numpy矩阵运算
推荐读者看看这个教程。
1.2.1.1 创建矩阵
import numpy as np #导入numpy
mat_zeros = np.zeros([3, 3]) #创建一个全0矩阵
如果使用的是Spyder编辑器,可以在文本编辑时按 ctrl + I 来获取帮助,例如,np.zeros的帮助如下:
zeros
Definition : zeros(shape, dtype=float, order='C')
Type : Function of numpy.core.multiarray module
Return a new array of given shape and type, filled with zeros.
Parameters
shape : int or sequence of ints
Shape of the new array, e.g., (2, 3) or 2.
dtype : data-type, optional
The desired data-type for the array, e.g., numpy.int8. Default is numpy.float64.
order : {‘C’, ‘F’}, optional
Whether to store multidimensional data in C- or Fortran-contiguous (row- or column-wise) order in memory.
下面再来使用几个函数。
mat_random = np.random.rand(3, 4) #创建随机矩阵
print mat_random
mat_eye = np.eye(3) #创建单位阵
1.2.1.2 矩阵运算
加法和减法都是elementwise的,使用 * 进行乘法也是elementwise,使用np.dot(x, y),才是进行矩阵乘法。
import numpy as np
mat_zeros = np.zeros([3, 3])
mat_random = np.random.rand(3, 4) #创建随机矩阵
print mat_random
mat_eye = np.eye(3) #创建单位阵
mat_random2 = np.random.rand(3, 4)
ew_mul_result = mat_random * mat_random2 #element-wise 乘法
print ew_mul_result
mat_random3 = np.random.rand(4, 3)
mat_mul_result = np.dot(mat_random, mat_random3)#矩阵乘法
print mat_mul_result
numpy的内容很丰富,包含了大多数常用的数学运算,速度也是非常快的。具体的可以在python使用help进行查看,也可以阅读 numpy 的官方文档。再次推荐读者看看这个教程。
1.3、数学基础
1.3.1 特征距离
机器学习中,特征的距离也就是特征的相似性,用来比较两个样本的相似程度。如果是聚类的问题的话,就意味着是否需要将两个样本聚为一类。所以相似性的计算是相当重要的。
常用的相似性距离可以在该博客看到。
1.3.2 数据归一化
谈到相似性(距离),就不得不说归一化的问题了。在计算距离时,比如使用二范数,如果某个维度的数据范围特别大(0–1000),而另一个维度数据范围又很小(0–0.5),那么在计算距离的时候,范围大的对于距离的影响会特别大!也就是说范围大的数据对于距离的贡献特别大,这样会导致范围小的数据基本被忽略了,显然这不是我们想要的结果。所以,为了更好的计算相似性(也有可能有其他目的),我们必须对数据特征进行归一化。
关于数据归一化,可以看这里