精华内容
下载资源
问答
  • 非线性函数包括:指数函数、幂函数、对数函数、多项式函数等等基本初等函数 从数学角度如何区别于什么是线性函数,什么是非线性函数呢? 对于一个函数y=f(x)来说,如果他有线性,则必须要满足两个法则: 比例...

    线性函数
    线性函数就是指数学中那些线性的函数,但也常用于一次函数的别称。
    注意:一次函数不一定是线性的(稍后我会提出如何进行区分)

    非线性函数
    非线性函数是指在数学中函数图像不是一条直线的函数。
    非线性函数包括:指数函数、幂函数、对数函数、多项式函数等等基本初等函数

    从数学的角度如何区别于什么是线性函数,什么是非线性函数呢?
    对于一个函数y=f(x)来说,如果他是有线性的,则必须要满足两个法则:

    1. 比例性
    2. 叠加性

    比例性:
    对于任意的aa,都有ay=f(ax)ay = f(ax)成立,即将xx扩大aa的倍数,随之yy也扩大aa

    叠加性:
    y1=f(x1),y1=f(x2)y_1=f(x_1), y_1=f(x_2)(y1+y2)=f(x1+x2)(y_1+y_2) = f(x_1 + x_2)


    举个例子:
    比如y=x+1就是一条直线,但是塔并不是线性的,即不满足上诉条件,所以并不是所有直线都是线性的。


    但是尴尬的问题来了!!!

    对于relurelu激活函数来说,本身就是一个非线性操作,其操作的对象是线性的函数。。。

    所以:对于 y=wx+by = wx + b这个函数,如果从上面数学的角度分析就出问题了

    难道要对非线性函数进行非线性操作???

    所以我们暂且就把深度学习的领域和数学领域分开

    在深度学习的领域就是将y=wx+by = wx + b这个函数作为线性函数处理!!!


    展开全文
  • 多项式回归是指利用线性回归函数来拟合复杂函数; 或者说假设函数不再简单一次函数; 例如: h(θ)=θ0+θ1x+θ2x2 h(\theta)=\theta_{0}+\theta_{1}x+\theta_{2}x^{2}h(θ)=θ0​+θ1​x+θ2​x2 2、不同特征...

    1、什么是多项式回归?

    多项式回归是指利用线性回归函数来拟合复杂函数;
    或者说假设函数不再是简单的一次函数;
    例如:
    h(θ)=θ0+θ1x+θ2x2 h(\theta)=\theta_{0}+\theta_{1}x+\theta_{2}x^{2}

    2、不同的特征选择

    以房屋价格预测为例,我们可以选择不同的特征,你可以选择:
    (1)房屋的临街宽度、房子的临街深度;
    (2)房屋的面积;
    下图1所示的是房屋价格随面积的分布情况,从图中可以看出,如果仅用一次函数,很难正确拟合数据,所以我们应该使用更复杂的假设函数,比如二次的、三次的,对比线性回归,我们进行特征构造,将假设函数中的(size)(size)(size)2(size)^{2}(size)3(size)^{3}分别作为线性回归中的特征x1x_{1}x2x_{2}x3x_{3},然后再使用线性回归的方法,就可以很好的拟合数据:
    在这里插入图片描述

    展开全文
  • 1,什么是线性 我们无数次提到”线性“这个名词。在支持向量机中,我们也曾经提到最初支持向量机只能够分割线性可分数据,然后引入了”核函数“来帮助我们分类那些非线性可分...我们最常使用线性是指“变量

     

    目录

    1,什么是线性

    1.1,变量之间的线性关系

    1.2,数据间的线性与非线性

    1.3,线性模型与非线性模型

    1.4,使用分箱处理非线性问题

    2,多项式回归PolynomialFeatures

    2.1,什么是多项式回归

    2.2,多项式回归处理非线性问题

    2.3,多项式回归的可解释性

    2.4,线性还是非线性模型?


    1,什么是线性

    我们无数次提到”线性“这个名词。在支持向量机中,我们也曾经提到最初的支持向量机只能够分割线性可分的数据,然后引入了”核函数“来帮助我们分类那些非线性可分的数据。我们也曾经说起过,比如说决策树,支持向量机是”非线性“模型。所有的这些概念,让我们对”线性“这个词非常熟悉,却又非常陌生——因为我们并不知道它的真实含义。接下来我们看看线性回归模型改进的核心之一:帮助线性回归解决非线性问题。

    1.1,变量之间的线性关系

    ”线性“这个词用于描述不同事物时有着不同的含义。我们最常使用的线性是指“变量之间的线性关系(linear relationship)”,它表示两个变量之间的关系可以展示为一条直线,即可以使用方程y=ax+b来进行拟合。要探索两个变量之间的关系是否是线性的,最简单的方式就是绘制散点图,如果散点图能够相对均匀地分布在一条直线的两端,则说明这两个变量之间的关系是线性的。因此,三角函数(如sin(x)),高次函数( y=ax^{3}+b),指数函数( y=e^{x})等等图像不为直线的函数所对应的自变量和因变量之间是非线性关系(non-linear relationship)。也因此y=ax+b被称为线性方程或线性函数(linear function),三角函数,高次函数等也因此被称为非线性函数(non-linear function)。

    1.2,数据间的线性与非线性

    • 从线性关系这个概念出发,我们有了一种说法叫做“线性数据”。通常来说,一组数据由多个特征和标签组成。当这些特征分别与标签存在线性关系的时候,我们就说这一组数据是线性数据。当特征矩阵中任意一个特征与标签之间的关系需要使用三角函数,指数函数等函数来定义,则我们就说这种数据叫做“非线性数据”。对于线性和非线性数据,最简单的判别方法就是利用模型来帮助我们——如果是做分类则使用逻辑回归,如果做回归则使用线性回归,如果效果好那数据是线性的,效果不好则数据不是线性的。当然,也可以降维后进行绘图,绘制出的图像分布接近一条直线,则数据就是线性的。

    • 到这里为止展示的都是或多或少能够连成线的数据分布,他们之间只不过是直线与曲线的分别罢了。然而考虑一下,当我们在进行分类的时候,我们的决策函数往往是一个分段函数,比如二分类下的决策函数可以是符号函数(signx),符号函数的图像可以表示为取值为1和-1的两条直线。这个函数明显不符合我们所说的可以使用一条直线来进行表示的属性,因此分类问题中特征与标签[0,1]或者[-1,1]之间关系明显是非线性的关系。除非我们在拟合分类的概率,否则不存在例外。  

    • 同时我们还注意到,当我们在进行分类的时候,我们的数据分布往往是这样的:

    • 可以看得出,这些数据都不能由一条直线来进行拟合,他们也没有均匀分布在某一条线的周围,那我们怎么判断,这些数据是线性数据还是非线性数据呢?在这里就要注意了,当我们在回归中绘制图像时,绘制的是特征与标签的关系图,横坐标是特征,纵坐标是标签,我们的标签是连续型的,所以我们可以通过是否能够使用一条直线来拟合图像判断数据究竟属于线性还是非线性。然而在分类中,我们绘制的是数据分布图,横坐标是其中一个特征,纵坐标是另一个特征,标签则是数据点的颜色。因此在分类数据中,我们使用“是否线性可分”(linearly separable)这个概念来划分分类数据集。当分类数据的分布上可以使用一条直线来将两类数据分开时,我们就说数据是线性可分的。反之,数据不是线性可分的。

    对于回归问题,数据若能分布为一条直线,则是线性的,否则是非线性。对于分类问题,数据分布若能使用一条直线来划分类别,则是线性可分的,否则数据则是线性不可分的。

    1.3,线性模型与非线性模型

    在回归中,线性数据可以使用如下的方程来进行拟合:

    也就是我们的线性回归的方程。根据线性回归的方程,我们可以拟合出一组参数w,在这一组固定的参数下我们可以建立一个模型,而这个模型就被我们称之为是线性回归模型。所以建模的过程就是寻找参数的过程。此时此刻我们建立的线性回归模型,是一个用于拟合线性数据的线性模型。作为线性模型的典型代表,我们可以从线性回归的方程中总结出线性模型的特点:其自变量都是一次项。 

    那线性回归在非线性数据上的表现如何呢?我们来建立一个明显是非线性的数据集,并观察线性回归和决策树的而回归在拟合非线性数据集时的表现:

    # 线性模型与非线性模型,用线性模型来模拟我们的非线性数据集
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.linear_model import LinearRegression
    from sklearn.tree import DecisionTreeRegressor
    
    
    # 设置随机数种子
    rnd=np.random.RandomState(42)
    
    # rnd.uniform从输入的两个数之间取出size个随机数
    # 用法类似于np.arange()和linespace()函数,但是这两个函数是按照顺序取值,uniform()是随机取出数值。
    X=rnd.uniform(-3,3,size=100)
    
    # #生成y的思路:先使用NumPy中的函数生成一个sin函数图像,然后再人为添加噪音
    y = np.sin(X)+rnd.normal(size=len(X))/3  #random.normal,生成size个服从正态分布的随机数
    y.shape
    
    #使用散点图观察建立的数据集是什么样子
    plt.scatter(X, y,marker='o',c='red',s=15)
    plt.show()
    
    # 因为sklearn只接受二维以上的特征矩阵,所以我们修改X为二维
    X=X.reshape(-1,1)
    X.shape
    
    import pandas as pd
    pd.DataFrame(X)
    
    # 使用原始数据进行建模,使用训练数据进行拟合
    lr=LinearRegression().fit(X,y)# 实例化模型并且拟合模型
    # 使用决策树建模并且拟合数据
    tree=DecisionTreeRegressor(random_state=40).fit(X,y)
    
    # 创建画布
    fig, ax1 = plt.subplots(1)
    
    #创建测试数据:一系列分布在横坐标上的点
    # endpoint此参数标示保留3位小数,line数据集就相当于我们的测试数据集
    line = np.linspace(-3, 3, 1000,endpoint=False).reshape(-1,1)
    #将测试数据带入predict接口,获得模型的拟合效果并进行绘制
    # 两个模型中的y值就是我们建立好的模型对我们的line测试数据的预测值
    ax1.plot(line, lr.predict(line), linewidth=2, color='green',label="linear regression")# 线性回归模型预测
    ax1.plot(line, tree.predict(line), linewidth=2, color='red',label="decision tree")# 决策树进行预测
    #将原数据上的拟合绘制在图像上
    ax1.plot(X[:, 0], y, 'o', c='black')# 代表我们的原水数据点
    #其他图形选项
    ax1.legend(loc="best")
    ax1.set_ylabel("Regression output")
    ax1.set_xlabel("Input feature")
    ax1.set_title("Result before discretization")
    plt.tight_layout()
    plt.show()

    运行上面的程序可以看出,线性回归无法拟合出这条带噪音的正弦曲线的真实面貌,只能够模拟出大概的趋势,而决策树却通过建立复杂的模型将几乎每个点都拟合出来了。可见,使用线性回归模型来拟合非线性数据的效果并不好,而决策树这样的模型却拟合得太细致,但是相比之下,还是决策树的拟合效果更好一些,但是会发生过拟合的情况。

    决策树无法写作一个方程(在XGBoost章节中会详细讲解如何将决策树定义成一个方程,但它绝对不是一个形似y=ax+b的方程),它是一个典型的非线性模型,当它被用于拟合非线性数据,可以发挥奇效。其他典型的非线性模型还包括使用高斯核的支持向量机,树的集成算法,以及一切通过三角函数,指数函数等非线性方程来建立的模型。

    根据这个思路,我们也许可以这样推断:线性模型用于拟合线性数据,非线性模型用于拟合非线性数据。但事实上机器学习远远比我们想象的灵活得多,线性模型可以用来拟合非线性数据,而非线性模型也可以用来拟合线性数据,更神奇的是,有的算法没有模型也可以处理各类数据,而有的模型可以既可以是线性,也可以是非线性模型。

    • 非线性模型拟合线性数据

    非线性模型能够拟合或处理线性数据的例子非常多,非线性模型诸如决策树,随机森林等算法在分类中处理线性可分的数据的效果。无一例外的,非线性模型们几乎都可以在线性可分数据上有不逊于线性模型的表现。同样的,如果我们使用随机森林来拟合一条直线,那随机森林毫无疑问会过拟合,因为线性数据对于非线性模型来说太过简单,很容易就把训练集上的R^{2}训练得很高,MSE训练的很低。

    • 线性模型拟合非线性数据

    但是相反的,线性模型若用来拟合非线性数据或者对非线性可分的数据进行分类,那通常都会表现糟糕。通常如果我们已经发现数据属于非线性数据,或者数据非线性可分的数据,则我们不会选择使用线性模型来进行建模。改善线性模型在非线性数据上的效果的方法之一时进行分箱,并且从下图来看分箱的效果不是一般的好,甚至高过一些非线性模型。后面会说明分箱的效果,但很容易注意到,在没有其他算法或者预处理帮忙的情况下,线性模型在非线性数据上的表现时很糟糕的。

    从上面的图中,我们可以观察出一个特性:线性模型们的决策边界都是一条条平行的直线,而非线性模型们的决策边界是交互的直线(格子),曲线,环形等等对于分类模型来说,这是我们判断模型是线性还是非线性的重要评判因素:线性模型的决策边界是平行的直线,非线性模型的决策边界是曲线或者交叉的直线。之前我们提到,模型上如果自变量上的最高次方为1,则模型是线性的,但这种方式只适用于回归问题。分类模型中,我们很少讨论模型是否线性,因为我们很少使用线性模型来执行分类任务(逻辑回归是一个特例)。但从上面我们总结出的结果来看,我们可以认为对分类问题而言,如果一个分类模型的决策边界上自变量的最高次方为1,则我们称这个模型是线性模型。 

    • 既是线性,也是非线性的模型

    对于有一些模型来说,他们既可以处理线性模型又可以处理非线性模型,比如说强大的支持向量机。支持向量机的前身是感知机模型,朴实的感知机模型是实打实的线性模型(其决策边界是直线),在线性可分数据上表现优秀,但在非线性可分的数据上基本属于无法使用状态。

    但支持向量机就不一样了。支持向量机本身也是处理线性可分数据的,但却可以通过对数据进行升维(将数据转移到高维空间\phi中),将非线性可分数据变成高维空间中的线性可分数据,然后使用相应的“核函数”来求解。当我们选用线性核函数"linear"的时候,数据没有进行变换,支持向量机中就是线性模型,此时它的决策边界是直线。而当我们选用非线性核函数比如高斯径向基核函数的时候,数据进行了升维变化,此时支持向量机就是非线性模型,此时它的决策边界在二维空间中是曲线。所以这个模型可以在线性和非线性之间自由切换,一切取决于它的核函数。

    • 还有更加特殊的,没有模型的算法,比如最近邻算法KNN,这些都是不建模,但是能够直接预测出标签或做出判断的算法。而这些算法,并没有线性非线性之分 。

     

    线性模型

    非线性模型

    代表模型

    线性回归,逻辑回归,弹性网,感知机

    决策树,树的集成模型,使用高斯核的SVM

    模型特点

    模型简单,运行速度快

    模型复杂,效果好,但速度慢

    数学特征:回归

    自变量是一次项

    自变量不都是一次项

    分类

    决策边界上的自变量都是一次项

    决策边界上的自变量不都是一次项

    可视化:回归

    拟合出的图像是一条直线

    拟合出的图像不是一条直线

    分类

    决策边界在二维平面是一条直线

    决策边界在二维平面不是一条直线

    擅长的数据类型

    主要是线性数据,线性可分数据

    所有数据

    模型在线性和非线性数据集上的表现为我们选择模型提供了一个思路:当我们获取数据时,我们往往希望使用线性模型来对数据进行最初的拟合(线性回归用于回归,逻辑回归用于分类),如果线性模型表现良好,则说明数据本身很可能是线性的或者线性可分的,如果线性模型表现糟糕,那毫无疑问我们会投入决策树,不过这并不代表着我们就完全不能使用线性模型来处理非线性数据了。在现实中,线性模型有着不可替代的优势:计算速度异常快速,所以也还是存在着我们无论如何也希望使用线性回归的情况。因此,我们有多种手段来处理线性回归无法拟合非线性问题的问题。

    1.4,使用分箱处理非线性问题

    让线性回归在非线性数据上表现提升的核心方法之一是对数据进行分箱,也就是离散化。与线性回归相比,我们常用的一种回归是决策树的回归。我们之前拟合过一条带有噪音的正弦曲线以展示多元线性回归与决策树的效用差异,现在我们使用分箱操作对其拟合。

    # 数据分箱拟合,也就是数据的离散化
    from sklearn.preprocessing import KBinsDiscretizer
    import pandas as pd
    # 首先是实例化我们的类
    enc=KBinsDiscretizer(n_bins=10 #此参数说明将连续性变量分多少类,也就是分多少箱
                        ,encode="onehot"# 此参数说明在分类的时候采用何种编码分类方式,另一个取值是ordinal,返回的
    #                      是一列,onehot返回的不是一列,返回的是一个稀疏矩阵,返回(m,n_bins)矩阵
                        )
    x_binned=enc.fit_transform(X)
    # x_binned是分箱后的特征矩阵
    
    # 一共有100行10列,100也就是样本数,10列也就是n_bins
    pd.DataFrame(x_binned.toarray())
    # 返回的是100行10列,如果某个样本被分到某一类,那么对应的元素值为1,否则为0
    # 说明每一个样本只占据一个箱子
    
    # 我们将使用分箱后的数据进行训练,在sklearn中,训练集和测试集的数据结构要保持一致
    linear_=LinearRegression().fit(x_binned,y)
    # x_binned数据集是我们分好箱子的特征矩阵
    
    # 现在使用line数据集作为测试,使用训练好的数据进行预测
    linear_.predict(line)
    # 因为line数据和我们训练的数据的结构不一样,所以我们要把我们的测试数据集line也拿来进行分箱操作
    
    x_binned.shape
    # 分箱后的数据集形状
    
    line.shape
    # Line数据集的形状
    
    # 训练集和测试集数据的结构不一样
    # 现在对我们的line数据集进行分箱
    line_enc=enc.transform(line)
    line_enc.shape #结果是一个系数矩阵 
    # 现在line_enc和x_binned两个矩阵的形状一样
    
    pd.DataFrame(line_enc.toarray())
    # 测试数据集分箱后是1000*10的数据集
    
    # 现在对我们的测试数据集line_enc进行预测
    linear_.predict(line_enc)
    # 返回了1000个y值
    
    fig,(ax1,ax2)=plt.subplots(ncols=2,sharey=True,figsize=(10,4))
    
    # ax1使用的是没有分箱后的数据建模,也就是原始数据进行建模
    # 使用原始数据进行建模
    # sharey此参数标示两张图共享一个纵坐标
    fig,(ax1,ax2)=plt.subplots(ncols=2,sharey=True,figsize=(10,4))
    
    # 使用原始数据进行建模,分别使用线性回归和决策树回归
    lr=LinearRegression().fit(X,y)
    tree=DecisionTreeRegressor(random_state=40).fit(X,y)
    # 使用原始数据进行绘图
    ax1.plot(line, lr.predict(line), linewidth=2, color='green',
    label="linear regression")
    ax1.plot(line, tree.predict(line), linewidth=2, color='red',
    label="decision tree")
    #将原数据上的拟合绘制在图像上
    ax1.plot(X[:, 0], y, 'o', c='k')
    #其他图形选项
    ax1.legend(loc="best")
    ax1.set_ylabel("Regression output")
    ax1.set_xlabel("Input feature")
    ax1.set_title("Result before discretization")
    plt.tight_layout()
    
    # ax2使用的是分好箱的数据进行建模
    # 数据准备
    # 使用分箱后的数据进行线性回归和树的回归
    linear_r=LinearRegression().fit(X_binned,y)
    treer=DecisionTreeRegressor(random_state=0).fit(X_binned,y)
    # 绘图,-标示的是实现
    ax2.plot(line,linear_r.predict(line_binned),linewidth=2,color='green',linestyle='-',label='linear regression')
    # ax2.plot(line #横坐标
    #     , linear_r.predict(line_binned) #分箱后的特征矩阵的结果
    #     , linewidth=2
    #     , color='green'
    #     , linestyle='-'
    #     , label='linear regression')
    # 在这里使用分好箱后的测试数据,:标示的是虚线
    ax2.plot(line,treer.predict(line_binned),linewidth=2,color='red',linestyle=':',label="decision tree")
    # ax2.plot(line, treer.predict(line_binned), linewidth=2, color='red',
    #     linestyle=':', label='decision tree')
    #绘制和箱宽一致的竖线
    # vlines()函数用来绘制直线
    # enc.bin_edges_返回的是分出箱子的上限和下限
    ax2.vlines(enc.bin_edges_[0] #x轴
        , *plt.gca().get_ylim() #y轴的上限和下限,gca()标示得到当前的ax2的画布
        , linewidth=1
        , alpha=.2)
    #将原始数据分布放置在图像上
    ax2.plot(X[:, 0], y, 'o', c='k')
    #其他绘图设定
    ax2.legend(loc="best")
    ax2.set_xlabel("Input feature")
    ax2.set_title("Result after discretization")
    plt.tight_layout()
    plt.show()
    # ax2中竖线标示箱子的宽度

    运行程序从图像可以看出,离散化后线性回归和决策树上的预测结果完全相同了——线性回归比较成功地拟合了数据的分布,而决策树的过拟合效应也减轻了。由于特征矩阵被分箱,因此特征矩阵在每个区域内获得的值是恒定的,因此所有模型对同一个箱中所有的样本都会获得相同的预测值。与分箱前的结果相比,线性回归明显变得更加灵活,而决策树的过拟合问题也得到了改善。但注意,一般来说我们是不使用分箱来改善决策树的过拟合问题的,因为树模型带有丰富而有效的剪枝功能来防止过拟合。

    我们设置的分箱箱数为10,不难想到这个箱数的设定肯定会影响模型最后的预测结果,我们来看看不同的箱数会如何影响回归的结果:

    enc = KBinsDiscretizer(n_bins=20,encode="onehot")
    X_binned = enc.fit_transform(X)
    line_binned = enc.transform(line)
    fig, ax2 = plt.subplots(1,figsize=(5,4))
    LinearR_ = LinearRegression().fit(X_binned, y)
    # 准确率
    print(LinearR_.score(line_binned,np.sin(line)))
    TreeR_ = DecisionTreeRegressor(random_state=0).fit(X_binned, y)
    ax2.plot(line #横坐标
    , LinearR_.predict(line_binned) #分箱后的特征矩阵的结果
    , linewidth=2
    , color='green'
    , linestyle='-'
    , label='linear regression')
    ax2.plot(line, TreeR_.predict(line_binned), linewidth=2, color='red',
    linestyle=':', label='decision tree')
    ax2.vlines(enc.bin_edges_[0], *plt.gca().get_ylim(), linewidth=1, alpha=.2)
    ax2.plot(X[:, 0], y, 'o', c='k')
    ax2.legend(loc="best")
    ax2.set_xlabel("Input feature")
    ax2.set_title("Result after discretization")
    plt.tight_layout()
    plt.show()
    
    # 选择最优的箱子问题,使用我们的交叉验证?
    from sklearn.model_selection import cross_val_score as CVS
    import numpy as np
    pred=[]
    var=[]
    score=[]
    bin=[5,10,15,20,25,30]# 分的箱子数目
    for i in bin:
    #     实例化我们的箱子
        enc=KBinsDiscretizer(n_bins=i,encode='onehot')
    #     转化我们的数据集
        binned=enc.fit_transform(X)
        line_binned=enc.fit_transform(line)
    #     实例化我们的线性模型
        lr_=LinearRegression()
    #     首先在全部数据集上面进行交叉验证
        cresult=CVS(lr_,binned,y,cv=5)
        score.append(cresult.mean())
        var.append(cresult.var())# 收集交叉验证结果的方差
    #     预测测试集
        pred.append(lr_.fit(binned,y).score(line_binned,np.sin(line)))
    # 下面开始绘制图像
    plt.figure(figsize=(10,5))
    plt.plot(bin,score,color='red',linestyle=':',label='mean()')
    
    plt.plot(bin,pred,color='orange',linestyle='--',label='pred()')
    # 下面这两条曲线标示哦们要查看均值是否和方差偏差喊打
    plt.plot(bin,score+np.array(var)*0.5,color="black",linestyle='-',label='var()')
    plt.plot(bin,score-np.array(var)*0.5,color="black",linestyle='-')
    plt.legend()
    plt.show()
    # 均值最高,方差最小的时候,我们的模型泛化能力比较好,

    2,多项式回归PolynomialFeatures

    2.1,什么是多项式回归

    除了分箱之外,另一种更普遍的用于解决”线性回归只能处理线性数据“问题的手段,就是使用多项式回归对线性回归进行改进。这样的手法是机器学习研究者们从支持向量机中获得的:支持向量机通过升维可以将非线性可分数据转化为线性可分,然后使用核函数在低维空间中进行计算,这是一种“高维呈现,低维解释”的思维。那我们为什么不能让线性回归使用类似于升维的转换,将数据由非线性转换为线性,从而为线性回归赋予处理非线性数据的能力呢?

    接下来,我们就来看看线性模型中的升维工具:多项式变化。这是一种通过增加自变量上的次数,而将数据映射到高维空间的方法,只要我们设定一个自变量上的次数(大于1),就可以相应地获得数据投影在高次方的空间中的结果。这种方法可以非常容易地通过sklearn中的类PolynomialFeatures来实现。我们先来简单看看这个类是如何使用的。 

    class sklearn.preprocessing.PolynomialFeatures (degree=2, interaction_only=False, include_bias=True)
    参数 含义
    degree 多项式中的次数,默认为2
    interaction_only 布尔值是否只产生交互项,默认为False
    include_bias 布尔值,是否产出与截距项相乘的x_{0},默认True
    # 多项式回归,通过一些变化,提高我们线性回归的表现,解决我们现行回归无法处理我们的非线性问题
    # 模拟支持向量机,支持升维的变化,把低维数据进行高维处理,在高维中解释线性回归
    # 多项式回归是用来调整我们的数据的,从而使得我们的数据可以被线性回归进行拟合处理
    from sklearn.preprocessing import PolynomialFeatures
    import numpy as np
    
    x=np.arange(1,4).reshape(-1,1)
    # 现在对二维数组进行多项式转化
    np.arange(2,4)
    
    # 二次多项式,degree说明多项式的次数
    pf=PolynomialFeatures(degree=2)
    # 实例化我们的模型
    
    # 直接调用接口fit_transform,放入我们的数据进行转化操作
    x_=pf.fit_transform(x)
    
    x_.shape
    # x_就是我们升维后的数据
    
    # 增加到三次多项式
    PolynomialFeatures(degree=3).fit_transform(x)
    
    # 产生三次多项式,不带与截距相乘的x0
    PolynomialFeatures(degree=3,include_bias=False).fit_transform(x)
    
    #为什么我们会希望不生成与截距相乘的x0呢?
    #对于多项式回归来说,我们已经为线性回归准备好了x0,但是线性回归并不知道
    xxx = PolynomialFeatures(degree=3).fit_transform(x)
    xxx.shape
    # xxx矩阵中的第一列就是截距

    不难注意到,多项式变化后数据看起来不太一样了:首先,数据的特征(维度)增加了,这正符合我们希望的将数据转换到高维空间的愿望。其次,维度的增加是有一定的规律的。不难发现,如果我们本来的特征矩阵中只有一个特征x,而转换后我们得到:

    这个规律在转换为二次多项式的时候同样适用。原本,我们的模型应该是形似y=ax+b的结构,而转换后我们的特征变化导致了模型的变化。根据我们在支持向量机中的经验,现在这个被投影到更高维空间中的数据在某个角度上看起来已经是一条直线了,于是我们可以继续使用线性回归来进行拟合。线性回归是会对每个特征拟合出权重的,所以当我们拟合高维数据的时候,我们会得到下面的模型: 

    由此推断,假设多项式转化的次数是n,则数据会被转化成形如:

     而拟合出的方程也可以被改写成:

    这个过程看起来非常简单,只不过是将原始的x上的次方增加,并且为这些次方项都加上权重w,然后增加一列所有次方为0的列作为截距乘数的x_{0},参数include_bias就是用来控制x_{0}的生成的。 

    # 产生三次多项式,不带与截距相乘的x0
    PolynomialFeatures(degree=3,include_bias=False).fit_transform(x)
    
    #为什么我们会希望不生成与截距相乘的x0呢?
    #对于多项式回归来说,我们已经为线性回归准备好了x0,但是线性回归并不知道
    xxx = PolynomialFeatures(degree=3).fit_transform(x)
    xxx.shape
    # xxx矩阵中的第一列就是截距
    
    # 设置随机数种子
    rnd=np.random.RandomState(42)
    y=rnd.random(3)
    y
    
    #生成了多少个系数?使用线性回归进行拟合
    LinearRegression().fit(xxx,y).coef_
    # 产生4个系数,因为对于线性回归,根本就不知道我们输入的特征矩阵,第一列对应的是我们的截距相,所以产生的截距和第一列的数字不一样
    
    #查看截距
    LinearRegression().fit(xxx,y).intercept_
    
    # 生成了多少个系数
    # 线性回归不知道会生成截距,他会把输入的矩阵列全部看做特征,所以才会有include_bias参数
    LinearRegression(fit_intercept=False).fit(xxx,y).coef_
    # 我们的数据由四个特征,所以现在有4个系数
    
    # 查看截距
    # 线性回归中也有控制生成截距的参数
    LinearRegression(fit_intercept=False).fit(xxx,y).intercept_
    # 不拟合截距,那么截距就是0
    
    LinearRegression(fit_intercept=False).fit(xxx,y).coef_
    
    # 查看截距
    LinearRegression(fit_intercept=False).fit(xxx,y).intercept_

    不过,这只是一维状况的表达,大多数时候我们的原始特征矩阵不可能会是一维的,至少也是二维以上,很多时候还可能存在上千个特征或者维度。现在我们来看看原始特征矩阵是二维的状况:

    # 二维数组
    X=np.arange(6).reshape(3,2)
    
    X
    # 多项式回归对二维数据进行拟合
    
    # 现在带入二次多项式进行转化
    PolynomialFeatures(degree=2).fit_transform(X)
    
    

    很明显,上面一维的转换公式已经不适用了,但如果我们仔细看,是可以看出这样的规律的:

    尝试三次多项式

    #尝试三次多项式
    PolynomialFeatures(degree=3).fit_transform(X)

     

    不难发现:当我们进行多项式转换的时候,多项式会产出到最高次数为止的所有低高次项。比如如果我们规定多项式的次数为2,多项式就会产出所有次数为1和次数为2的项反馈给我们,相应的如果我们规定多项式的次数为n,则多项式会产出所有从次数为1到次数为n的项。 

    在多项式回归中,我们可以规定是否产生平方或者立方项,其实如果我们只要求高次项的话,x_{1}x_{2} 会是一个比x_{1}^{2}更好的高次项,因为x_{1}x_{1}x_{2}之间的共线性会比x_{1}x_{1}^{2}之间的共线性好那么一点点(只是一点点),而我们多项式转化之后是需要使用线性回归模型来进行拟合的,就算机器学习中不是那么在意数据上的基本假设,但是太过分的共线性还是会影响到模型的拟合。因此sklearn中存在着控制是否要生成平方和立方项的参数interaction_only,默认为False,以减少共线性。来看这个参数是如何工作的:

    # 生成交互项参数,
    # interaction_only默认值是False
    PolynomialFeatures(degree=2,interaction_only=True).fit_transform(X)
    # 生成的数字只是相互相数字,而单独的平方相没有,也就是只生成交互项,防止多重共线性情况发生

    从之前的许多次尝试中我们可以看出,随着多项式的次数逐渐变高,特征矩阵会被转化得越来越复杂。不仅是次数,当特征矩阵中的维度数(特征数)增加的时候,多项式同样会变得更加复杂:

    # 更好维度的特征矩阵
    x=np.arange(9).reshape(3,3)
    PolynomialFeatures(degree=2).fit_transform(x)
    PolynomialFeatures(degree=3).fit_transform(x)

    多项式变化对于数据会有怎样的影响就一目了然了:随着原特征矩阵的维度上升,随着我们规定的最高次数的上升,数据会变得越来越复杂,维度越来越多,并且这种维度的增加并不能用太简单的数学公式表达出来。因此,多项式回归没有固定的模型表达式,多项式回归的模型最终长什么样子是由数据和最高次数决定的,因此我们无法断言说某个数学表达式"就是多项式回归的数学表达",因此要求解多项式回归不是一件容易的事儿,感兴趣的大家可以自己去尝试看看用最小二乘法求解多项式回归。接下来,我们就来看看多项式回归的根本作用:处理非线性问题。

    2.2,多项式回归处理非线性问题

    这种将数据投影到高维的方式来帮助我们解决非线性问题。那我们现在就来看一看多项式转化对模型造成了什么样的影响:

    # 多项式回归处理非线性问题,多项式是处理我们的数据,处理完毕后需要使用线性回归进行拟合
    from sklearn.preprocessing import PolynomialFeatures as PF
    from sklearn.linear_model import LinearRegression
    import numpy as np
    
    rnd=np.random.RandomState(42)
    X=rnd.uniform(-3,3,size=100)
    y=np.sin(X)+rnd.normal(size=len(X))/3
    
    # 将数据X升维
    X=X.reshape(-1,1)
    # 创建测试数据
    testdata=np.linspace(-3,3,1000,endpoint=False).reshape(-1,1)
    
    # 对原始数据进行打分拟合,首先在线性模型上进行拟合并且打分,X数据集没有做多项式回归处理
    lr=LinearRegression().fit(X,y)
    # 对训练的数据进行打分
    lr.score(X,y)
    
    # 在测试数据上进行打分
    lr.score(testdata,np.sin(testdata))
    
    # 创建测试数据
    testdata=np.linspace(-3,3,1000,endpoint=False).reshape(-1,1)
    
    # 现在进行多项式拟合,设置高次项
    d=5
    # 进行高次转换
    # 对训练数据和测试数据进行高次转换
    ploy=PF(degree=d)# 实例化模型
    X_=ploy.fit_transform(X)#原始特征矩阵,转化为我们的高次的特征矩阵
    X_.shape
    
    # 转化我们的测试数据集
    testdata_=ploy.fit_transform(testdata)
    testdata_.shape
    
    # 使用线性回归模型对我们的转化后的高次数据集进行拟合打分
    lr=LinearRegression().fit(X_,y)
    lr.score(X_,y)
    
    # 对测试数据集进行打分
    lr.score(testdata_,np.sin(testdata))
    
    # 多项式回归是专门用来提升线性回归表现的,多项式回归就是用来处理数据集的
    
    import matplotlib.pyplot as plt
    # 正常线性回归和多项式回归的对比
    # 正常的线性回归
    # 产生我们的数据集
    rnd=np.random.RandomState(42)
    X=rnd.uniform(-3,3,size=100)
    y=np.sin(X)+rnd.normal(size=len(X))/3
    X=X.reshape(-1,1)
    # 线性模型
    linearnor=LinearRegression().fit(X,y)
    
    # 非线性回归
    x_=PF(degree=5).fit_transform(X,y)
    linear_=LinearRegression().fit(x_,y)
    
    # 创建测试数据集
    testdata=np.linspace(-3,3,1000,endpoint=False).reshape(-1,1)
    testdata_=PF(degree=d).fit_transform(testdata)
    # 创建画布
    fig,ax=plt.subplots(1)
    ax.plot(testdata,linearnor.predict(testdata),linewidth=2,color="green",label="linear regression")
    ax.plot(testdata,linear_.predict(testdata_),linewidth=2,color="red",label="Polynomial regression")
    ax.plot(X[:, 0], y, 'o', c='k')
    #其他图形选项
    ax1.legend(loc="best")
    ax1.set_ylabel("Regression output")
    ax1.set_xlabel("Input feature")
    ax1.set_title("Linear Regression ordinary vs poly")
    plt.tight_layout()
    plt.show()
    # 选取d使用学习曲线
    
    # 产生我们的数据集
    import matplotlib.pyplot as plt
    rnd=np.random.RandomState(42)
    X=rnd.uniform(-3,3,size=100)
    y=np.sin(X)+rnd.normal(size=len(X))/3
    X=X.reshape(-1,1)
    testdata=np.linspace(-3,3,1000,endpoint=False).reshape(-1,1)
    
    # 选取我们的高次项,使用的是交叉验证的学习曲线
    scores=[]
    for i in range(1,10):
    #     实例化我们的线性模型
        lr_=LinearRegression()
    #     转化我们的数据集
        binned=PF(degree=i).fit_transform(X)
    #     转化我们的测试数据集
        #testdata_=PF(degree=i).fit_transform(testdata)
    #     使用线性模型来拟合我们的数据集
        lr_=lr_.fit(binned,y)
        scores.append(lr_.score(binned,y)
    plt.figure(figsize=(10,5))
    plt.plot(range(1,10),scores)
    plt.show()

    从这里大家可以看出,多项式回归能够较好地拟合非线性数据,还不容易发生过拟合,可以说是保留了线性回归作为线性模型所带的“不容易过拟合”和“计算快速”的性质,同时又实现了优秀地拟合非线性数据。到了这里,相信大家对于多项式回归的效果已经不再怀疑了。多项式回归非常迷人也非常神奇,因此一直以来都有各种各样围绕着多项式回归进行的讨论。

    2.3,多项式回归的可解释性

    线性回归是一个具有高解释性的模型,它能够对每个特征拟合出参数以帮助我们理解每个特征对于标签的作用。当我们进行了多项式转换后,尽管我们还是形成形如线性回归的方程,但随着数据维度和多项式次数的上升,方程也变得异常复杂,我们可能无法一眼看出增维后的特征是由之前的什么特征组成的(之前我们都是肉眼看肉眼判断)。不过,多项式回归的可解释性依然是存在的,我们可以使用接口get_feature_names来调用生成的新特征矩阵的各个特征上的名称,以便帮助我们解释模型。来看下面的例子:

    # 非线性回归的可解释性
    x=np.arange(9).reshape(3,3)
    
    poly=PolynomialFeatures(degree=5).fit(x)
    # 拟合5次多项式
    
    # get_feature_names接口查看属性名字,是一个接口,不是属性
    poly.get_feature_names()

    使用加利佛尼亚房价数据集给大家作为例子,当我们有标签名称的时候,可以直接在接口get_feature_names()中输入标签名称来查看新特征究竟是由原特征矩阵中的什么特征组成的:

    # 使用房屋的数据集
    from sklearn.datasets import fetch_california_housing as fch
    house=fch()
    
    X=pd.DataFrame(house.data)
    y=house.target
    
    # 查看数据的特征名字
    house.feature_names
    
    X.columns = ["住户收入中位数","房屋使用年代中位数","平均房间数目"
    ,"平均卧室数目","街区人口","平均入住率","街区的纬度","街区的经度"]
    
    # 现在对房屋数据集进行拟合
    ploy=PolynomialFeatures(degree=2).fit(X,y)
    ploy.get_feature_names(X.columns) 
    
    X_=ploy.transform(X)
    X
    # 现在X特征矩阵有8个特征
    # 经过转化后,一共有45个特征
    X_.shape
    
    # 重新建立我们的模型
    lr=LinearRegression().fit(X_,y)
    
    # 查看线性回归的特征系数
    lr.coef_
    # 因为转化成45个特征,所以有45个系数
    
    [*zip(ploy.get_feature_names(X.columns),lr.coef_)]
    
    # 把结果放到dataframe中
    coeff=pd.DataFrame([ploy.get_feature_names(X.columns),lr.coef_]).T
    
    coeff.columns=["feature",'coef']
    # by标示按照什么排序
    coeff.sort_values(by="coef")
    # 系数绝对值越大,对我们的模型影响就越大
    # 这种可解释性不仅可以用于特征选择,还可以用于特征创造

    可以发现,不仅数据的可解释性还存在,我们还可以通过这样的手段做特征工程——特征创造。多项式帮助我们进行了一系列特征之间相乘的组合,若能够找出组合起来后对标签贡献巨大的特征,那我们就是创造了新的有效特征,对于任何学科而言发现新特征都是非常有价值的。

    # 现在对特征矩阵进行升维操作
    poly=PolynomialFeatures(degree=4).fit(X,y)
    X_=poly.transform(X)
    # 在线性模型中进行拟合
    lr=LinearRegression().fit(X,y)
    lr.score(X,y)
    # 使用转化后的数据在线性回归中建模
    from time import time
    time0=time()
    lr1=LinearRegression().fit(X_,y)
    print(lr1.score(X_,y))
    print(time()-time0)
    # 使用随机森林运行我们的数据
    from sklearn.ensemble import RandomForestRegressor as rfc
    time0=time()
    print("{}".format(rfc(n_estimators=100).fit(X,y).score(X,y)))
    time()-time0

    2.4,线性还是非线性模型?

    另一个围绕多项式回归的核心问题是,多项式回归是一个线性模型还是非线性模型呢?从我们之前对线性模型的定义来看,自变量上需要没有高次项才是线性模型,按照这个定义,在上填上高次方的多项式回归肯定不是线性模型了。然而事情却没有这么简单。来看原始特征为二维,多项式次数为二次的多项式回归表达式:

    经过变化后的数据有六个特征,分别是:

     我们能够一眼看出从第四个特征开始,都是高次特征,而这些高次特征与之间的关系必然不是线性的。但是我们也可以换一种方式来思考这个问题:假设我们不知道这些特征是由多项式变化改变来的,我们只是拿到了含有六个特征的任意数据,于是现在对于我们来说这六个特征就是:

    我们通过检验发现z_{1}z_{4}和,z_{5}之间存在一定的共线性, z_{2}也是如此,但是现实中的数据不太可能完全不相关,因此一部分的共线性是合理的,我们没有任何理由去联想到说,这个数据其实是由多项式变化来生成的。所以我们了线性回归来对数据进行拟合,然后得到了方程:

    这是一个线性方程没错:并不存在任何高次项,只要拟合结果不错,大概也没有人会在意这个六个特征的原始数据究竟是怎么来的,那多项式回归不就变成一个含有部分共线性的线性方程了么?在许多教材中,多项式回归被称为“线性回归的一种特殊情况”。

    多项式回归通常被认为是非线性模型,但广义上它是一种特殊的线性模型,它能够帮助我们处理非线性数据,是线性回归的一种进化。大家要能够理解多项式回归的争议从哪里来,并且能够解释清楚观察多项式回归的不同角度,以避免混淆。

    另外一个需要注意的点是,线性回归进行多项式变化后被称为多项式回归,但这并不代表多项式变化只能够与线性回归连用。在现实中,多项式变化疯狂增加数据维度的同时,也增加了过拟合的可能性,因此多项式变化多与能够处理过拟合的线性模型如岭回归,Lasso等来连用,与在线性回归上使用的效果是一致的,感兴趣的话大家可以自己尝试一下。

    本章之中,学习了多元线性回归,岭回归,Lasso和多项式回归总计四个算法,他们都是围绕着原始的线性回归进行的拓展和改进。其中岭回归和Lasso是为了解决多元线性回归中使用最小二乘法的各种限制,主要用途是消除多重共线性带来的影响并且做特征选择,而多项式回归解决了线性回归无法拟合非线性数据的明显缺点,核心作用是提升模型的表现。除此之外,本章还定义了多重共线性和各种线性相关的概念。


    参考资料:

    [1] https://www.bilibili.com/video/BV1Bb411S73w

    [2] https://www.cnblogs.com/pinard/p/6004041.html

    注:播客很多内容都是看上面视频整理的,个人为视频讲解的很好,对于机器学习小白,先学会如何使用,大致了解机器学习的算法原理,然后在逐步深入学习很友好,所以非常感谢上面博主的视频讲解。


     

    展开全文
  • 什么是“线性”?

    千次阅读 2017-09-01 17:59:44
    线性关系:如果称一个数学函数L(x)为线性,可以是指:定义1:L(x)个只拥有一个变数一阶多项式函数,即可以表示L(x)=kx+b形式(其中k,b为常数)。 定义2:L(x)具有以下两个性质:可加性,齐次性

    结论

    1. 线性回归:在统计学中,**线性回归(Linear regression)**是利用称为线性回归方程的最小二乘函数对一个或多个自变量因变量之间关系进行建模的一种回归分析

    2. 线性关系:如果称一个数学函数L(x)为线性的,可以是指:

      • 定义1:L(x)是个只拥有一个变数的一阶多项式函数,即是可以表示L(x)=kx+b的形式(其中k,b为常数)。
      • 定义2:L(x)具有以下两个性质:
        • 可加性:L(x+t)=L(x)+L(t)

        • 一次齐次性: L(mx)=mL(x)}

      需要注意这2种定义分别描述的是2类不同的事物。研究高等数学的数学家一般只认定义2(有例外,如高等数学线性回归理论中“线性函数”概念的定义),但初等数学和许多非数学学科的书籍会习惯把定义1当作线性关系的概念(有的没有明确给出定义,但确是如此理解和使用的)。这种术语间的细微差异如果不注意的话,就容易引起混淆。

    3. 线性函数:满足某些性质的数学函数。

    4. 线性回归是统计学范畴,是一种分析方法,线性函数是数学术语(还分初等数学和高等数学),是满足某种性质的数学函数。两个线性领域不同,含义不同,不能简单类比。

      PS:需要注意的是,百度百科的解释和维基百科的解释差别较大,前两条摘自维基百科。

    过程

    这是一篇机器学习的笔记。
    之所以没命名为 机器学习笔记 之类的是因为,这篇博客记录了我对“线性”的搜索和理解。

    如果你看过斯坦福吴恩达的Machine Learning的前几节视频的话,你一定对线性回归,逻辑回归,线性决策边界,非线性决策边界有一定印象。

    我在做编程题的时候我忽然对“线性”不理解了,然后就开始查线性的意思,结果就出现了线性回归,线性函数,线性关系,线性分类器,等一系列含有“线性”的术语,越来越迷糊了。

    逻辑回归是线性分类器?

    ex3.pdf中有这么一句话

    However, logistic regression cannot form more complex hypotheses as it is only a linear classifier.3

    这里说逻辑回归是一个线性分类器(但是有个标注3)。
    但是我记得PPT中,逻辑回归的决策边界有直线的也有非直线的,那不是说逻辑回归也可以是非线性分类器吗?怎么和这里冲突了。

    在这里插入图片描述
    在这里插入图片描述

    查看注解3.

    3You could add more features (such as polynomial features) to logistic regression, but that can be very expensive to train.

    添加更多特征值作为多项式到逻辑回归中,但是会大量增加训练成本。但是这里并没有提到高阶。

    查看nlp.stanford.edu 提到:

    In two dimensions, a linear classifier is a line. Five examples are shown in Figure 14.8 .


    在这里插入图片描述

    所以这里我的结论是

    1, 逻辑回归是线性分类的,可以增加高阶多项式实现非线性分类,但是训练成本大大增加;

    2, 线性分类器的决策边界是直线(二维的时候),否则是非线性分类。

    到这里为止,线性->直线,曲线->非线性。

    线性回归的拟合(Hypothesis)函数不是线性函数?

    那么线性回归的拟合函数是高阶多项式的时候,这个函数是非线性函数?

    我之前一直以为线性回归的多项式拟合函数是线性函数!


    在这里插入图片描述
    百度百科中的介绍感觉不是很准确,就不贴在这里了,有兴趣的自行去看一下。

    之后就搜到了文章开头的维基百科的定义,好理解多了。

    线性回归:在统计学中,**线性回归(Linear regression)**是利用称为线性回归方程的最小二乘函数对一个或多个自变量因变量之间关系进行建模的一种回归分析

    线性关系:如果称一个数学函数L(x)为线性的,可以是指:

    • 定义1:L(x)是个只拥有一个变数的一阶多项式函数,即是可以表示L(x)=kx+b的形式(其中k,b为常数)。函数图形呈现为一条直线或线段。
    • 定义2:L(x)具有以下两个性质:
      • 可加性:L(x+t)=L(x)+L(t)
      • 一次齐次性: L(mx)=mL(x)}

    需要注意这2种定义分别描述的是2类不同的事物。研究高等数学的数学家一般只认定义2(有例外,如高等数学线性回归理论中“线性函数”概念的定义),但初等数学和许多非数学学科的书籍会习惯把定义1当作线性关系的概念(有的没有明确给出定义,但确是如此理解和使用的)。这种术语间的细微差异如果不注意的话,就容易引起混淆。

    定义1的定义动机是把函数图像为直线的数量关系称作线性的关系。从这种几何意义出发,定义1本来不具有对多元函数进行推广的必要,因为形如f(x1,x2,…,xn) = k1*x1+k2*x2+…+kn*xn+b的函数(其中各个k_ib均为常数)的图形根本不是直线,而是平面或超平面,因此也就谈不上“线”性了。

    看了维基百科之后我的结论是

    线性回归是统计学的一种分析方法,线性函数是描述有用某种性质的数学函数。

    线性回归的拟合函数不是线性函数。

    在学习线性回归最初,我们假设的拟合函数h(x)=a*x是线性函数,但是增加常数项和高阶次项以后就不再是线性函数了。

    个人理解,如有错误还请指正。

    展开全文
  • 泰勒公式几何意义利用多项式函数来逼近原函数,由于多项式函数可以任意次求导,易于计算,且便于求解极值或者判断函数性质,因此可以通过泰勒公式获取函数信息,同时,对于这种近似,必须提供误差分析,来...
  • 线性插值是指插值函数为一次多项式的插值方式,其在插值节点上插值误差为零。线性插值相比其他插值方式,如抛物线插值,具有简单、方便特点。如下图所示,表示事变量X和Y之间关系,他们符合线性关系。而且...
  •  多项式时间:在计算复杂度理论中,指的是一个问题的计算时间m(n)不大于问题大小n的多项式倍数。通俗点来说,多项式时间就是指时间复杂度是个多项式,或者说,就是这个程序运行的时间随着数据规模n变化的函数为f(n)...
  •  多项式时间:在计算复杂度理论中,指的是一个问题的计算时间m(n)不大于问题大小n的多项式倍数。通俗点来说,多项式时间就是指时间复杂度是个多项式,或者说,就是这个程序运行的时间随着数据规模n变化的函数为f(n)...
  • 刚开始学习全局匹配时候,常常看到论文中写到求解这个能量函数是一个NP问题,因此需要用什么什么思想进行求解等等,现在用自己话谈谈这个所谓NP问题。 我通俗理解NP就是时间复杂度类似于O({a ^ n}) 和...
  • 图像算法工程师 笔试题集锦

    万次阅读 2018-03-22 15:34:27
    大端模式,是指数据高位保存在内存低地址中,而数据低位保存在内存高地址中;小端模式,是指数据高位保存在内存高地址中,而数据低位保存在内存低地址中。2.SVM常用核函数有哪些? 线性核函数,...
  • 1算法的性质: 输入:输入0个或多个 ...这里指的多项式:各种初等函数指数对数等。 为什么分NP和P? 在计算机的性能提高时,P(存在时间复杂度为多项式的算法)时间复杂度会成倍缩减,但NP没有什么影响。本课程只研
  • PS: 首先时间复杂度本质一个函数,它是指一个算法在图灵机上运行时输入数据规模与运行时间之间的函数 比如冒泡排序时间复杂度O(n^2),它表明当待排序数据规模翻一倍时,排序时间变为原来 4倍(2平方)。...
  • 1.什么是贝叶斯定理? 条件概率公式: 2.朴素贝叶斯分类法数学原理是什么?其中朴素二字意味着什么? 数学原理: ...朴素意味着:条件独立...5.高斯分布概率密度函数在二维坐标轴上形状是什么? 钟行 ...
  • 8.1.1 什么是面向对象程序设计 8.1.2 面向对象程序设计特点 8.1.3 类和对象作用 8.1.4 面向对象软件开发 8.2 类声明和对象定义 8.2.1 类和对象关系 8.2.2 声明类类型 8.2.3 定义对象方法 8.2.4 类和...
  • 8.1.1 什么是面向对象程序设计 8.1.2 面向对象程序设计特点 8.1.3 类和对象作用 8.1.4 面向对象软件开发 8.2 类声明和对象定义 8.2.1 类和对象关系 8.2.2 声明类类型 8.2.3 定义对象方法 8.2.4 类和...
  • 时间复杂度入门

    2016-06-30 01:54:00
    时间复杂度: 常用的时间复杂度有:常数级,对数级,线性级 线性对数级 ...f(x) ε O(n*n):这里指的是f这个函数的增长速度 不会以后n*n快 这里的x指的是特定的输入 用n来估算x的范围大小 我们先写一段代码。QAQ...
  • 线性SVM与非线性SVM

    千次阅读 2017-12-10 10:57:18
    所谓线性SVM与非线性SVM是指其选用核类型。  用于分类问题时,SVM可供选择参数并不多,惩罚参数C,核函数及其参数选择。对于一个应用,选择线性核,还是多项式核,还是高斯核?还是有一些规则。  什么...
  • 回归问题

    2021-03-18 13:18:28
    策略就是要按照什么样的准则来学习 算法是学习模型的具体计算方法 这次主要介绍的是回归模型 主要包括线性回归,多项式回归,决策树回归 根据输入[[x1,y1x_{1},y_{1}x1​,y1​],[x2,y2x_{2},y_{2}x2​,y2​],…,...
  • 2-17 修改下面这个程序中错误,改正后它运行结果是什么? #include void main() int i int j; i = 10; /* 给i赋值 j = 20; /* 给j赋值 */ cout ; /* 输出结果 */ return 0; } 解: 改正: #include int main...
  • 假如不知道机器内程序中各语句实际上是什么,分别输入什么样detax来测试出while语句循环条件写错了。 (4)、把原程序中while语句之前y=1/x语句去掉,观察程序运行将会发生什么样变化。 假如不知道...
  • 数据结构(C++)有关练习题

    热门讨论 2008-01-02 11:27:18
    2、要求的图如下,也可以自己构造图,但是需要注意的是,图不能是退化的单链表: 实验报告要求: 1、 按要求记录下图的类的完整实验代码; 2、 纪录你所使用的图; 3、 按要求记录下要求的输出...
  • 一般说来 建立一个研究领域 指的是一种系统分析,或多或少地建立 其最基本的或基础的概念、其概念的一致性、以及其概念的本性顺序或层次结构;这可以有助于 将其与其它人类知识 联系起来。但是在一个领域的历史上,...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    3.计算机算法指的是(C),它必须具备(B) 这三个特性。 (1) A.计算方法 B. 排序方法 C. 解决问题的步骤序列 D. 调度方法 (2) A.可执行性、可移植性、可扩充性 B. 可执行性、确定性、有穷性 C. 确定性、有穷性...
  • modbus通信协议

    热门讨论 2010-08-06 15:26:22
    除功能代码因异议错误作了修改外,从设备将一独特代码放到回应消息数据域中,这能告诉主设备发生了什么错误。 主设备应用程序得到异议回应后,典型处理过程重发消息,或者诊断发给从设备消息并报告给...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

多项式函数指的是什么