《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第1章 统计学习方法概论

文章目录

  • 第1章 统计学习方法概论
    • 1.1 统计学习
      • 1.统计学习的特点
      • 2.统计学习的对象
      • 3.统计学习的目的
      • 4.统计学习的方法
      • 1.2.1 基本概念
      • 1.2.2 问题的形式化
    • 1.3 统计学习三要素
      • 1.3.1 模型
      • 1.3.2 策略
      • 1.3.3 算法
    • 1.4 模型评估与模型选择
      • 1.4.1 训练误差与测试误差
      • 1.4.2 过拟合与模型选择
    • 1.5 正则化与交叉验证
      • 1.5.1 正则化
      • 1.5.2 交叉验证
    • 1.6 泛化能力
      • 1.6.1 泛化误差
      • 1.6.2 泛化误差上界
    • 1.7 生成模型与判别模型
    • 1.8 分类问题
    • 1.9 标注问题
    • 1.10 回归问题
    • 代码练习:使用最小二乘法拟和曲线

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第1章 统计学习方法概论

我算是有点基础的(有过深度学习和机器学的项目经验),但也是半路出家,无论是学Python还是深度学习,都是从问题出发,边查边做,没有系统的学过相关的知识,这样的好处是入门快(如果想快速入门,大家也可以试试,直接上手项目,从小项目开始),但也存在一个严重的问题就是,很多东西一知半解,容易走进死胡同出不来(感觉有点像陷入局部最优解,找不到出路),所以打算系统的学习几本口碑比较不错的书籍。
  书籍选择: 当然,机器学习相关的书籍有很多,很多英文版的神书,据说读英文版的书会更好,奈何英文不太好,比较难啃。国内也有很多书,周志华老师的“西瓜书”我也有了解过,看了前几章,个人感觉他肯能对初学者更友好一点,讲述的非常清楚,有很多描述性的内容。对比下来,更喜欢《统计学习方法》,毕竟能坚持看完才最重要。
  笔记内容: 笔记内容尽量省去了公式推导的部分,一方面latex编辑太费时间了,另一方面,我觉得公式一定要自己推到一边才有用(最好是手写)。尽量保留所有标题,但内容会有删减,通过标黑和列表的形式突出重点内容,要特意说一下,标灰的部分大家最好读一下(这部分是我觉得比较繁琐,但又不想删掉的部分)。
  代码实现: 最后是本章内容的实践,如果想要对应的.ipynb文件,可以留言

第1章 统计学习方法概论

本章主要内容:

  • 叙述统计学习的定义、研究对象与方法;
  • 叙述监督学习(这是本书的主要内容);
  • 统计学习方法的三要素:模型、策略算法
  • 介绍模型选择,包括正则化、交叉验证与学习的泛化能力
  • 介绍生成模型判别模型
  • 介绍监督学习方法的应用:分类问题、标注问题与回归问题

1.1 统计学习

1.统计学习的特点

  统计学习(statistical learning)是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。统计学习也称为统计机器学习(statistical machine learning)。

  现在,当人们提及机器学习时,往往 是指统计机器学习。

2.统计学习的对象

  统计学习的对象是数据(data)。它从数据出发,提取数据的特征,抽象出数据的模型,发现数据中的知识,又回到对数据的分析与预测中去。

3.统计学习的目的

  统计学习用于对数据进行预测与分析,特别是对未知新数据进行预测与分析。

  统计学习总的目标就是考虑学习什么样的模型和如何学习模型,以使模型能对数据进行准确的预测与分析,同时也要考虑尽可能地提高学习效率。

4.统计学习的方法

  统计学习的方法是基于数据构建统计模型从而对数据进行预测与分析

  统计学习由监督学习(supervised learning)、非监督学习(unsupervised learning)、半监督学习(semi-supervised learning)和强化学习(reinforcement learning)等组成。

本书主要讨论监督学习

  • 从给定的、有限的、用于学习的训练数据(training data)集合出发,假设数据是独立同分布产生的;
  • 并且假设要学习的模型属于某个函数的集合,称为假设空间(hypothesis space);
  • 应用某个评价准则(evaluation criterion),从假设空间中选取一个最优的模型,使它对已知训练数据及未知测试数据(test data)在给定的评价准则下有最优的预测;
  • 最优模型的选取由算法实现。

  这样,统计学习方法包括模型的假设空间模型选择的准则以及模型学习的算法,称其为统计学习方法的三要素,简称为模型(model)、策略(strategy)和算法(algorithm)。

