1.3 机器学习的数学基础

来源:互联网 发布:淘宝客网站seo 编辑:程序博客网 时间:2024/05/13 05:13
相似性的度量
样本之间的相似性度量:向量的距离,反映为某类事物在距离上接近或远离的程度,即距离越近的就越相似,越容易归为一类,距离越远就越不同

范数:向量的范数可以简单、形象地理解为向量的长度,或者向量到坐标系原点的距离,或者相应空间内两点之间的距离。
向量的范数定义:向量的范数是一个函数||x||,满足非负性||x|| >= 0,齐次性||cx|| = |c| ||x|| ,三角不等式||x+y|| <= ||x|| + ||y||
L1范数: ||x||为 x 向量各个元素绝对值之和。
L2范数: ||x||为 x 向量各个元素平方和的开方,L2范数又称 Euclidean范数或者Frobenius范数
Lp范数: ||x||为 x 向量各个元素绝对值 p 次方和的 1/p 次方
L∞范数: ||x||为 x 向量各个元素绝对值最大那个元素,如下:


各类距离的意义与Python实现
1.闵可夫斯基距离
闵可夫斯基距离不是一种距离,而是一组距离的定义
两个n维变量间的闵可夫斯基距离定义为:

其中p为一个变参数
p=1时,为曼哈顿距离
p=2时,为欧氏距离
p→∞时,为切比雪夫距离
根据变参数的不同,闵可夫斯基距离可以表示一类的距离

2.欧氏距离
源自于欧式空间中两点间的距离公式

两个n维向量A(x11,x12,…,x1n)与B(x21,x22,…,x2n)间的欧氏距离:


3.曼哈顿距离
曼哈顿距离也成为城市街区距离(City Block Distance),如下图中的红蓝黄线条,它们是相等的,它们即AB间的曼哈顿距离

两个n维向量A(x11,x12,…,x1n)与B(x21,x22,…,x2n)间的曼哈顿距离


4.切比雪夫距离
举个例子:国际象棋中,国王每步可以移动到相邻8个方格中的任意一个,那么国王从格子(x1,y1)移动到格子(x2,y2)需要的步数为max(|x1-x2|,|y1=y2|)步

切比雪夫就是类似于这的一种距离度量方法
两个n维向量A(x11,x12,…,x1n)与B(x21,x22,…,x2n)间的切比雪夫距离:


5.夹角余弦
几何中夹角余弦可用来衡量两个方向间的差异,机器学习中借用此概念来衡量样本向量之间的差异

二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

