机器学习-随机性、概率论、多元统计、特征间的相关性
随机性
洛伦兹动力学方程:美国气象学家洛伦兹建立了一个描述大气对流状况的数学模型。
洛伦兹动力学方程描绘出的运动轨迹具有一种奇特的形状,像一只展开了双翼的蝴蝶,所以又称为蝴蝶效应。
在这个蝴蝶上,确定性和随机性被统一在一起:一方面,运动的轨迹必然落在蝴蝶上,绝不会离它们而去,这是确定性的表现,表明系统未来的所有运动都被限制在一个明确的范围之内;另一方面,运动轨迹变化缠绕的规则却是随机性的,任何时候你都无法准确判定下一次运动的轨迹将落在蝴蝶的哪一侧翅膀上的哪一点上。
这个系统运动大的范围是确定的、可预测的,但是运动的细节是随机的、不可预测的。
蝴蝶效应说明了两方面的意义:
一方面,样本总体(特征向量)的取值范围一般是确定的,所有样本对象(包括已经存在的和未出现的)的取值都位于此空间范围内
另一方面,无论收集再多的样本对象,也不能使这种随机性降低或者消失
因此,随机性是事物的一种根本的、内在的、无法根除的性质,也是一切事物(概率)的本质属性
概率论
概率论:对事物运动这种不确定性(随机性)的度量就是概率论
概率论的基础概念
样本(样本点):原指随机实验的一个结果,可以理解为矩阵中的一个对象
样本空间:原指随机实验所有结果的集合,可以理解为矩阵的所有对象
随机事件:指样本空间的一个子集,可以理解为某个分类,它实际指向一种概率分布
随机变量:可以理解为指向某个事件的一个变量
随机变量的概率分布:给定随机变量的取值范围,导致某种随机事件出现的可能性。从机器学习的角度来看,就是符合随机变量取值范围的某个对象属于某个类别或服从某种趋势的可能性。
贝叶斯公式
P(A|B) = P(B|A)P(A) / P(B) = P(B,A) / P(B)
例子:10个苹果(8个红色,2个黄色),10个梨子(9个黄色,1个绿色),假如从这堆水果中跳出一个黄色水果,问这个水果属于梨的可能性。
P(梨|黄色) = P(黄色|梨)P(梨) / P(黄色) = P(黄色,梨) / P(黄色)
P(黄色|梨) = 0.9
P(梨) = 10/20 = 0.5
P(黄色) = (2 + 9) / 20 = 11/20
P(梨|黄色) = (0.9*0.5) / (11/20) = 0.45/ (11/20) = 0.818 = 81.8%
多元统计基础
矩阵是具有相同特征和维度的对象集合,其中每个对象,也称为行向量,都具有一个以上的特征。如果每个特征都用一个随机变量来表示,那么从概率论的角度,一个对象就可以表示为n个随机变量的整体,其中X=(X1,X2,....Xn)为n维随机变量或随机向量。
每个对象就是随机向量的一组取值,矩阵中的所有对象构成了随机向量的联合和边缘概率分布。
随机向量的联合概率分布和边缘概率分布描述了对象特征间的概率关系。在机器学习中,对象与对象构成的矩阵都是多元数据,因此,所有与概率相关的算法都以对象的联合概率分布和边缘概率分布为运算基础。
特征间的相关性
特征列的研究主要应用于预测活动,(在一个时间序列上观察两列数据之间的相关性)
随机变量,一般是一个向量,可以包含不同取值范围的多个变量。
期望:衡量样本某个特征列取值范围的平均值。
方差:衡量样本某个特征列取值范围的离散程度
协方差矩阵和相关系数:衡量样本特征列之间线性相关性
1.相关系数(Correlation Coefficient)与相关距离(Correlation Distance)
(1).相关系数的定义
相关关系是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。
简单相关系数:又叫相关系数或线性相关系数,一般用字母r表示,用来度量两个变量间的线性关系。
其中Cov(X,Y)为X与Y的协方差;Var[X]为X的方差,Var[Y]为Y的方差。
复相关系数:又叫多重相关系数,复相关是指因变量与多个自变量之间的关系,例如,某种商品的季节性需求量与其价格水平、职工收入水平等现象之间呈现复相关关系。
典型相关系数:是先对原来各组变量进行主成分分析,得到新的线性关系的综合指标,再通过综合指标之间的线性相关系数来研究原各组变量间相关关系。
ρxy是一个可以表征x和y之间线性关系紧密程度的量,特性如下
|ρxy| <= 1
|ρxy| <= 1的充要条件是,存在常数a和b,使得P{Y=a+bX} = 1
相关系数是衡量两个特征列之间相关程度的一种方法,其取值范围是[-1,1].相关系数的值越大,表明特征列X与Y的相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)
(2).相关距离的定义
Dxy = 1- ρxy
2.马氏距离(Mahalanobis Distance)
马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示点与一个分布之间的距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是,它考虑到各种特性之间的联系(例如):条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的),并且是尺度无关的(scale-invariant),即独立于测量尺度。对于一个均值为μ,协方差矩阵为Σ的多变量向量,其马氏距离为sqrt( (x-μ)'Σ^(-1)(x-μ) )。
若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式变成了欧氏距离公式 sqrt( (x-μ)'(x-μ) )。
若协方差矩阵是对角矩阵,则公式变成了标准欧氏距离公式
马氏距离优点:量纲无关,排除变量之间的相关性的干扰
马氏与欧式距离的比较:
1)马氏距离的计算是建立在总体样本的基础上的,这一点可以从上述协方差矩阵的解释中可以得出,也就是说,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同;
2)在计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧氏距离计算即可。
3)还有一种情况,满足了条件总体样本数大于样本的维数,但是协方差矩阵的逆矩阵仍然不存在,比如三个样本点(3,4),(5,6)和(7,8),这种情况是因为这三个样本在其所处的二维空间平面内共线。这种情况下,也采用欧氏距离计算。
4)在实际应用中“总体样本数大于样本的维数”这个条件是很容易满足的,而所有样本点出现3)中所描述的情况是很少出现的,所以在绝大多数情况下,马氏距离是可以顺利计算的,但是马氏距离的计算是不稳定的,不稳定的来源是协方差矩阵,这也是马氏距离与欧氏距离的最大差异之处。
马氏距离的优劣:
优点:它不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关,由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰。
缺点:它的缺点是夸大了变化微小的变量的作用。 [1]
如果用dij表示第i个样品和第j个样品之间的距离,那么对一切i,j和k,dij应该满足如下四个条件:
①当且仅当i=j时,dij=0
②dij>0
③dij=dji(对称性)
④dij≤dik+dkj(三角不等式)
显然,欧氏距离满足以上四个条件。满足以上条件的函数有多种,本节将要用到的马氏距离也是其中的一种。
第i个样品与第j个样品的马氏距离dij用下式计算:
dij =((x i 一x j)TS-1(x i一xj) )1/2(T、-1、1/2都是上标)
其中,T表示转置,x i 和x j分别为第i个和第j个样品的m个指标所组成的向量,S为样本协方差矩阵。
马氏距离在回归分析中,是测量某一自变量的观测量与同一自变量所有观测量平均值差异的统计量,此值越大,说明该观测量为影响点的可能性越大。
spss操作为:“分析”~“回归”~“线性”~“统计”对话框~“残差”栏~Mahalanobis距离
求相关系数代码
from numpy import * # 相关系数计算 featureMat = mat([[88.5, 96.8, 104.1, 111.3, 117.7, 124.0], [12.54, 14.65, 16.64, 18.98, 21.26, 24.06]]) # 计算均值 # 第一列的均值 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相关系数得到相关系数矩阵 # [[1. 0.99464989] # [0.99464989 1. ]] # 相关系数矩阵的含义是:如果把第一个特征列作为参照数据(自己与自己的相关程度为1),那么第二个与第一个的相关程度是99% print(corrcoef(featureMat))
马氏距离代码
from numpy import * import numpy as np import scipy.spatial.distance as dist #马氏距离 def mahalanobis(featureMat): covinv = linalg.inv(cov(featureMat)) tp = featureMat.T[0] - featureMat.T[1] distma = sqrt(dot(dot(tp, covinv), tp.T)) return distma featureMat = mat([[88.5, 96.8, 104.1, 111.3, 117.7, 124.0], [12.54, 14.65, 16.64, 18.98, 21.26, 24.06]]) print('马氏距离:', mahalanobis(featureMat))