EM算法及其推广
EM算法
对于一般概率模型的学习策略,我们往往会采取极大似然估计或者贝叶斯估计的方法对模型的参数进行估计,但是需要注意的是这种估计方法都是建立在待估参数全部为已经知道结果的参数的基础之上的(complete-data problem)。当模型中有隐变量/潜在变量(数据不可观测的变量)时,似然函数的最大化变得困难。这是就可以使用EM算法,EM算法是在不完全数据下求解MLE估计结果的一种近似求解方法,用迭代去逼近原来不完整数据问题的结果。EM算法主要分为两步:
E:求期望(expectation)
M:求极大(maximization)
EM算法的核心思想是在既定样本数据下在因变量最有可能的分布状态下利用极大似然估计模型的参数。
算法导出
针对一个含有隐变量的概率模型,这里假设隐变量为Z,观测数据Y关于参数θ\thetaθ的对数似然函数为L(θ)L(\theta)L(θ):
\begin{equation}
\begin{aligned}
L(\theta) & = \log P(Y|\theta)=log\sum_{Z}P(Y,Z|\theta)\\
&=\log\ ...
Logistic Regression
当因变量的类型属于二元(1 / 0,真/假,是/否)变量时,应该使用逻辑回归。这里,Y的值为0或1,它可以用以下方程表示:
\begin{equation*}
\begin{aligned}
odds &= \frac{p}{1-p}\\
&=\frac{probability\hspace{5pt} of\hspace{5pt} event\hspace{5pt} occurrence}{probability\hspace{5pt} of\hspace{5pt} not\hspace{5pt} event \hspace{5pt}
{}occurrence}
\end{aligned}
\end{equation*}
其中有:
logit(p)=log(odds)=b0+b1X1+⋯+bkXklogit(p)=\log(odds)=b_0+b_1X_1+\dots+b_kX_k
logit(p)=log(odds)=b0+b1X1+⋯+bkXk
为什么要在公式中使用对数log呢?因为在这里使用的是二项分布(因变量),需要选择一个 ...
监督学习方法
Perceptro n &LR& Boosting
\begin{align*}
&Perceptron:\sum-yf_w(x)\\
&LR:\log_2(1+\exp(-yf_w(x))\\
&AdaBoost:\exp(-yf_w(x))
\end{align*}
可以看出,相较于简单的感知机模型,后两种模型的损失函数更加光滑,且对噪声数据比较明显(分类错误误差的增加比较多)
函数
Parameters and Arguments?
Parameters、 Arguments两个单词虽然都翻译成参数的含义,但是其实这两个单词是有区别的,大概就是形参与实参的区别:
A parameter is the variable defined within the parentheses during function definition.
An argument is a value that is passed to a function when it is called. It might be a variable, value or object passed to a function or method as input.
python的输入参数主要分为位置参数(Positional Arguments)和关键词参数(Keyword Arguments)。
也就是说python在定义函数时的参数(parameter)是不分位置参数和关键词参数的,只有在调用时才会区别区分这两种参数,或者理解成以位置/关键词参数的形式传递参数
位置参数
位置参数是我 ...
python内置函数
Python很贴心地将一些常用的功能设置成了内置函数。 这些函数无须从模块中导入,也无须定义就可以在任意位置直接调用。
除了平时我们会用到的一些求字符串长度的简单内置函数,python还给提供了几种相对高级一点的内置函数。善用这些给出的内置函数能够使得代码更加简洁!
lambda函数
lambda函数是用来快速创建一个自定义匿名函数的,省去了平时需要用到的def 结构,例如:
f=lambda x: x*2+1f(3)
执行结果为7
捕获变量值
有的时候我们在定义匿名函数时,可能希望该函数能使用某变量的值,这样的话可以实现对定义函数的"动态更新",但需要注意的是,匿名函数定义时并不会记录变量的值,而是会在调用该函数时去捕捉变量的值:
c=10f=lambda x:x+cc=30g=lambda x:x+cprint(f(20),g(20))#要解决这个问题可以在声明函数时设置变量的默认值c=10f=lambda x,c=c:x+cc=30g=lambda x,c=c:x+cprint(f(20),g(20))
map函数
map函数的输入值是一个映射关系和一个序列( ...
模型评价基础
机器学习训练模型用的数据集和测试数据用的训练集互斥,往往通过测试集的测试误差来近似模型的泛化能力,根据模型的泛化能力评价模型的优劣。
误差是学习器的实际预测输出与样本的真实输出之间的差异。
训练误差,或称经验误差,是学习器在训练集上的误差。
学习器在在新样本上的误差,称为泛化误差。
模型评价主要是根据训练误差和泛化误差,来选择最优的模型及其参数的过程。
回归模型评价方法
6个评价指标:
平均绝对误差:所有样本实际值与预测值差值绝对值和的平均值
均方差((Mean Squared Error,MSE):实际值与预测值差的平方的和的平均值
解释回归模型的方差得分(Explained Variance Score):
explained_variance(y,y^)=1−Var{y−y^}Var{y}explained\_variance(y,\hat{y})=1-\dfrac{Var\{y-\hat{y} \}}{Var\{y\}}
explained_variance(y,y^)=1−Var{y}Var{y−y^}
取值范围[0,1],真实值与预测值差值的方差越小,值越接 ...
Python的抽象魔法--类
面向对象简介
面向对象使得我们可以只去关注一件事情的参与者就好了,而不用关注参与者以外的东西。
面向对象的好处
一般来说,提及面向对象而不是直接使用全局变量或者函数的好处有以下三个:
多态
多态( polymorphism)源自希腊语,意思是“有多种形态”。多态赋予了我们不需要关注对象的类型就可以对其进行操作的能力。不同对象可以定义相同的方法,进而通过object.method()即可对对象进行操作,只要我们调用的对象拥有我们需要的方法,我们就可以对对象进行操作(操作的行为也会随着对象所属的类而不一样)。
拿方法count()举一个简单的例子:
x=['hello, World',[1,2,'e','e',4]]print(x.count('e'))
我们并不关心x到底是什么对象(list or str),我们关心的只是x里边到底有多少个e。只要x里有一个名为 count()的方法,借助这个方法我们能实现我们希望返回的整数,这就足够了。
每当无需知道对象是什么样的就能对其执行操作时,都是多态在起作用。
...
决策树模型
人们的决策过程是一个类似“观察因素A的情况,再根据A的情况观察因素B的情况”的形式,从而形成一种树状结构。决策树学习是模仿人类这一结构化决策过程而发展起来的一种有监督机器学习方法。
它可以被认为是if-then规则的集合,也可以被认为是定义在特征空间和类空间上的条件概率分布。
模型具有可读性
分类速度快
决策树的思想主要来源于Quinlan在1986年提出的ID3和1993提出的C4.5算法,以及由Breiman等人1984年提出的CART算法。
模型
决策树学习本质上是从训练数据集中归纳出一组分类规则或者条件概率模型(在节点处取条件概率最大的进行分类)。决策树问题一般可以分成特征选择、决策树生成、剪枝三部分。
特征选择:通过建立一个函数来衡量特征划分的效果
生成:递归构造决策树的过程
剪枝:递归产生的决策树往往会递归到不能分类为止,这会导致出现过拟合现象,因此需要已经生成的决策树进行剪枝(pruning),一般是通过极小化决策树整体的损失函数(loss function)或者代价函数(cost function)来实现。
剪枝也可以看成是对模型的正则化(Reaulariza ...
朴素贝叶斯(Naive Bayes)
典型的生成学习方法,基本假设是条件独立性
模型算法
朴素贝叶斯法通过训练数据集学习联合概率分布P(X,Y),具体方法是通过参数估计的方法学习类标签的先验概率和对应的条件概率分布,然后利用贝叶斯公式对后验概率进行计算,将后验概率最大的类进行输出。
在实际计算的过程中,由于条件概率分布的参数过多,在数据量不是特别大的时候难以求得联合概率分布,于是作了条件独立性的假设(Conditionally Independent)(名字的来源,高效易实现,但分类的性能不一定高),得到最终的朴素贝叶斯分类器:
分母完全相同,上式演变为:
参数估计
极大似然估计
参数估计一般采用极大似然估计:
朴素贝叶斯估计
实际运用过程中为了避免估计的概率值为零的情况(放大了单一特征对评估结果的影响,比如一个长头发的男人会被判为出现概率为0,会影响后验概率的计算结果),一般采用贝叶斯估计:
后验概率最大化=期望风险最小化(0-1损失函数)
可以通过证明发现,后验概率最大意味着期望风险值是最小化的。同样的输入数据,当后验概率最大时,分错的期望风险也是最小的。
当变量是连续变量时,计算概率则需要其他的方法(高斯 ...
复制与拷贝
变量间的复制操作和拷贝操作的区别主要体现在对对象的复制和拷贝上。
创建对象时,应该是先创建对象,然后将对象的地址返回给被赋值的变量。这也导致两个变量之间的赋值操作只是存储地址的复制,因此两个变量可以视为完全一样的变量。
而对于copy命令来说,无论是浅拷贝copy还是深拷贝deepcopy,对对象的copy都会创建一个新的存储地址,因此拷贝对象的存储地址会发生改变。
deepcopy和copy的主要区别在于是否会对拷贝对象的子对象进行拷贝,浅拷贝不拷贝子对象,即子对象的存储地址是和源对象保持一致的。而深度拷贝则会通过递归拷贝将子对象一并拷贝,因此二者的子对象指向的位置是不一样的。
拷贝和复制的操作是无法通过直接观察拷贝结果来判断的,因为不管是哪种操作都会把值复制一遍,区别是是否会为这个 值创建新的地址。
from copy import copy, deepcopyclass Age(): passclass Name(): passclass Student(): def __init__(self,name,age) -> None: sel ...