回归样条法介绍及其实现步骤与技巧

您所在的位置:网站首页 线性回归建模步骤 回归样条法介绍及其实现步骤与技巧

回归样条法介绍及其实现步骤与技巧

#回归样条法介绍及其实现步骤与技巧| 来源: 网络整理| 查看: 265

作为数据科学领域的新手,你接触的第一个算法是不是线性回归?当你把它用于不同的数据集时,你会发现它非常简单方便,但现实中的很多问题是非线性的,这种依赖因变量和自变量之间线性关系的做法有时行不通。这时,你尝试了多项式回归,虽然大部分时间它给出了更好的结果,但在面对高度可变的数据集时,你的模型也会频繁地过拟合。

过拟合

我们的模型总是变得太灵活,这对“看不见”的数据来说其实并不合适。你也许听说过加权最小二乘估计(weighted least-squares)、核估计(kernel smoother)、局部多项式估计(local polynomial fitting),但谈到对模型中未知函数的估计,样条估计依然占据着重要的位置。本文将通过一些线性和多项式回归的基础知识,简要介绍样条估计的一种方法——回归样条法(regression spline)以及它的Python实现。

注:本文来自印度数据科学家Gurchetan Singh,假设读者对线性回归和多项式回归有初步了解。

目录

1.了解数据

2.线性回归

3.线性回归改进:多项式回归

4.回归样条法及其实现

分段阶梯函数

基函数

分段多项式

限制和样条

三次样条和自然三次样条

选择结点的数量和位置

回归样条与多项式回归的比较

了解数据

为了理解这些概念,首先我们还是得提一下这本黄黄的、“可爱”的、砖头一样的教材:《统计学习入门》(An Introduction to Statistical Learning with Applications in R)。几天前twitter上有许多人转发了一个段子,说有人在马路边捡到了一本破烂的《统计学习入门》,边上躺着一个空的伏特加酒瓶和空烟盒,这本书的“毒性”请自行体会。

性爱、酒精以及SVM

书中提到了一个工资预测数据集,感兴趣的读者可以点击这里下载。这个数据集包含诸如身份ID、年份、年龄、性别、婚姻状况、种族、受教育程度、所在地、工作类别、健康状况、保险缴纳和工资等多种信息。为了介绍样条回归,这里我们把“年龄”作为自变量,用它来预测目标的工资情况(因变量)。

先处理数据:

# 导入模块

import pandas as pd

import numpy as np

import statsmodels.api as sm

import matplotlib.pyplot as plt

%matplotlib inline

# 读取data_set

data = pd.read_csv("Wage.csv")

data.head()

data_x = data['age']

data_y = data['wage']

# 将数据分为训练集和测试集

from sklearn.model_selection import train_test_split

train_x, valid_x, train_y, valid_y = train_test_split(data_x, data_y, test_size=0.33, random_state = 1)

# 年龄和工资关系b/w的可视化

import matplotlib.pyplot as plt

plt.scatter(train_x, train_y, facecolor='None', edgecolor='k', alpha=0.3)

plt.show()

看了这幅图,你对这些离散的点有什么想法吗?它们是积极的、消极的还是全然不相关的?你可以在评论区谈谈自己的想法。但别急,我们先做一些分析。

线性回归

线性回归是一种极其简单的、使用最广泛的用于预测建模的统计方法。作为监督学习算法,它能解决回归问题。当我们建立起因变量和自变量之间的线性关系后,这时我们就得到了一个线性模型。从数学角度看,它可以被当做是一个线性表达式:

在上式中,Y是因变量,X是自变量,也就是我们常说的特征,β则是分配给特征的权值系数,它们表示各个特征对于最终预测结果的重要性。例如我们设X1对方程结果的影响最大,那么和其他特征相比,β1/权重 的值会大于其他系数和权重的商。

那么,如果我们的线性回归中只有一个特征,这个等式会变成什么样?

我们把这种只包含一个独立变量的线性回归称为简单线性回归。因为之前的目标是根据“年龄”预测员工的“工资”,所以我们将在训练集上执行简单线性回归,并在测试集上计算模型的误差(均方误差RMSE)。

from sklearn.linear_model importLinearRegression

# Fit线性回归模型

x = train_x.reshape(-1,1)

model = LinearRegression()

model.fit(x,train_y)

print(model.coef_)

print(model.intercept_)

-> array([0.72190831])

-> 80.65287740759283

# 在测试集上预测

valid_x = valid_x.reshape(-1,1)