实现统计学习方法的步骤如下:

  • (1)得到一个有限的训练数据集合;
  • (2)确定包含所有可能的模型的假设空间,即学习模型的集合;
  • (3)确定模型选择的准则,即学习的策略;
  • (4)实现求解最优模型的算法,即学习的算法;
  • (5)通过学习方法选择最优模型;
  • (6)利用学习的最优模型对新数据进行预测或分析。

1.2.1 基本概念

1.输入空间、特征空间输出空间

  在监督学习中,将输入与输出所有可能取值的集合分别称为输入空间(input space)与输出空间(output space)。

  • 输入与输出空间可以是有限元素的集合,也可以是整个欧氏空间。
  • 输入空间与输出空间可以是同一个空间,也可以是不同的空间;但通常输出空间 远远小于输入空间。
  • 每个具体的输入是一个实例(instance),通常由特征向量(feature vector)表示。这时,所有特征向量存在的空间称为特征空间(feature space)。特征空间的每一维对应于 一个特征。
    • 有时假设输入空间特征空间为相同的空间,对它们不予区分;
    • 有时假设输入空间与特征空间为不同的空间,将实例从输入空间映射到特征空间。模型实际上都是定义在特征空间上的。
  • 在监督学习过程中,将输入与输出看作是定义在输入(特征)空间与输出空间上的随机变量的取值。
    • 输入、输出变量用大写字母表示,习惯上输入变量写作X,输出变量写作 Y。输入、输出变量所取的值用小写字母表示,输入变量的取值写作x,输出变量的取值 写作y。
    • 变量可以是标量或向量,都用相同类型字母表示。

输入实例x的特征向量记作:
x = ( x ( 1 ) ) , ( x ( 2 ) ) , . . . ( x ( i ) ) , . . . . , ( x ( n ) ) ) T x={(x^{(1)}),(x^{(2)}),...(x^{(i)}),....,(x^{(n))})}^T x=(x(1)),(x(2)),...(x(i)),....,(x(n)))T
x i = ( x i ( 1 ) ) , ( x i ( 2 ) ) , . . . ( x i ( i ) ) , . . . . , ( x i ( n ) ) T x_i={(x^{(1)}_i),(x^{(2)}_i),...(x^{(i)}_i),....,(x^{(n)}_i)}^T xi=(xi(1)),(xi(2)),...(xi(i)),....,(xi(n))T

x ( i ) x^{(i)} x(i)表示 x x x的第 i i i个特征; x i x_i xi表示多个输入变量中的第 i i i个。

输入变量X和输出变量Y有不同的类型,可以是连续的,也可以是离散的。

  • 输入变量与输出变量均为连续变量的预测问题称为回归问题
  • 输出变量为有限个离散变量的预测问题称为分类问题
  • 输 入变量与输出变量均为变量序列的预测问题称为标注问题

2.联合概率分布

  监督学习假设输入与输出的随机变量X和Y遵循联合概率分布P(X,Y)。P(X,Y)表示分布函数,或分布密度函数。

注意,在学习过程中,假定这一联合概率分布存在,但对学习 系统来说,联合概率分布的具体定义是未知的。训练数据与测试数据被看作是依联合概率分布P(X,Y)独立同分布产生的。统计学习假设数据存在一定的统计规律,X和Y具有联合概率分布的假设就是监督学习关于数据的基本假设。

3.假设空间

  监督学习的目的在于学习一个由输入到输出的映射,这一映射由模型来表示。

换句话说,学习的目的就在于找到最好的这样的模型。模型属于由输入空间到输出空间的映射的集合,这个集合就是假设空间(hypothesis space)。假设空间的确定意味着学习范围的确定。

1.2.2 问题的形式化