两个n维样本点A(x11,x12,…,x1n)与B(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度


6.汉明距离
两个等长字符串s1和s2之间的汉明距离定义为将其中一个变成另外一个所需要最小替换的次数。例如字符串“1111”和“1001”之间的汉明距离为2。
汉明距离通常应用于信息编码,为了增强容错性,应使得编码间的最小汉明距离尽可能大。

7.杰卡德相似系数
(1)杰卡德相似系数
两个集合A和B的交集元素在A,B的并集中所占的比例,是衡量两个集合的相似度的一种指标

(2)杰卡德距离
两个集合A和B的不同元素占所有元素的比例,衡量两个集合的区分度

各种距离的python实现
# -*- coding: utf-8 -*-import sys from numpy import *import scipy.spatial.distance as dist# 配置utf-8输出环境reload(sys)sys.setdefaultencoding('utf-8')vector1 = mat([1,2,3])vector2 = mat([4,7,5])#欧氏距离print sqrt((vector1-vector2)*((vector1-vector2).T))#曼哈顿距离print sum(abs(vector1-vector2))#切比雪夫距离print abs(vector1-vector2).max()#夹角余弦Lv1 = sqrt(vector1*vector1.T)Lv2 = sqrt(vector2*vector2.T)cosV12 = vector1*vector2.T/(Lv1*Lv2)print cosV12vector3 = array([1,1,0,1,0,1,0,0,1])vector4 = array([0,1,1,0,0,0,1,1,1])matV = mat([vector3,vector4])print matV#汉明距离smstr = nonzero(matV[0]-matV[1]);print shape(smstr[0])[0]#杰卡德距离print "dist.jaccard:",dist.pdist(matV,'jaccard')

理解随机性
洛伦兹动力学方程描绘出的运动轨迹像一支展开了双翼的蝴蝶,所以又称为蝴蝶效应。

在这之上,确定性和随机性被统一在了一起:一方面,运动的轨迹必然落在“蝴蝶”上,绝不会远离它们而去,这时确定性的表现,表明系统未来的所有运动都被限制在一个明确的范围之内;另一方面,运动轨迹变化缠绕的规则却是随机性的,任何时候你都无法准确判定下一次运动的轨迹将落在“蝴蝶”的哪一侧翅膀的哪一点上。即这个系统运动大的范围是确定的,可预测的;但是运动的细节是随机的,不可预测的。
从统计学角度来看:一方面,样本总体的取值范围一般是确定的,所有样本对象的取值都位于此空间范围内,另一方面,无论搜集再多的样本对象,也不能使这种随机性降低或者消失。因此,随机性是食物的一种根本的、内在的、无法根除的性质,也是一切事物的本质属性。
随机性是隐藏在我们生活中的最普遍规律。

回顾概率论
贝叶斯公式:


多元统计基础
例子:

表中白色部分是水果和颜色两个特征的联合概率分布
灰色部分是两个特征各自取值的边缘概率分布
随机向量的联合概率分布和边缘概率分布描述了对象特征间的概率关系,机器学习中对象及对象构成的矩阵都是多元数据,因此,所有与概率相关的算法都以对象的联合概率分布和边缘概率分布为运算基础。

特征间的相关性
期望:衡量样本某个特征列取值范围的平均值
方差:衡量样本某个特征列取值范围的离散程度
协方差矩阵和相关系数:衡量样本特征列之间线性相关性

相关系数的定义:

相关系数是衡量两个特征列之间相关程度的一种方法,相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明特征列X与Y相关度越高。当X与Y线性相关时,相关系数取值为 1(正线性相关)或-1(负线性相关)。

相关距离的定义


python实现相关系数(2-18岁正常男生体重身高对照例子)
from numpy import *featuremat =mat([[88.5,96.8,104.1,111.3,117.7,124.0,130.0,135.4,140.2,145.3,151.9,159.5,165.9,169.8,171.6,172.3,172.7],[12.54,14.65,16.64,18.98,21.26,24.06,27.33,30.46,33.74,37.69,42.49,48.08,53.37,57.08,59.35,60.68,61.40]])# 计算均值mv1 = mean(featuremat[0]) # 第一列的均值mv2 = mean(featuremat[1]) # 第二列的均值# 计算两列标准差dv1 = std(featuremat[0])dv2 = std(featuremat[1])corref = mean(multiply(featuremat[0]-mv1,featuremat[1]-mv2))/(dv1*dv2)print corref# 使用 numpy 相关系数得到相关系数矩阵print corrcoef(featuremat)
得到结果如下

相关系数矩阵的含义是,如果把第一个特征列作为参照数据(自己与自己的相关程度为1),那么第二个与第一个的相关程度是98%

马氏距离
有 M 个样本向量 X1~Xm,协方差矩阵记为 S,均值记为向量 μ,则其中样本向量X 到 u 的马氏距离表示为:

而其中向量 Xi 与 Xj 之间的马氏距离定义为:

若协方差矩阵是单位矩阵(各个样本向量之间独立同分布) ,则公式就成了:

即欧氏距离

马氏距离的优点:量纲无关,排除变量之间的相关性的干扰

马氏距离的python计算(2-18岁正常男生体重身高对照例子 )
from numpy import *featuremat = mat([[88.5,96.8,104.1,111.3,117.7,124.0,130.0,135.4,140.2,145.3,151.9,159.5,165.9,169.8,171.6,172.3,172.7],[12.54,14.65,16.64,18.98,21.26,24.06,27.33,30.46,33.74,37.69,42.49,48.08,53.37,57.08,59.35,60.68,61.40]])covinv = linalg.inv(cov(featuremat))tp = featuremat.T[0]-featuremat.T[1]distma = sqrt(dot(dot(tp,covinv),tp.T))print distma
得到结果如下


再谈矩阵——空间的变换
这一部分主要回顾了线代知识:向量、向量空间、向量的空间变换、向量组与矩阵的变换(理解矩阵乘法)、线性变换(特征值与特征向量)

重要一点:每个矩阵对应了一个变换,矩阵乘法可以把一个向量变成另一个方向或长度都不同的新向量。
而线性变换下,只发生了伸缩变换,而没有旋转变换,那么这些向量就成为这个矩阵的特征向量,伸缩比例就是特征值。

python实现特征值和特征向量的计算
# -*- coding: utf-8 -*-# Filename : matrix05.pyimport operatorfrom numpy import *eps = 1.0e-6 # 误差量A = mat([[8,1,6],[3,5,7],[4,9,2]])# 手动计算特征值:m,n = shape(A)# Aeig = lambda*I-A = [[lambda-8,-1],[-6;-3,lambda-5,-7],[-4,-9,lambda-2]]# (lambda-8)*(lambda-5)*(lambda-2)-190-24*(5-lambda)-3*(2-lambda)-63*(8-lambda)equationA = [1,-15,-24,360] #得到系数方程矩阵evals = roots(equationA) # 计算矩阵方程的根print "特征值:" ,evals# 矩阵的特征值和特征向量evals, evecs = linalg.eig(A)print "特征值:",evals,"\n特征向量:", evecs# 根据特征值和特征向量,还原原矩阵sigma = evals*eye(m)print evecs*sigma*linalg.inv(evecs)

数据归一化
归一化是一种简单计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为标量,是机器学习的一项基础工作。
在统计学中,归一化的具体作用是归纳统一样本的统计分布性。归一化在(0,1)之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。

数据标准化是归一化的一种形式,本质上也是消除量纲的差异,比较认识。数据的标准化的主要方法是按比例缩放,使之落入一个小的特定区间。 由于特征向量的各个特征的度量单位不同,为了能够特征之间参与评价计算,需要对特征做规范化处理,通过函数变换或统计方法将其数值映射到某个数值区间。