pred = model.predict(valid_x)

# 可视化

# 我们将从valid_x的最小值和最大值之间选70个plot画图

xp = np.linspace(valid_x.min(),valid_x.max(),70)

xp = xp.reshape(-1,1)

pred_plot = model.predict(xp)

plt.scatter(valid_x, valid_y, facecolor='None', edgecolor='k', alpha=0.3)

plt.plot(xp, pred_plot)

plt.show()

现在我们可以计算模型预测的RMSE:

from sklearn.metrics import mean_squared_error

from math import sqrt

rms = sqrt(mean_squared_error(valid_y, pred))

print(rms)

-> 40.436

从图中我们可以看到,线性回归没法捕捉所有可用的信号,结果不太好。

尽管线性模型的描述和实现相对简单,而且在解释和推理方面也更有优势,但它确实在性能上存在重大限制。线性模型假设各个独立变量之间存在线性关系,可惜的是这总是一个直线拟合的近似值,有时候它的精度会很差。

既然线性模型精度一般,那么我们暂且把线性假设放在一边,在它的基础上进行扩展,比如用多项式回归、阶梯函数等使模型获得性能提升。

线性回归改进:多项式回归

我们先来看看这些可视化图像:

和线性回归那张图相比,上图中的曲线似乎更好地拟合了工资和年龄信号的分布,它们在形状上是非线性的。像这种使用非线性函数的做法,我们称它为多项式回归。

多项式回归通过增加额外预测因子来扩展线性模型,它最直接的做法是在原先的自变量基础上添加乘方运算(幂)。例如一个三次回归会把X1、X22、X33作为自变量。

将线性回归扩展到因变量和自变量之间的非线性关系的一种标准方法是用多项式函数代替线性模型。

如果我们提高阶值,整个曲线会出现高频震荡,它的后果是模型过拟合。

# 为二次回归函数生成权值,degree =2

weights = np.polyfit(train_x, train_y, 2)

print(weights)

-> array([ -0.05194765, 5.22868974, -10.03406116])

# 用给定的权值生成模型

model = np.poly1d(weights)

# 在测试集上预测

pred = model(valid_x)

# 用70个观察值画图

xp = np.linspace(valid_x.min(),valid_x.max(),70)

pred_plot = model(xp)

plt.scatter(valid_x, valid_y, facecolor='None', edgecolor='k', alpha=0.3)

plt.plot(xp, pred_plot)

plt.show()

同样的,我们可以提高函数的幂(d),看看四次、十二次、十六次、二十五次回归函数的图像:

和线性回归一样,多项式回归的缺点也不少。一方面,随着等式变得越来越复杂,函数的数量也会逐渐增加,这就导致我们很难对它们进行处理。另一方面,正如上图所展示的,即便是在这么简单的一维数据集上,幂越高,曲线经过的信号点越多,形状也越诡异,这时模型已经出现过拟合倾向。它并没有从输入和输出中推导出一般规律,而是简单记忆训练集的结果,这样的模型在测试集上不会有良好的性能。

多项式回归还有一些其他的问题,比如它在本质上是非局部的。如果我们改变训练集上一个点的Y值,这会影响多项式对远处某点的拟合情况。因此,为了避免在整个数据集上使用高阶多项式,我们可以用多个不同的低阶多项式函数作为替代。

回归样条法及其实现

为了克服多项式回归的缺点,一种可行的改进方法是不把训练集作为一个整体,而是把它划分成多个连续的区间,并用单独的模型来拟合。这种方法被称为回归样条。

回归样条法是最重要的非线性回归方法之一。在普通多项式回归中,我们通过在现有特征基础上使用多项式函数来生成新特征,对于数据集而言,这些特征具有全局性影响。为了解决这个问题,我们可以把数据分布分成不同的几个部分,然后针对每一部分拟合线性或非线性的低阶多项式函数。

我们把这些分区的红点称为节点(knot),把拟合单个区间数据分布的函数称为分段函数(piecewise function)。如上图所示,这个数据分布可以用多个分段函数来拟合。

分段阶梯函数

阶梯函数是最常见的分段函数之一,它是一个在一定区间内保持不变的函数。通过使用阶梯函数,我们能把X的范围分成几个区间(bin),并在每个区间内拟合不同的常数。

换句话说,假设我们在X范围内设置了K个节点:C1,C2,...,CK,然后构建K+1个新变量:

I( )是个指示函数,如果在范围内,即条件为真就返回1;否则返回0。