在这里插入图片描述
  监督学习中,假设训练数据测试数据是依联合概率分布P(X,Y)独立同分布产生的。

  在学习过程中,学习系统利用给定的训练数据集,通过学习(或训练)得到一个模型,表示为条件概率分布 (Y|X)决策函数Y= (X)。(条件概率分布 (Y|X)或决策函数Y= (X)描述输入与输出随机变量之间的映射关系。)

  对输入$x_i ,一个具体的模型 ,一个具体的模型 ,一个具体的模型y=f(x) 可以产生一个输出 可以产生一个输出 可以产生一个输出 f(x_i) ,而训练数据集中对应的输出是 ,而训练数据集中对应的输出是 ,而训练数据集中对应的输出是y_i ,如果这个模型有很好的预测能力,训练样本输出 ,如果这个模型有很好的预测能力,训练样本输出 ,如果这个模型有很好的预测能力,训练样本输出y_i$ 和模型输出 f ( x i ) f(x_i ) f(xi)之间的差就应该足够小。

  学习系统通过不断的尝试,选取最好的模型,以便对训练数据集有足够好的预测,同时对未知的测试数据集的预测也有尽可能好的推广。

1.3 统计学习三要素

  统计学习方法都是由模型、策略和算法构成的,即统计学习方法由三要素构成,可以 简单地表示为 方法=模型+策略+算法。

1.3.1 模型

  在监督学习过程中,模型就是所要学习的条件概率分布或决策函数。模型的假设空间(hypothesis space)包含所有可能的条件 、概率分布或决策函数。

本书中称:

  • 决策函数表示的模型为非概率模型

F = f ∣ Y = f ( X ) F={f|Y=f(X)} F=fY=f(X)

  • 条件概率表示的模型为概率模型

F = P ∣ P ( Y ∣ X ) F={P|P(Y|X)} F=PP(YX)

1.3.2 策略

  统计学习的目标在于从假设空间中选取最优模型。

  首先引入损失函数与风险函数的概念。

  损失函数度量模型一次预测的好坏,风险函数度量平均意义下模型预测的好坏。

1.损失函数和风险函数

  监督学习问题是在假设空间中选取模型f作为决策函数,对于给定的输入X,由f(X)给出相应的输出Y,这个输出的预测值f(X)与真实值Y可能一致也可能不一致,用一个损失函数(loss function)或代价函数(cost function)来度量预测错误的程度。损失函数值越小,模型就越好。

  举一个例子:对数损失函数(logarithmic loss function)或对数似然损失函数(loglikelihood
loss function)

L ( Y , P ( Y ∣ X ) ) = − l o g P ( Y ∣ X ) L(Y,P(Y|X))=-logP(Y|X) L(Y,P(YX))=logP(YX)

  损失函数的期望是理论上模型f(X)关于联合分布P(X,Y)的平均意义下的损失,称为风险函数(risk function)或期望损失(expected loss):

R e m p ( f ) = E p [ L ( Y , f ( X ) ) ] = ∫ ( x × y ) L ( y , f ( x ) ) P ( x , y ) d x d y R_{emp}(f)=E_p[L(Y,f(X))]=\int_{(x\times y)}{L(y,f(x))P(x,y)dxdy} Remp(f)=Ep[L(Y,f(X))]=(x×y)L(y,f(x))P(x,y)dxdy

  学习的目标就是选择期望风险最小的模型。

  由于联合分布P(X,Y)是未知的,Rexp(f)不能直接计算。实际上,如果知道联合分布P(X,Y),可以从联合分布直接求出条件概率分布 P(Y|X),也就不需要学习了。正因为不知道联合概率分布,所以才需要进行学习。这样一来,一方面根据期望风险最小学习模型要用到联合分布,另一方面联合分布又是未知的, 所以监督学习就成为一个病态问题(ill-formed problem)。

  模型f(X)关于训练数据集的平均损失称为经验风险(empirical risk)或经验损失(empirical loss)

R e m p ( f ) = 1 N ∑ N i = 1 L ( y i , f ( x i ) ) R_{emp}(f)=\frac{1}{N}\sum_N^{i=1}{L(y_i,f(x_i))} Remp(f)=N1Ni=1L(yi,f(xi))

  • 损失函数(loss function):预测值f(X)与真实值Y的差距(非负)
  • 风险函数(risk function):损失函数的期望(模型f(X)关于联合分布P(X,Y)的平均意义下的损失)
  • 经验风险(empirical risk):模型f(X)关于训练数据集平均损失

  期望风险Rexp(f)是模型关于联合分布的期望损失,经验风险 R e m p ( f ) R_{emp} (f) Remp(f)是模型关于训练样本集的平均损失。根据大数定律,当样本容量N趋于无穷时,经验风险 R e m p ( f ) R_{emp} (f) Remp(f)趋于期望风险 R e x p ( f ) R_{exp}(f) Rexp(f)。所以一个很自然的想法是用经验风险估计期望风险

  但是,由于现实中训练样本数目有限,甚至很小,所以用经验风险估计期望风险常常并不理想,要对经验风险进行 一定的矫正。这就关系到监督学习的两个基本策略:经验风险最小化结构风险最小化

2.经验风险最小化与结构风险最小化

经验风险最小化

  在假设空间、损失函数以及训练数据集确定的情况下,经验风险函数式就可以确定。经验风险最小化(empirical risk minimization,ERM)的策略认为,经验风险最小的模型是最优的模型。根据这一策略,按照经验风险最小化求最优模型就是求解最优化问题:

m i n f ∈ F 1 N ∑ N i = 1 L ( y i , f ( x i ) ) min_{f\in F}\frac{1}{N}\sum_N^{i=1}{L(y_i,f(x_i))} minfFN1Ni=1L(yi,f(xi))

其中, F是假设空间。

  比如,极大似然估计(maximum likelihood estimation)就是经验风险最小化的一个例 子。当模型是条件概率分布,损失函数是对数损失函数时,经验风险最小化就等价于极大 似然估计。

结构风险最小化

  结构风险最小化(structural risk minimization,SRM)是为了防止过拟合而提出来的策略。结构风险最小化等价于正则化(regularization)。结构风险在经验风险上加上表示模型复杂度的正则化项(regularizer)或罚项(penalty term)。在假设空间、损失函数以 及训练数据集确定的情况下,结构风险的定义是

R e m p ( f ) = 1 N ∑ N i = 1 L ( y i , f ( x i ) ) + λ J ( f ) R_{emp}(f)=\frac{1}{N}\sum_N^{i=1}{L(y_i,f(x_i))}+λJ(f) Remp(f)=N1Ni=1L(yi,f(xi))+λJ(f)

其中J(f)为模型的复杂度,是定义在假设空间上的泛函。

  • 模型f越复杂,复杂度J(f)就越 大;
  • 反之,模型f越简单,复杂度J(f)就越小。

  也就是说,复杂度表示了对复杂模型的惩 \罚。 λ≥0是系数,用以权衡经验风险和模型复杂度。结构风险小需要经验风险与模型复杂度同时小。结构风险小的模型往往对训练数据以及未知的测试数据都有较好的预测

1.3.3 算法

  算法是指学习模型的具体计算方法。

统计学习基于训练数据集,根据学习策略,从假设空间中选择最优模型,最后需要考虑用什么样的计算方法求解最优模型。

这时,统计学习问题归结为最优化问题,统计学习的算法成为求解最优化问题的算法。

如果最优化问题有显式的解析解,这个最优化问题就比较简单。但通常解析解不存在,这就需要用数值计算的方法求解。如何保证找到全局最优解,并使求解的过程非常高效,就成为一个重要问题。

1.4 模型评估与模型选择

1.4.1 训练误差与测试误差

  统计学习的目的是使学到的模型不仅对已知数据而且对未知数据都能有很好的预测能力。

不同的学习方法会给出不同的模型。当损失函数给定时,基于损失函数的模型的训练误差(training error)和模型的测试误差(test error)就自然成为学习方法评估的标准。注意,统计学习方法具体采用的损失函数未必是评估时使用的损失函数。

1.4.2 过拟合与模型选择

  当假设空间含有不同复杂度(例如,不同的参数个数)的模型时,就要面临模型选择(model selection)的问题。

  我们希望选择或学习一个合适的模型。如果在假设空间中存在“真”模型,那么所选择的模型应该逼近真模型。具体地,所选择的模型要与真模型的参数个数相同,所选择的模型的参数向量与真模型的参数向量相近。

  如果一味追求提高对训练数据的预测能力,所选模型的复杂度则往往会比真模型更高。这种现象称为过拟合(over-fitting)过拟合是指学习时选择的模型所包含的参数过多,以致于出现这一模型对已知数据预测得很好,但对未知数据预测得很差的现象。

  下图描述了训练误差测试误差模型的复杂度之间的关系。