# 把数据分成4个连续的区间

df_cut, bins = pd.cut(train_x, 4, retbins=True, right=True)

df_cut.value_counts(sort=False)

->

(17.938, 33.5] 504

(33.5, 49.0] 941

(49.0, 64.5] 511

(64.5, 80.0] 54

Name: age, dtype: int64

df_steps = pd.concat([train_x, df_cut, train_y], keys=['age','age_cuts','wage'], axis=1)

# 为年龄组创建虚拟变量

df_steps_dummies = pd.get_dummies(df_cut)

df_steps_dummies.head()

df_steps_dummies.columns = ['17.938-33.5','33.5-49','49-64.5','64.5-80']

# 拟合广义线性模型

fit3 = sm.GLM(df_steps.wage, df_steps_dummies).fit()

# 把分段函数对应到相应的4个区间内

bin_mapping = np.digitize(valid_x, bins)

X_valid = pd.get_dummies(bin_mapping)

# 删除异常值

X_valid = pd.get_dummies(bin_mapping).drop([5], axis=1)

# 预测

pred2 = fit3.predict(X_valid)

# 计算RMSE

from sklearn.metrics import mean_squared_error

from math import sqrt

rms = sqrt(mean_squared_error(valid_y, pred2))

print(rms)

->39.9

# 用70个观察值画图

xp = np.linspace(valid_x.min(),valid_x.max()-1,70)

bin_mapping = np.digitize(xp, bins)

X_valid_2 = pd.get_dummies(bin_mapping)

pred2 = fit3.predict(X_valid_2)

# 可视化

fig, (ax1) = plt.subplots(1,1, figsize=(12,5))

fig.suptitle('Piecewise Constant', fontsize=14)

# 多项式回归线散点图

ax1.scatter(train_x, train_y, facecolor='None', edgecolor='k', alpha=0.3)

ax1.plot(xp, pred2, c='b')

ax1.set_xlabel('age')

ax1.set_ylabel('wage')

plt.show()

这种分区方法也存在一些问题,其中最显著的是我们期望输入不同,模型的输出也会发生相应变化。但分类回归不会创建预测变量的连续函数,因此在大多数情况下,其实它的假设是输入和输出之间没有关系。例如在上图中,第一个区间的函数显然没有发现到随年龄增长工资也会不断上涨的趋势。

基函数

为了捕捉回归模型中的非线性因素,我们需要对一部分甚至所有的预测变量做一些变换。我们希望这是一个非常普遍的变换,它既能避免模型把每个自变量看作线性的,可以灵活地拟合各种形状的数据分布,又相对的不那么“灵活”,能有效防止过拟合。

像这种可以组合在一起以捕捉数据分布情况的变换,我们称之为基函数,也称样条基。在根据年龄预测工资的这个问题中,样条基为b1(X), b2(X),…,bK(X)。

现在,我们不再用X拟合线性模型,而是用这个新模型:

让我们深入了解基函数的一种基础用法:分段多项式。

分段多项式

在介绍分段阶梯函数时,我们介绍它是“把X分成几个区间,并在每个区间内拟合不同的常数”,套用线性回归和多项式回归的区别,分段多项式则是把X分成几个区间,并在每个区间内拟合不同的低阶多项式函数。由于函数的幂较低,所以图像不会剧烈震荡。

例如,分段二次多项式可以通过拟合二元回归方程来发挥作用:

其中β0、β1和β2在不同区间内取值不同。详细来说,如果我们有一个包含单个节点c的数据集,那它的分段三次多项式应该具有以下形式:

这其实是拟合了两个不同的多项式函数:一个xi 的观察值子集,一个是xi≥c的观察值子集。如上式所述,第一个多项式函数的系数是β01、β11、β21、β31,第二个的系数则是β02、β12、β22、β32。两个函数中的任意一个都可以用最小均方误差矩阵来拟合。

需要注意的一点是,这个多项式函数共有8个变量,每个多项式4个。

节点越多,分段多项式就越灵活,因为我们要为每个X区间分配不同的函数,而函数的形式则取决于该区间的数据分布。一般来说,如果我们在整个X范围内设置了K个不同的节点,我们最终将拟合K+1个不同的三次多项式。理论上来说,我们可以用任意低阶多项式拟合某个单独区间。

现在我们来看看设计分段多项式时应遵循的一些必要条件和限制条件。

约束和样条

能拟合目标区间数据分布的函数有很多,但分段多项式是不能随便设的,它也有各种需要遵循的限制条件。我们先来看看这幅图:

因为是分段的,两个区间的函数可能会出现不连续的现象。为了避免这种情况,一个必要的额外限制就是任一侧的多项式在节点上应该是连续的。

增加了这个约束条件后,我们得到了一条连续的曲线,但它看起来完美吗?答案显然是否定的,在阅读下文之前,我们可以先自行思考一个问题,为什么我们不能接受这种不流畅的曲线?

根据上图可以发现,这时节点在曲线上还很突出,为了平滑节点上的多项式,我们需要增加一个新约束:两个多项式的一阶导数必须相同。这里有一点值得注意,我们每增加一个条件,多项式就有效释放一个自由度,这可以降低分段多项式拟合的复杂性。因此在上图中,我们只用了10个自由度而不是12个。

加入一阶导数后,现在我们的多项式稍稍变得平滑了一些。这时它的自由度也从12个减少到了8个。虽然曲线改进了不少,但它还有不少提升空间。所以现在,我们再向它施加一个新约束:一个节点上两个多项式的二阶导数必须相同。

这条曲线就比较符合我们预期了,它只有6个自由度。像这样具有m-1个连续导数的m阶分段多项式,我们称之为样条(Spline)。

三次样条和自然三次样条

三次样条指的是具有一组约束(连续性、一阶和二阶连续性)的分段多项式。通常情况下,具有K个节点的三次样条一般有(K+1)×4-K×3,也就是K+4个维度。当K=3时,维度为8,这时图像的自由度是维度-1=7。一般情况下,我们只用三次样条。

from patsy import dmatrix

import statsmodels.api as sm

import statsmodels.formula.api as smf

# 在25、40和60三个节点生成三次样条

transformed_x = dmatrix("bs(train, knots=(25,40,60), degree=3, include_intercept=False)", {"train": train_x},return_type='dataframe')

# 在分区的数据集上拟合广义线性模型

fit1 = sm.GLM(train_y, transformed_x).fit()

# 生成4节三次样条曲线

transformed_x2 = dmatrix("bs(train, knots=(25,40,50,65),degree =3, include_intercept=False)", {"train": train_x}, return_type='dataframe')

# 在分区的数据集上拟合广义线性模型

fit2 = sm.GLM(train_y, transformed_x2).fit()

# 两个样条同时预测

pred1 = fit1.predict(dmatrix("bs(valid, knots=(25,40,60), include_intercept=False)", {"valid": valid_x}, return_type='dataframe'))

pred2 = fit2.predict(dmatrix("bs(valid, knots=(25,40,50,65),degree =3, include_intercept=False)", {"valid": valid_x}, return_type='dataframe'))

# 计算RMSE

rms1 = sqrt(mean_squared_error(valid_y, pred1))

print(rms1)

-> 39.4

rms2 = sqrt(mean_squared_error(valid_y, pred2))

print(rms2)

-> 39.3

# 用70个观察值画图

xp = np.linspace(valid_x.min(),valid_x.max(),70)

# 预测

pred1 = fit1.predict(dmatrix("bs(xp, knots=(25,40,60), include_intercept=False)", {"xp": xp}, return_type='dataframe'))

pred2 = fit2.predict(dmatrix("bs(xp, knots=(25,40,50,65),degree =3, include_intercept=False)", {"xp": xp}, return_type='dataframe'))

# 绘制样条曲线和误差曲线

plt.scatter(data.age, data.wage, facecolor='None', edgecolor='k', alpha=0.1)

plt.plot(xp, pred1, label='Specifying degree =3 with 3 knots')

plt.plot(xp, pred2, color='r', label='Specifying degree =3 with 4 knots')

plt.legend()

plt.xlim(15,85)

plt.ylim(0,350)

plt.xlabel('age')

plt.ylabel('wage')

plt.show()

众所周知,拟合数据分布的多项式函数在数据边界地带往往是不稳定的,边界区域的已知数据少,函数曲线常常会过拟合,这个问题同样存在于样条中。为了使多项式更平滑地扩展到边界节点之外,我们需要用到一种叫做自然样条的特殊方法。

相比三次样条,自然三次样条在边界区域增加了一个线性约束。这里我们说明一下,边界区域指的是自变量X的最大值/最小值与相应的最大最小节点之间的区域,这里信号比较稀疏,用线性处理简单控制RMSE值是可以接受的。这时函数的三阶、二阶就成了0,每个减少2个自由度,而这些自由度又在每条曲线的两段,所以多项式的维度K+4个维度这时就变成了K。