在这里插入图片描述

  当模型的复杂度增大时,训练误差会逐渐减小并趋向于0;
  而测试误差会先减小,达到最小值后又增大。
  当选择的模型复杂度过大时,过拟合现象就会发生。
  这样,在学习时就要防止过拟合,进行最优的模型选择,即选择复杂度适当的模型,以达到使测试误差最小的学习目的。

1.5 正则化与交叉验证

1.5.1 正则化

  模型选择的典型方法是正则化(regularization)。正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项(regularizer)或罚项(penalty term)。正则化项一般 是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。

正则化一般具有如下形式:

m i n f ∈ F 1 N ∑ N i = 1 L ( y i , f ( x i ) ) + λ J ( f ) min_{f\in F} \frac{1}{N}\sum_N^{i=1}{L(y_i,f(x_i))}+λJ(f) minfFN1Ni=1L(yi,f(xi))+λJ(f)

  其中,第1项是经验风险,第2项是正则化项, λ≥0为调整两者之间关系的系数

1.5.2 交叉验证

  另一种常用的模型选择方法是交叉验证(cross validation)。

  如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集(training set)、验证集(validation set)和测试集(test set)。训练集用来训练模型,验证集用于模型的选择,而测试集用于最终对学习方法的评估。

1.简单交叉验证

  简单交叉验证方法是:首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集(例如,70%的数据为训练集,30%的数据为测试集);然后用训练集在 各种条件下(例如,不同的参数个数)训练模型,从而得到不同的模型;在测试集上评价 各个模型的测试误差,选出测试误差最小的模型。

2.S折交叉验证

  应用最多的是S折交叉验证(S-fold cross validation),方法如下:首先随机地将已给数据切分为S个互不相交的大小相同的子集;然后利用S-1个子集的数据训练模型,利用余 下的子集测试模型;将这一过程对可能的S种选择重复进行;最后选出S次评测中平均测 试误差最小的模型。

3.留一交叉验证

  S折交叉验证的特殊情形是S=N,称为留一交叉验证(leave-one-out cross validation),往往在数据缺乏的情况下使用。这里,N是给定数据集的容量。

1.6 泛化能力

1.6.1 泛化误差

  学习方法的泛化能力(generalization ability)是指由该方法学习到的模型对未知数据的预测能力,统计学习理论试图从理论上对学习方法的泛化能力进行分析。 首先给出泛化误差的定义。如果学到的模型是 f ^ \hat{f} f^ ,那么用这个模型对未知数据预测的 误差即为泛化误差(generalization error)

R e x p ( f ^ = E p [ L ( Y , f ^ ( X ) ) ] = ∫ x × y L ( y , f ^ ( x ) P ( x , y ) d x d y ) R_{exp}(\hat{f}=E_p[L(Y,\hat{f}(X))]=\int_{x\times{y}}L(y,\hat{f}(x)P(x,y)dxdy) Rexp(f^=Ep[L(Y,f^(X))]=x×yL(y,f^(x)P(x,y)dxdy)

  泛化误差反映了学习方法的泛化能力,如果一种方法学习的模型比另一种方法学习的模型具有更小的泛化误差,那么这种方法就更有效。事实上,泛化误差就是所学习到的模型的期望风险。

1.6.2 泛化误差上界

  学习方法的泛化能力分析往往是通过研究泛化误差的概率上界进行的,简称为泛化误差上界(generalization error bound)。

  具体来说,就是通过比较两种学习方法的泛化误差上界的大小来比较它们的优劣

  泛化误差上界通常具有以下性质

  • 它是样本容量的函数, 当样本容量增加时,泛化上界趋于0
  • 它是假设空间容量(capacity)的函数,假设空间容量越大,模型就越难学泛化误差上界就越大。

1.7 生成模型与判别模型

  监督学习的任务就是学习一个模型,应用这一模型,对给定的输入预测相应的输出。 这个模型的一般形式为决策函数

Y = f ( X ) Y=f(X) Y=f(X)

  或者条件概率分布

Y = P ( Y ∣ X ) Y=P(Y|X) YP(YX)

  监督学习方法又可以分为生成方法(generative approach)和判别方法(discriminative approach)。所学到的模型分别称为生成模型(generative model)和判别模型(discriminative model)。

生成方法

   生成方法由数据学习联合概率分布 P ( X , Y ) P(X,Y) P(X,Y),然后求出条件概率分布 P ( Y ∣ X ) P(Y|X) P(YX)作为预测的模型,即生成模型:

P ( Y ∣ X ) = P ( X , Y ) P ( X ) P(Y|X)=\frac{P(X,Y)}{P(X)} P(YX)=P(X)P(X,Y)

  这样的方法之所以称为生成方法,是因为模型表示了给定输入 X X X产生输出 Y Y Y的生成关系。典型的生成模型有:朴素贝叶斯法和隐马尔可夫模型。

判别方法

  判别方法由数据直接学习决策函数 f ( X ) f(X) f(X)或者条件概率分布 P ( Y ∣ X ) P(Y|X) P(YX)作为预测的模型,即判别模型。

  判别方法关心的是对给定的输入 X X X,应该预测什么样的输出 Y Y Y。典型的判别模 型包括:k近邻法、感知机、决策树、逻辑斯谛回归模型、最大熵模型、支持向量机、提 升方法和条件随机场等。

在监督学习中,生成方法和判别方法各有优缺点,适合于不同条件下的学习问题。

生成方法的特点: 生成方法可以还原出联合概率分布P(X,Y),而判别方法则不能;生成方法的学习收敛速度更快,即当样本容量增加的时候,学到的模型可以更快地收敛于真实模型;当存在隐变量时,仍可以用生成方法学习,此时判别方法就不能用。

判别方法的特点: 判别方法直接学习的是条件概率P(Y|X)或决策函数f(X),直接面对预测,往往学习的准确率更高;由于直接学习P(Y|X)或f(X),可以对数据进行各种程度上
的抽象、定义特征并使用特征,因此可以简化学习问题。

1.8 分类问题

  分类是监督学习的一个核心问题。在监督学习中,当输出变量Y取有限个离散值时,预测问题便成为分类问题。这时,输入变量X可以是离散的,也可以是连续的。

  监督学习 从数据中学习一个分类模型或分类决策函数,称为分类器(classifier)。分类器对新的输 入进行输出的预测(prediction),称为分类(classification)。可能的输出称为类(class)。分类的类别为多个时,称为多类分类问题。

  对于二类分类问题常用的评价指标是精确率(precision)与召回率(recall)。通常以关注的类为正类,其他类为负类,分类器在测试数据集上的预测或正确或不正确,4种情 况出现的总数分别记作:

  • TP——将正类预测为正类数;
  • FN——将正类预测为负类数;
  • FP——将负类预测为正类数;
  • TN——将负类预测为负类数。

具体定义:解决几乎任何机器学习问题 – 学习笔记(评估指标)_几乎可以解决所有机器学习问题-CSDN博客

1.9 标注问题

  标注(tagging)也是一个监督学习问题。可以认为标注问题是分类问题的一个推广,标注问题又是更复杂的结构预测(structure prediction)问题的简单形式。

标注问题的输入 是一个观测序列,输出是一个标记序列或状态序列。标注问题的目标在于学习一个模型,
使它能够对观测序列给出标记序列作为预测。注意,可能的标记个数是有限的,但其组合 所成的标记序列的个数是依序列长度呈指数级增长的。

1.10 回归问题

  回归(regression)是监督学习的另一个重要问题。回归用于预测输入变量(自变量)和输出变量(因变量)之间的关系,特别是当输入变量的值发生变化时,输出变量的 值随之发生的变化。

  回归模型正是表示从输入变量到输出变量之间映射的函数。回归问题 的学习等价于函数拟合:选择一条函数曲线使其很好地拟合已知数据且很好地预测未知数据:

代码练习:使用最小二乘法拟和曲线

  举例:我们用目标函数𝑦=𝑠𝑖𝑛2𝜋𝑥, 加上一个正太分布的噪音干扰,用多项式去拟合

import numpy as np
import scipy as sp
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
%matplotlib inline

ps: numpy.poly1d([1,2,3])生成 1 x 2 + 2 x 1 + 3 x 0 1x^2+2x^1+3x^0 1x2+2x1+3x0

# 目标函数
def real_func(x):
    return np.sin(2*np.pi*x)

# 多项式
def fit_func(p, x):
    f = np.poly1d(p)
    return f(x)

# 残差
def residuals_func(p, x, y):
    ret = fit_func(p, x) - y
    return ret

# 十个点
x = np.linspace(0, 1, 10)
x_points = np.linspace(0, 1, 1000)

# 加上正态分布噪音的目标函数的值
y_ = real_func(x)
y = [np.random.normal(0, 0.1)+y1 for y1 in y_]

def fitting(M=0):
    """
    M 为多项式的次数
    """    
    # 随机初始化多项式参数
    p_init = np.random.rand(M+1)

    # 最小二乘法
    p_lsq = leastsq(residuals_func, p_init, args=(x, y))
    print('Fitting Parameters:', p_lsq[0])
    
    # 可视化
    plt.plot(x_points, real_func(x_points), label='real')
    plt.plot(x_points, fit_func(p_lsq[0], x_points), label='fitted curve')
    plt.plot(x, y, 'bo', label='noise')
    plt.legend()
    return p_lsq
# M=0
p_lsq_0 = fitting(M=0)

=============================
Fitting Parameters: [-0.03353208]

在这里插入图片描述

# M=1
p_lsq_1 = fitting(M=1)
================================
Fitting Parameters: [-1.5025198   0.71772782]

在这里插入图片描述

# M=3
p_lsq_3 = fitting(M=3)
===============================
Fitting Parameters: [ 21.14354912 -31.85091     10.66661731  -0.03324716]

在这里插入图片描述

# M=9
p_lsq_9 = fitting(M=9)
===============================
Fitting Parameters: [-7.35300865e+03  3.20446626e+04 -5.87661832e+04  5.89723258e+04
 -3.52349521e+04  1.27636926e+04 -2.70301291e+03  2.80321069e+02
 -3.97563291e+00 -2.00783231e-02]

在这里插入图片描述

!! 当M=9时,多项式曲线通过了每个数据点,但是造成了过拟合

正则化

结果显示过拟合,引入正则化项(regularizer),降低过拟合

Q ( x ) = ∑ i = 1 n ( h ( x i ) − y i ) 2 + λ ∣ ∣ w ∣ ∣ 2 Q(x)=\sum ^n_{i=1}(h(x_i)-y_i)^2+λ||w||^2 Q(x)=i=1n(h(xi)yi)2+λ∣∣w2

回归问题中,损失函数是平方损失,正则化可以是参数向量的L2范数,也可以是L1范数。

regularization = 0.0001

def residuals_func_regularization(p, x, y):
    ret = fit_func(p, x) - y
    ret = np.append(ret, np.sqrt(0.5*regularization*np.square(p))) # L2范数作为正则化项
    return ret
# 最小二乘法,加正则化项
p_init = np.random.rand(9+1)
p_lsq_regularization = leastsq(residuals_func_regularization, p_init, args=(x, y))
plt.plot(x_points, real_func(x_points), label='real')
plt.plot(x_points, fit_func(p_lsq_9[0], x_points), label='fitted curve')
plt.plot(x_points, fit_func(p_lsq_regularization[0], x_points), label='regularization')
plt.plot(x, y, 'bo', label='noise')
plt.legend()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/340999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

助力焊接场景下自动化缺陷检测识别,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建工件表面焊接裂纹缺陷检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景,在工件表面焊接场景下常常有对工件表面缺陷智能自动化检测识别的需求,工业AI结合落地是一个比较有潜力的场景,在我们前面的博文开发实践中也有一些相关的实践,感兴趣的话可以自行…

SpringBoot3.1.7集成Kafka和Kafka安装

一、背景 我们在很多系统开发都需要用到消息中间件,目前来说Kafka凭借其优秀的性能,使得它的使用率已经是名列前茅了,所以今天我们将它应用到我们的系统 二、版本选择 在使用一个中间件一定要考虑版本的兼容性,否则后面会遇到很…

搜索与图论第五期 拓扑序列

前言 拓扑排序是非常重要的一部分,希望大家都能够手撕代码!!!(嘿嘿嘿) 一、拓扑排序定义(百度须知嘿嘿嘿) 拓扑排序 拓扑排序是一种对有向无环图(Directed Acyclic Gra…

开始学习vue2基础篇(指令)

一、 内容渲染指令 > {{}} 模板渲染(模板引擎) 1. {{数据绑定}} 2. {{简单计算}} 3. {{简单逻辑运算}}(三元运算) 4. {{做简单 js 判断}} 注意:不能写语句、不能解析 html 渲染、不能放在在属性身上 > v-…

菜鸟导入导出assetbundle

因为菜鸟不会用unity c#什么的,所以最后参考贴吧的方法用的是UABE(Unity Assets Bundle Extractor)和UABEA(Unity Assets Bundle Extractor Avalonia) 可以去github上下载 对于txt、xml什么的可以直接改,但是byte文件里还是会有一些类似乱码的东西&…

算法通关村番外篇-面试150题一

大家好我是苏麟 , 今天开始LeetCode面试经典150题 . 大纲 26. 删除有序数组中的重复项80. 删除有序数组中的重复项 II 26. 删除有序数组中的重复项 描述 : 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 …

MIT - 线性代数-LU_LDU分解|单位矩阵

麻省理工学院 - MIT - 线性代数 第四讲 https://www.bilibili.com/video/BV1GD4y1x7Za/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source54eff91a9ce326df74fd3b06c9fc2be322情况 老师,没讲明白的LU分解,MIT一张图就解…

【QT+QGIS跨平台编译】之五:【curl+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、curl介绍二、curl下载三、文件分析四、pro文件五、编译实践 一、curl介绍 curl(CommandLine Uniform Resource Locator)主要功能就是用不同的协议连接和沟通不同的服务器,相当封装了的socket。 libcurl支持http, https, ftp, g…

什么叫单位矩阵?

单位矩阵(Identity Matrix)是一个特殊的方阵,其主对角线上的元素全为1,而其他元素全为0。单位矩阵通常用符号 I 或 E 表示。 一个nn 的单位矩阵的表示形式如下: 其中,主对角线上的元素全为1,…

http网络编程——在ue5中实现文件传输功能

http网络编程在ue5中实现 需求:在unreal中实现下载功能,输入相关url网址,本地文件夹存入相应文件。 一、代码示例 1.Build.cs需要新增Http模块,样例如下。 PublicDependencyModuleNames.AddRange(new string[] { "Core&q…

matlab 交通流量PI和P控制

1、内容简介 略 37-可以交流、咨询、答疑 2、内容说明 略. 题目背景 有一条路,他有一个主干道和一个次干道,现在这条路上有一定的交通流,交通流的情况是第二张图(交通流的程序在那个matlab文件里的做出的figure1里有)&#x…

【vue3】GSAP在vue中的使用

一、获取GSAP npm install gsap 二、开始GSAP 导入GSAP,如果需要导入gsap的插件可以参考这里。 import gasp from gsap; 这里用的是选项式,在methods属性中创建一个方法用来写gsap的动画。 gasp_animation(){let tl gasp.timeline({defaults:{ ease:&…

win10 任务栏设置透明

先看效果图 第一步:按下“Win R”组合键,输入“regedit”并回车,打开注册表编辑器。 第二步:在注册表中找到路径“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced”。 第三步:在…

1 认识微服务

1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构:将业务的所有…

yolov5 opencv dnn部署 github代码

yolov5 opencv dnn部署 github代码 源码地址实现推理源码中作者的yolov5s.onnx推理条件python部署(因为python比较简单就直接介绍了)c部署 参考链接 源码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人,也是上面作者推…

数组(java)

数组动态初始化和静态初始化的区别: 动态初始化:手动指定数组长度,由系统给出默认初始化值 只明确元素个数,不明确具体数值,推荐使用动态初始化 静态初始化:手动指定数组元素,系统会根据元素…

第二百八十二回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择图片和视频文件"相关的内容,本章回中将介绍如何混合选择多个图片和视频文件.闲话休提,让我们一起Talk Flutter吧。 1…

Java 设计者模式以及与Spring关系(四) 代理模式

目录 简介: 23设计者模式以及重点模式 代理模式(Proxy Pattern) 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁,但不推荐) 2.基于CGLIB实现 spring中应用 …

【代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串】

代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串 39. 组合总和40.组合总和II131.分割回文串 题解参考y总的:http://www.acwing.com 39. 组合总和 我是一看就会,一写就废。先看代码: class Solution { public:…

Databend 开源周报第 129 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持标准流 标…