# 生成自然三次样条

transformed_x3 = dmatrix("cr(train,df = 3)", {"train": train_x}, return_type='dataframe')

fit3 = sm.GLM(train_y, transformed_x3).fit()

# 在测试集上预测

pred3 = fit3.predict(dmatrix("cr(valid, df=3)", {"valid": valid_x}, return_type='dataframe'))

# Calculating RMSE value

rms = sqrt(mean_squared_error(valid_y, pred3))

print(rms)

-> 39.44

# 用70个观察值画图

xp = np.linspace(valid_x.min(),valid_x.max(),70)

pred3 = fit3.predict(dmatrix("cr(xp, df=3)", {"xp": xp}, return_type='dataframe'))

# 绘制样条曲线

plt.scatter(data.age, data.wage, facecolor='None', edgecolor='k', alpha=0.1)

plt.plot(xp, pred3,color='g', label='Natural spline')

plt.legend()

plt.xlim(15,85)

plt.ylim(0,350)

plt.xlabel('age')

plt.ylabel('wage')

plt.show()

结点的数量和位置

说了这么多,那么当我们拟合样条时,我们该怎么选择节点?一种可行的方法是选择数据分布中的剧烈变化区域作为节点,如经济现象中的突变时刻——金融危机;第二种方法则是在数据变化复杂的地方多设置节点,在看起来更稳定的地方少设置节点,虽然这样做能起作用,但一般我们为了简便还是会截取长度相同的区间。另外,平均分配相同样本点个数是第三种常用的方法。

这里我们简要介绍第四种更客观的做法——交叉验证。要用这种方法,我们需要:

取走一部分数据;

用一定数量的节点使样条拟合剩下的这些数据;

用样条拟合之前取走的数据。

我们重复这个过程,直到每个观察值被忽略1次,再计算整个交叉验证的RMSE。它可以针对不同数量的节点重复多次,最后选择输出最小RMSE的K值。

回归样条与多项式回归的比较

回归样条一般能比多项式回归得到更好的输出。因为它与多项式不同,多项式必须要用高次多项式灵活地拟合整个数据集,而回归样条在保留非线性函数的灵活性的同时,依靠节点保证了整体的稳定性。

如上图所示,蓝色的回归样条曲线整体更平滑,捕捉到的信息也更全面。稳定只是一方面,此外,回归样条可以通过控制节点数量调节样条的灵活性,同时它也能添加线性约束来控制曲线在边界区域的结果,这使它能更有效地防止过拟合。

小结

写到这里,本文已接近尾声。通过这篇文章,我们了解了回归样条及其相较于线性回归和多项式回归的优势。在《统计学习入门》中,你还可以进一步学习另一种适用于高度可变数据集的生成样条方法,称为平滑样条。它与Ridge/Lasso正则化类似,惩罚了损失函数和平滑函数。

原文标题:回归样条法(regression splines)简介

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

扫一扫,分享给好友

复制链接分享 评论

发布评论请先 登录

相关推荐

如何使用BERT模型进行抽取式摘要   最近在梳理文本摘要相关内容,翻到一篇19年关于基于BERT模型进行抽取式摘要的老文「BertSu.... 的头像 深度学习自然语言处理 发表于 03-12 16:41 • 1187次 阅读 如何使用BERT模型进行抽取式摘要 如何快速学习并精通C语言 学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文.... 的头像 嵌入式ARM 发表于 03-12 11:59 • 302次 阅读 编写一个简单的C51程序 对于嵌入式系统,如果没有运行RTOS,那么程序开发中的 主函数(main())需要通过某种机制使其永.... 的头像 嵌入式ARM 发表于 03-12 11:17 • 267次 阅读 如何应用Material Design 3和Material You   Material You 是下一代 Material Design 的发展方向,也是一种全新的设.... 的头像 谷歌开发者 发表于 03-11 10:24 • 127次 阅读 C语言有哪些语法技巧和功能 C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非.... 的头像 strongerHuang 发表于 03-10 17:42 • 730次 阅读 使用GoRK3288库的时候需要用到的语法有哪些呢 使用GoRK3288库的时候需要用到的语法有哪些呢?... 发表于 03-10 06:49 • 149次 阅读 C语言简单模拟委托与简单模拟反射 函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被.... 的头像 硬件攻城狮 发表于 03-09 17:17 • 1438次 阅读 VMA和LMA的基本概念简介与常见问题解析 VMA和LMA的基本概念与常见问题解答 摘要:本文介绍VMA和LMA的基本概念,并针对一些理解过程中的常见疑问做出解... 发表于 03-09 06:45 • 288次 阅读 python私有变量和私有方法 python私有变量和私有方法 1. 下划线妙用 在 Python 中,下划线可是非常推荐使用的符号.... 的头像 python爬虫知识分享 发表于 03-08 16:30 • 378次 阅读 一文详细了解量子密码 被喻为“重要数据保险箱”的安全芯片已经渗入人们生活的方方面面。随着5G、物联网、车联网的迅速发展,为.... 的头像 上海航芯 发表于 03-08 10:32 • 288次 阅读 RK3399 Android 7.1亮度调节的步骤有哪些呢 RK3399 Android 7.1亮度调节的原理是什么? RK3399 Android 7.1亮度调节的步骤有哪些呢? ... 发表于 03-08 09:20 • 289次 阅读 请教大神RK3399-RGA该怎样去使用呢 请教大神RK3399-RGA该怎样去使用呢? 发表于 03-08 09:18 • 309次 阅读 TG6101开发实战:蓝牙开发概述 TG6101开发实战:蓝牙开发 1.概述 TG6101 SDK中使用bluedroid栈(4.0)实现对BR/BLE的开发,其中BR主要应用为... 发表于 03-08 08:43 • 694次 阅读 【1024平头哥开发套件开发体验】- sc5654 高级使用步骤 【1024平头哥开发套件开发体验】- sc5654 高级使用 SC5654语音识别流程介绍 语音转文字:asr使用MIT云 函数:void aui... 发表于 03-08 08:34 • 475次 阅读 HF、HNO3和H2O体系中硅的化学刻蚀实验 本文研究了HF、HNO3和H2O体系中硅的蚀刻动力学作为蚀刻剂组成的函数。蚀刻速率与蚀刻剂组成的三轴.... 发表于 03-07 15:27 • 12次 阅读 HF、HNO3和H2O体系中硅的化学刻蚀实验 python偏函数和泛型函数 python偏函数假如一个函数定义了多个位置参数,那你每次调用时,都需要把这些个参数一个一个地传递进去。 比如下面这个函数,是... 发表于 03-03 16:44 • 1012次 阅读 python偏函数和泛型函数详解 python偏函数 假如一个函数定义了多个位置参数,那你每次调用时,都需要把这些个参数一个一个地传递.... 的头像 python爬虫知识分享 发表于 03-03 16:43 • 407次 阅读 如何把uboot层logo的关闭显示呢 如何把uboot层logo的关闭显示呢? 如果logo不显调用kernel logo显示函数可以吗? ... 发表于 03-03 06:25 • 124次 阅读 python高阶函数 python高阶函数1. map 函数map 函数,它接收两个参数,第一个参数是一个函数对象(当然也可以是一个lambda表达式),第二个参数是... 发表于 03-02 16:47 • 590次 阅读 python高阶函数详解 python高阶函数 1. map 函数 map 函数,它接收两个参数,第一个参数是一个函数对象(当.... 的头像 python爬虫知识分享 发表于 03-02 16:47 • 171次 阅读 python高阶函数详解 python匿名函数的使用 python匿名函数的使用匿名函数(英语:anonymous function)是指一类无需定义标识符(函数名)的函数。通俗来说呢,就是它可以让... 发表于 03-02 16:42 • 353次 阅读 python匿名函数的使用 python匿名函数的使用 匿名函数(英语:anonymous function)是指一类无需定义标.... 的头像 python爬虫知识分享 发表于 03-02 16:42 • 168次 阅读 11个案例讲解python函数参数 函数,在定义的时候,可以有参数的,也可以没有参数。 的头像 python爬虫知识分享 发表于 03-01 16:39 • 233次 阅读 详解python普通函数创建与调用 函数是一种仅在调用时运行的代码块。您可以将数据(称为参数)传递到函数中,然后由函数可以把数据作为结果.... 的头像 python爬虫知识分享 发表于 03-01 16:32 • 228次 阅读 python列表的详细介绍 python列表 列表(英文名 list),是由一系列元素按顺序进行排列而成的容器。 这里面有两个重.... 的头像 python爬虫知识分享 发表于 02-22 15:14 • 157次 阅读 一文详细了解数字信号与模拟信号 数电模电是电子信息类专业的专业基础课。但是由于比较难,所以很多人学的并不是很好,今天阿斌就来带大家先.... 的头像 multisim 发表于 02-14 19:23 • 748次 阅读 一文详细了解五种IO模型 五种IO模型包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。 的头像 硬件攻城狮 发表于 02-14 14:38 • 484次 阅读 一文详细了解五种IO模型 线性恒流驱动1 线性恒流驱动1 发表于 02-10 09:22 • 39次 阅读 脉冲电流额定值如何计算 欢迎场效应晶体管(FET)的爱好者们再度光临,阅读“了解MOSFET产品说明书”博客系列的第四部分!.... 的头像 电子设计 发表于 02-06 09:18 • 263次 阅读 脉冲电流额定值如何计算 造成ADC不准确的主要原因是什么 这个问题的答案取决于对分辨率和精度概念的基本理解。尽管是两个完全不同的概念,这两个数据项经常被搞混和.... 的头像 电子设计 发表于 02-06 09:08 • 230次 阅读 造成ADC不准确的主要原因是什么 《EXCEL函数使用大全》张小峰编 《EXCEL函数使用大全》张小峰编 发表于 01-21 16:11 • 64次 阅读 C2000芯片怎么给一个连续的RAM区间赋初值 作者:TI FAE  – Johnson Chen 在开发程序的时候,我们经常会希望某些全局变.... 的头像 电子设计 发表于 01-19 15:15 • 285次 阅读 C2000芯片怎么给一个连续的RAM区间赋初值 电流对时间求导出来的是什么 电流对时间求导出来的电流的瞬间变量,电流对时间的导数是电流的变化速度。 的头像 工程师邓生 发表于 01-16 16:42 • 894次 阅读 编程关于变量二三事 尽量用局部变量替代全局变量。如果用局部变量能实现功能,最好用局部变量。在函数仅仅只是要用到某个全局变.... 发表于 01-13 15:06 • 33次 阅读 编程关于变量二三事 如何将函数封装成库使用的方法介绍 Other Parts Discussed in Post: C2000WARE作者:Aki Li .... 的头像 电子设计 发表于 01-12 16:32 • 384次 阅读 如何将函数封装成库使用的方法介绍 《复变函数与积分变换》高等教育出版社(华中科大数学系)pdf 复变函数与积分变换第四版(华中科技大学) pdf高清电子版 发表于 01-12 09:17 • 109次 阅读 《通过计算分度函数及反函数实现热电偶高精度测温》论文下载 提高测控精度是对温控器的一个永恒要求。为此,要不断地在设计中引入新技术。本文论述通过用嵌套乘法计算热.... 发表于 01-11 09:59 • 66次 阅读 c语言 第一节 数据的类型 C语言学习 发表于 01-09 11:36 • 171次 阅读 通信原理与matlab仿真v2 第十章 FSK和ASK(8) 继续给出子函数的内容!这样才能保住程序的正确运行!最近有人问我关于GFSK的话题,后续单独写一个系列.... 的头像 通信工程师专辑 发表于 12-30 15:03 • 1312次 阅读 公共 GitHub repo的 secret 泄漏有多严重 我们已经正式发布了 Dart SDK 的 2.15 版本,该版本新增了可快速并发的工作器 isola.... 的头像 谷歌开发者 发表于 12-29 15:57 • 514次 阅读 OpenHarmony Dev-Board-SIG专场:最基本的芯片适配所需的函数 OpenHarmony Dev-Board-SIG专场:最基本的芯片适配所需的函数 的头像 lhl545545 发表于 12-28 16:12 • 462次 阅读 OpenHarmony Dev-Board-SIG专场:最基本的芯片适配所需的函数 西门子PLC的功能模块介绍  1.功能介绍(FC) 1)函数(FC)是用户编写的程序块。函数是一个没有内存的逻辑块。属于FC的临.... 发表于 12-28 09:37 • 739次 阅读 龙芯1c300如何移植OpenHarmony相关代码 龙芯1c300移植OpenHarmony相关可以查看:首发!成功移植OpenHarmony到龙芯开发.... 的头像 HarmonyOS官方合作社区 发表于 12-24 17:23 • 721次 阅读 龙芯1c300如何移植OpenHarmony相关代码 STM32F103串口1 printf函数的实现   在单片机中使用最多的通信接口基本就是串口了,说起串口就不得不提串口中最常用的一个函数就是打印函数.... 发表于 12-20 19:37 • 57次 阅读 STM32F103串口1 printf函数的实现 韦东山freeRTOS系列教程之队列(queue)(5) 文章目录 系列教程总目录 概述 5.1 队列的特性 5.1.1 常规操作 5.1.2 传输数据的两种.... 的头像 嵌入式Linux那些事 发表于 12-13 14:33 • 1820次 阅读 韦东山freeRTOS系列教程之队列(queue)(5) 【技术分享】星空派GD32开发板LVGL移植经验分享 今天有点空,我们移植一下LVGL~ 先看效果图:     在这之前,我们得调试好屏幕及触摸~ 我们以.... 的头像 电子发烧友论坛 发表于 12-09 16:12 • 3304次 阅读 【技术分享】星空派GD32开发板LVGL移植经验分享 基于HarmonyOS ArkUI3.0框架的木棉花扫雷   前言  基于HarmonyOS ArkUI 3.0 框架的木棉花扫雷(上) 已经给大家分享了木棉.... 的头像 HarmonyOS官方合作社区 发表于 12-07 11:08 • 698次 阅读 TM4C123G--移植MPU6050DMP库和函数使用说明 TM4C123G--移植MPU6050DMP库和函数使用说明 发表于 12-06 17:06 • 123次 阅读 TM4C123G--移植MPU6050DMP库和函数使用说明 【RTT大赛作品连载】 OLED显示图片 使用AB32VG1驱动IIC显示图片。 的头像 闲来无事玩单片机呀 发表于 12-06 09:17 • 4547次 阅读 【RTT大赛作品连载】 OLED显示图片 鸿蒙滑动拼图验证组件分享 已开源    基于安卓平台的滑动拼图验证组件 SwipeCaptcha,实现了鸿蒙化迁移和重构,代码已经开源.... 的头像 HarmonyOS技术社区 发表于 12-03 10:04 • 774次 阅读 鸿蒙滑动拼图验证组件分享 已开源 我们该如何去判断线性霍尔元件的好与坏 线性霍尔元件概念:线性霍尔H493,HTS491,H49E,H95A,H96B,SS49E,是一种模.... 发表于 12-01 11:09 • 161次 阅读 Arduino 常用函数参考文档 Arduino 常用函数参考文档一、程序结构二、数字输入输出三、模拟输入输出四、模拟输入输出一、程序.... 发表于 11-30 12:06 • 87次 阅读 Arduino 常用函数参考文档 什么是网络认证技术 认证是指用户采用某种方式来证明自己确实是自己宣称的某人,网络中的认证主要包括身份认证和消息认证。身份.... 的头像 讯维官方公众号 发表于 11-26 16:21 • 1037次 阅读 MSP系列MCU提供一款高级调试工具 调试大型软件程序始终是一项具有挑战性的工作;通常情况下,很难知道从哪儿入手!MSP432低功率和高性.... 的头像 电子设计 发表于 11-24 09:35 • 433次 阅读 怎么用MSP432 MCU发挥实时操作系统所具有的优势 Other Parts Discussed in Post: ENERGIA当你需要提升产品性能时,.... 的头像 电子设计 发表于 11-23 15:39 • 492次 阅读 4利用移位函数操作点亮流水灯 PROTEUS 和51单片机教程(附仿真文件+源代码) 功能说明:利用移位函数操作点亮流水灯程序源代码如下:#include .... 发表于 11-20 17:06 • 114次 阅读 4利用移位函数操作点亮流水灯 PROTEUS 和51单片机教程(附仿真文件+源代码) new[] 和 delete[]能不配对使用吗 在平时资料中,我们常看到: new和delete,new[]和delete[]一定要配对使用! 也 .... 的头像 Linux爱好者 发表于 11-17 10:24 • 580次 阅读 Squore对软件项目实现多维度的全面质量评估 随着软件工程的规模逐步扩大、复杂程度逐渐提升,以及敏捷开发对效率和协作有了更高的要求,项目干系人如何.... 的头像 Vector维克多 发表于 11-16 17:59 • 935次 阅读 关于滤波仿真的文章中存在一个错误 之前在心率检测程序中用到了firpm函数,出现了一些问题。然后又看到读者的留言,确实之前关于滤波仿真.... 的头像 通信工程师专辑 发表于 11-16 14:38 • 537次 阅读 关于滤波仿真的文章中存在一个错误 C语言代码中调用汇编函数需要注意什么 除了汇编语言工程和C语言工程,许多嵌入式工程既包含C语言又包含汇编语言。由于Keil MDK的默认启.... 的头像 单片机匠人 发表于 11-12 11:04 • 588次 阅读


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3