机器学习之特征工程

2023-11-16

1. 为什么做特征工程

       我们学习编程语言时被告知程序=数据结构+算法,那么对于机器学习,我认为也可以类比为机器学习=大数据+机器学习算法+运行平台。面对一个机器学习问题,一般有两种解题思路:传统机器学习算法或者深度学习算法。一般而言,传统机器学习需要的样本数量相对少、算法运行快、内存开销小、算法的运行和部署难度小,但困难是对数据的表示:特征工程,也可以形容为沙里淘金;而深度学习算法,可以让算法自己学习数据的特征表示,因此易上手但需要海量的数据样本、需要的计算资源和内存大、算法模型的调参难度大。

      就我个人的感觉,传统机器学习算法的运用需要仔细构建数据特征,数据和特征工程决定了算法容量的上限。深度学习的算法容量上限主要受限于数据的规模和计算能力,对人的要求比传统机器学习相对低一些,降低了机器学习问题解决的门槛。不幸的是,很多时候运用机器学习算法的问题领域数据受限或者计算资源受限,较为适宜于运用传统机器学习算法,此时做特征工程尤为重要。

2. 什么是特征工程

      特征工程就是挖掘对数据的特征表示,寻找表征数据内在特点的性质,将其用用特征向量的形式表示,这一步骤被称为特征提取。例如一条数据的特征向量是x=<x1,x2,..., xn>,即数据有n个特征,特征xi的取值是连续的实数或者描述型的整数。以文本分类为例,文本数据中所有的词就是文本的特征,一个文本中词出现的频率可以作为该文本的特征取值,这种方法在文本分类中被称为词袋法,寓意是文本是由词袋中抽取的一个个词构成的。

    数据被抽取特征生成特征向量后,我们获得了数据的内在特征表示,需要进一步对特征进行分析:对数据进行量纲上的统一、看看特征的内在相关性、特征是否对所要解决问题有用,数据特征能否进行直观的展示等。以上这些可以被归纳为特征工程的步骤包括:特征提取、特征清洗、特征选择、特征降维、数据特征可视化,下面一一介绍。

3. 怎么做特征工程

3.1 特征提取

    特征工程的第一步是特征提取,提取数据内在表征的性质,将其转换为数值表示的特征向量。假设有N个数据样本,每个数据样本提取M个特征,则数据集进行特征提取后得到N*M维度的特征向量。

    那么如何提取数据的特征呢?一种方法是通用型的方法,将数据进行某种散列式的处理,得到数据散列后的所有特征,然后进行数值化的表示,例如文本分类时对文本数据进行分词,将文本中出现的词作为文本的特征,然后将词在文本中的统计特征作为该词的数值化表示。另一种方法是根据数据要解决的问题,寻找对要解决该问题有针对性的特征,将其进行数值化。这要求机器学习的应用者对所要解决的问题的领域有很深的理解,具有较深的专家知识才能做到,一种取巧的方法是看该问题领域内的学术论文,让专家帮助咱们寻找特征,但这只能帮助帮助我们将机器学习模型调到不错的性能,机器学习算法性能的上界还是取决于我们自己对真正所要应用数据的特征挖掘。

    特征提取是用机器学习算法解决应用问题的基础,会占用了我们机器学习实施过程的大部分时间和精力,也没有系统性的通用方法,只能由我们不断迭代的优化提取。但在有些研究领域,也有一些指向性的方法,例如文本分类,提取文本数据特征的方法一般是将文本散列化,有两种较通用方法:1)词袋法,先将文本分词,然后将所有的词作为文本的特征;2)N-Gram语言模型,文本中的每个词只与其之前的N个词有关,我们按照N=2或3将文本散列成每2或3个字(对于中文是字,对于英文是字符)组成的字组,然后将所有的字组作为文本的特征。得到文本特征之后需要进行数值化,也有两类方法:a)一种是统计型数值方法,统计一个文本数据中每个特征词(或者字组)出现的词频、文档频、在文本不同类别中出现的次数,构成一个特征权重计算公式,计算特征词的权重作为数值化表示,例如TF-IDF; b)将词(或者字组)进行词嵌入表示,例如word2vec/gloVe,词嵌入能够表示词之间的语义相关性,是一种词的稠密表示,即将一个特征值数值化为一个K维的向量(k=50,100,200等)。据我个人的经验,如果文本数据样本较多,且每个文本数据的长度较大,直接用词袋法+统计型数值化方法即可;对于数据样本有限,且文本多为短文本时,用N-Gram+词嵌入方法可能更好。更一般的做法是,将以上方法进行两两组合,然后放到不同算法模型中迭代,寻找最优的组合。

3.2 特征清洗

    数据特征被提取后,需要对特征进行统计分析,然后做如下处理:

    3.2.1. 缺失值填充

    有些数据样本中的特征可能由于某些原因存在缺失值,对于缺失值存在三种处理方法:

         a) 如果某个特征的缺失值比较多:可能就直接舍弃。
       b) 如果缺失值不是很多,而且是连续特征:可以考虑用回归方法去拟合,或者直接用众数、中位数、平均数等具体的值去替代即可。

         c) 如果缺失值不是很多,而且是非连续特征:可以尝试把缺失值当做一个新的类目去处理,可能也揭示了一定的客观现实。

  Python的sklearn库也有缺失值处理的功能:

from numpy import vstack, array, nan
from sklearn.preprocessing import Imputer
#缺失值计算,返回值为计算缺失值后的数据
#参数missing_value为缺失值的表示形式,默认为NaN
#参数strategy为缺失值填充方式,默认为mean(均值)
Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))

     3.2.2. 移除固定值的特征

     3.3.3. 移除低方差的特征

     3.3.4. 描述性变量转换

        对于描述性的变量,要看变量的性质:

   a)对于有序变量,例如非常满意、满意、不满意、非常不满意,变量的不同取值有内在顺序关系,可以用公式转换:Value=(i-1/2)/N且i=1,2,...,N,这里N表示变量取值的总数,这个公式保留了变量取值的顺序关系;

   b)对于无序变量,可以采用one-hot编码的方式。例如特征取值范围是{春、夏、秋、冬},则一个数据的特征取值为“夏”,则one-hot编码是0100,若特征取值为"秋"则one-hot编码是0010。python的sklearn库支持one-hot编码转换:

from sklearn import preprocessing
import numpy as np
label = preprocessing.LabelEncoder()
one_hot = preprocessing.OneHotEncoder(sparse = False)
cat_data =([1,3,2], 
           [2,1,1],
          [4,2,2])
print one_hot.fit_transform(cat_data)

     3.2.5. 连续特征离散化

        连续特征可以当非连续特征来用,非连续特征可以当连续特征来用。比方说年龄特征是一个连续的特征,但是把年龄层分成5-18岁(中小学生),19-23岁(大学生),24-29岁,30-40岁(成家立业),40-60岁(中年人),更容易理解不同年龄层人的特性。典型的离散化步骤:对特征做排序-> 选择合适的分割点-> 作出区间的分割 -> 作出区间分割-> 查看是否能够达到停止条件。python的sklearn库也支持这种离散化:

from sklearn.preprocessing import Binarizer
#二值化,阈值设置为3,返回值为二值化后的数据
Binarizer(threshold=3).fit_transform(iris.data)

    3.2.6. 特征标准化或者归一化

  特征标准化有两种方法:

       1. 去均值的标准化。


        当S表示所有样本的标准差时,Python的sklearn库提供了标准化方法:

from sklearn.preprocessing import StandardScaler
 #标准化,返回值为标准化后的数据
StandardScaler().fit_transform(iris.data)

  2 区间缩放的标准化方法

     计算公式:x'=x-min/max-min,max和min分别表示特征x取值的最大值和最小值。Python的sklearn库提供了这种标准化方法:

from sklearn.preprocessing import MinMaxScaler
#区间缩放,返回值为缩放到[0, 1]区间的数据
MinMaxScaler().fit_transform(iris.data)

  特征归一化的方法

  归一化是有别与标准化的:标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的同一特征的不同取值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,将同一数据的不同特征的取值转换到同一量纲下,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。

      归一化的好处:   1) 归一化为什么能提高梯度下降法求解最优解的速度。归一化前的梯度下降轨迹是弯曲的曲线;而归一化后梯度下降的轨迹是类似直线。2) 归一化有可能提高精度。一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

3.3 特征选择

    特征经过处理后,一般还需要进行特征选择,原因是:1)避免或减轻维度灾难,维度灾难是由于特征过多造成机器学习算法模型容纳能力超过上限;2)去除数据中的噪声,以及对所要解决的问题无关的特征,降低机器学习算法学习的难度。按照周志华《机器学习》书籍中的划分,特征选择的方法有三种:过滤式、包裹式和嵌入式的。

3.3.1过滤式特征选择

  过滤式的特征选择,按照重要性、发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。比较常见的是词频法TF,TF-IDF法、方差选择法、相关系数法、卡方检验、互信息等特征选择方法。Python的sklearn库提供了如下的方法:

 1)方差选择法:先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。代码如下:

from sklearn.feature_selection import VarianceThreshold
#方差选择法,返回值为特征选择后的数据
#参数threshold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(iris.data)

 2) 相关系数法:先要计算各个特征对目标值的相关系数以及相关系数的P值。

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

 3) 卡方检验,检验定性自变量对定性因变量的相关性。

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

    4)互信息法,也是评价定性自变量对定性因变量的相关性的,为了处理定量数据,最大信息系数法被提出。

from sklearn.feature_selection import SelectKBest
from minepy import MINE
#由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
def mic(x, y):
    m = MINE()
    m.compute_score(x, y)
    return (m.mic(), 0.5)
#选择K个最好的特征,返回特征选择后的数据
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

3.3.2 包裹式特征选择

    包裹式特征选择,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。包裹式特征选择直接针对给定学习算法进行优化,将最终要使用的学习器性能作为特征子集的评价标准,优点是选择的特征子集最适合学习器,缺点是在特征选择过程中需要多次训练学习器,计算开销大于过滤式特征选择。

       Python的sklearn库提供了递归特征消除法,使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)

3.3.3 嵌入式特征选择

    嵌入式特征选择将特征选择过程和学习器的训练过程融为一体,在学习器的训练过程中自动地进行特征选择。我们知道机器学习算法优化目标中添加L1正则项,更易于获得稀疏解,即特征集合中有更少的非零特征。使用带L1正则项的机器学习模型,除了筛选出特征外,同时也进行了降维。使用Python的sklearn库使用带L1惩罚项的逻辑回归模型,来选择特征的代码如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#带L1惩罚项的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)

    基于树模型机器学习算法,例如随机森林在训练过程中能够输出特征对模型的重要性排序结果,这也可以作为特征选择的依据。例如:

from sklearn.ensemble import RandomForestClassifier
def do_randomForest(x_train, x_test, y_train, y_test):
    clf = RandomForestClassifier(n_estimators=10, criterion='entropy', max_depth=None,min_samples_split=2, random_state=0)
    clf.fit(x_train,y_train)
    y_pred=clf.predict(x_test)
    #计算特征的重要性
    importances = clf.feature_importances_
    indices = np.argsort(importances)[::-1]
    with open(rf_feats_importance, 'w') as wf:
       wf.write("Feature Importances are as follows:")
       for f in range(x_train.shape[1]):
          wf.write("\t%2d) %-*s %f\n" % (f + 1, 30, feat_labels[f], importances[indices[f]]))

3.4 特征降维

    特征降维可能出于两个原因:1)当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的;2)我们希望查看数据的分布视图,看看数据的实际分布情况,此时需要将数据的特征降低到二维空间才能进行数据可视化。

3.4.1 PCA降维

    最常用的特征降维方法是PCA降维,PCA降维的前提是特征之间存在关联。所谓关联,例如我们测量飞行员时,有两个指标一个是飞行技术(x1),另一个是对飞行的喜好程度(x2),这两者之间是有关联的,即correlated的。PCA降维的大致思想就是: 挑选特征明显的、显得比较重要的信息保留下来。选择标准有两个:

       a) 同一个维度内的数据,方差大的比较明显,因为方差大表示自己和平均水平差异大,有个性,降维后也最可能分的开。

      b)两个不同维度间关联度越小越好,因为关联度小表示这两个维度表征共同信息的量比较少,最理想就是两个维度不相关,相关度为0(相关度可以用协方差cov(a,b)表示),在线性空间内表现为两个维度正交。

    PCA的几何解释:PCA是将数据往低维空间投影,寻找数据点在投影平面上行投影点方差最大的投影平面。也可以理解为寻找数据点到投影平面直线距离之和最短的投影平面。

       PCA是如何计算的呢?

1. 将m个样本n个特征的训练集组成m*n列的矩阵X。
2. 将矩阵X进行归一化: 因为在降维映射的过程中, 存在映射误差, 所有在对高维特征降维之前, 需要做特征归一化(feature normalization), 这个归一化操作包括: (1) feature scaling (让所有的特征拥有相似的尺度,标准化X-X的均值) (2) zero mean normalization (零均值归一化)。 
3. 计算矩阵X的协方差矩阵S。
4. 对协方差矩阵S进行特征分解,求得特征值和特征向量。有两种求解方法:
    a) 存在特征值组成的对角矩阵D且该矩阵是方阵,即S=QDQT,D是代表特征值的对角矩阵,Q是特征向量=[u1,u2,...., un]。
  b) 否则,用SVD(奇异值分解)方法,计算代价很大,svd(S)=[U, D, V], 则求得U是所有的特征向量U=[u1,u2,..., un], ui是第i个特征的特征向量(n行1列)。注意D是一个m*n列的对角矩阵,不要求是方阵。
5. 如果我们降维到k维,则从特征向量中取出前k个Uk=[u1,u2,...,uk]。
6. 根据Uk对训练数据X降维:第i个样本(1*n)降维之后是UkTXi,其中UkT是Uk的转置。

    如何选择PCA降维后的维度k呢?使用公式:


       即用降维前后样本的欧几里得距离来表示降维的损失,如果error<0.01,也就是说保留了系统的99%的不确定性。需要计算的就是, 找到一个最小的 k 使得上面的公式成立, 但是计算上面公式, 由于样本太多而导致计算量太大, 并且对于每一个 k 取值都需要重新计算降维矩阵。 可以近似的使用协方差特征分解产生的特征值对角矩阵D来代替,则:
error=sum(dii), 1<=i<=k / sum(dii),1<=i<=n。

    使用Python的sklearn库如下:

from sklearn.decomposition import PCA
#主成分分析法,返回降维后的数据
#参数n_components为主成分数目
PCA(n_components=2).fit_transform(iris.data)

3.4.2 线性判别分类器LDA降维

      线性判别分类器,将待分类数据从高维空间向低维的线性空间投影,使得相同类别的样本投影后在线性空间的距离尽可能的小,而不同类别的样本投影后在线性空间的距离尽可能的大。使用Python的sklearn库如下:

from sklearn.lda import LDA
#线性判别分析法,返回降维后的数据
#参数n_components为降维后的维数
LDA(n_components=2).fit_transform(iris.data, iris.target)

3.4.3 流形学习降维

    流形学习的前提是数据符合流形假设:我们所能观察到的数据实际上是由一个低维流形映射到高维空间上的。由于数据内部特征的限制,一些高维中的数据会产生维度上的冗余,实际上只需要比较低的维度就能唯一地表示。

    流形学习的作用是:a) 流形学习的一个主要应用就是“非线性降维” (参见Wikipedia: Nonlinear dimensionality reduction)。而非线性降维因为考虑到了流形的问题,所以降维的过程中不但考虑到了距离,更考虑到了生成数据的拓扑结构。b)流形能够刻画数据的本质。我们希望我们的模型能够学习到“数据在流行空间中的表示”。

    流形学习的常用方法:

        1. MDS(Multidimensional Scaling)多维尺度变换
PCA和MDS是相互对偶的两个方法。MDS就是理论上保持欧式距离的一个经典方法,MDS最早主要用于做数据的可视化。由于MDS得到的低维表示中心在原点,所以又可以说保持内积。也就是说,用低维空间中的内积近似高维空间中的距离。经典的MDS方法,高维空间中的距离一般用欧式距离。
        2. Isomap等距映射方法
他的理论框架就是MDS,但是放在流形的理论框架内,原始的距离换成了流形上的测地线(geodesic)距离。其它一模一样。所谓的测地线,就是流形上加速度为零的曲线,等同于欧式空间中的直线。流形上两点之间距离最短的线是测地线。在Isomap中,测地线距离就是用两点之间图上的最短距离来近似的,这方面的算法是一般计算机系中用的图论中的经典算法。
        3. 局部改线嵌入(Local Linear Embedding, LLE)
假设数据中每个点可以由其近邻的几个点重构出来。降到低维,使样本仍能保持原来的重构关系,且重构系数也一样。
        4. 拉普拉斯特征映射(Laplacian Eigenmaps, LE)
将数据映射到低维,且保持点之间的(相似度)距离关系。即在原空间中相距较远的点,投影到低维空间中,希望它们之间仍相距较远。反之亦然。说白了,就是保持图的局部邻接关系的情况把这个图从高维空间中重新画在一个低维空间中(graph drawing)。

    Python的sklearn库包含的manifold模块可以用于模型学习,上面所述的大部分算法都已经被包含,详细用法请参考:

        http://scikit-learn.org/stable/modules/manifold.html

    流形学习的缺点是:

        1.对噪音的处理能力不足,对数据的要求比较高;
        2. 流型的结构学习,需要不断发展统计学习理论;
        3. 流型学习算法往往要求一个整体的矩阵分解,很难处理大规模数据。

其余的特征降维方法还包括聚类、文档主题模型LDA(如果数据是文本),以及之前说的基于特征提取的降维、文本词嵌入等方法。

4. 数据不平衡的工程化方法

    有些机器学习算法对数据的平衡性有较高要求,即要求分类器输入的正类样本数量与负类样本数量要大致比例均衡。如果我们获得的数据样本是不均衡的,则需要在特征工程里针对数据不平衡做处理。个人总结,处理数据不平衡有以下几种方法:

   1. 训练一个生成模型,仅仅针对一类样本的单分类器,例如OneClassSVM。如果数据比例相差很大,例如正类数据样本占比90%,则可以只训练一个识别正类样本的单分类器,尽可能学习正类样本的分类特性,其最终效果可能好于二分类器。

      2. 在分类之前先做一遍聚类分析。可以考察一下其中是否有一些聚类簇明显的不包含正样本。这样我们可以先做一个粗的分类器,将这一些样本分开,然后再看剩下来的数据是否不均衡的状况会减轻很多。在剩余的数据上再做一个分类器。

      3.采样分析。包括上采样和下采样,通过采样和人工合成数据重构样本比例达到均衡。Python中imbalanced-learn库就是用采样的方法来解决数据不平衡问题的。详情请参考:http://contrib.scikit-learn.org/imbalanced-learn/stable/,基本功能线下表:


       4.机器学习算法选择对样本比例不敏感的算法,例如随机森林这类bagging采样方法的算法。

5. 数据

特征工程作为机器学习项目的一个重要环节,相对机器学习的算法而言,特征工程的工作看起来比较low,但是特征工程在机器学习中非常重要。特征工程,是机器学习系列任务中最耗时、最繁重、最无聊却又是最不可或缺的一部分。本文总结了一些特征工程中的一般步骤和少许经验,但仍然远远不够,以后还需要多多总结。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习之特征工程 的相关文章

随机推荐

  • Dropout Learning - 防止深度神经网络过拟合

    最近在学习caffe 里面有一个名词叫做Dropout Learning 一直没明白是什么意思 直到最近才发现一片文章介绍Dropout Learning的 希望可以给不知道的同学一定的帮助 如果想要更深入的了解可以阅读该文献 文章结尾会给
  • MOV指令在32位汇编程序和64位汇编程序下的相同与不同之处

    mov指令原则 两个操作数 目标操作数和源操作数 的大小必须相同 两个操作数不能同时为内存操作数 也就是不能内存 到 内存 指令指针寄存器不能作为目标操作数 64位汇编程序下 32位汇编程序和64位汇编程序都依照上面的规则 语法也相同 但如
  • 目标跟踪算法

    目标跟踪算法 一 目标跟踪算法简介 1 1 主要任务 1 1 1 Online Visual Tracker BenchMark 1 1 2 VOT 1 2 难点与挑战 1 3 分类 1 3 1 常规分类 1 3 2 时间分类 二 常用算法
  • 从Bengio的NPS模型看AGI的实现通路

    来源 混沌巡洋舰 这两天深度学习祖师Yoshua Bengio 的 Neural Production System 刷新了AI圈子 与以往的深度学习套路不同的是 这篇文章有效的把符号主义AI对人类认知的模拟与深度学习结合 得到了一个能够学
  • 《每日一题》NO.21:画出CMOS 非门/与非门/或非门的结构

    芯司机 每日一题 会每天更新一道IC面试笔试题 其中有些题目已经被很多企业参考采用了哦 聪明的你快来挑战一下吧 今天是第21题 CMOS Complementary Metal Oxide Semiconductor 互补金属氧化物半导体
  • Vivo 2019秋季校园招聘笔试题(9月22号机考)

    Vivo笔试题这次真是出乎意料了 上来就直接三道编程题奉上 题目描述 1 小V在公司负责游戏运营 今天收到一款申请新上架的游戏 跳一跳 为了确保提供给广大玩家朋友们的游戏都是高品质的 按照运营流程小V必须对新游戏进行全方位了解体验和评估 这
  • webpack多个Html,Webpack构建多页面应用配置

    安装依赖 devDependencies babel core 7 12 3 babel preset env 7 12 1 babel preset react 7 12 1 babel loader 8 1 0 clean webpac
  • 一元多项式的相加

    一元多项式的表达和相加 使用单链表表示一元多项式 由于使用java语言自己编写实现 没有使用LinkedList集合实现 所以需要创建单链表的类 类中包含指数 系数和后继元素的地址 类的设计如下 public class SingleLis
  • 01背包问题(采药) 动态规划,python实现

    采药问题 题目描述 辰辰是个天资聪颖的孩子 他的梦想是成为世界上最伟大的医师 为此 他想拜附近最有威望的医师为师 医师为了判断他的资质 给他出了一个难题 医师把他带到一个到处都是草药的山洞里对他说 孩子 这个山洞里有一些不同的草药 采每一株
  • python后端接口框架Flask的基本用法

    简介 在现代Web开发中 后端接口是十分重要的一部分 它们建立了前端和后端之间的连接 使得数据能够在两者之间传递 Python是一门受欢迎的动态编程语言 它可以用来编写高效且功能强大的后端接口 本文将介绍如何使用Python编写后端接口 以
  • WSS 代码执行的权限提升

    WSS 代码执行的权限提升 概述 WSS 默认使用身份模拟执行代码 也就是说用当前登录的用户身份执行Web Part或者自定义应用程序的代码访问 在大多数情况下 这种机制能够准确并严格地控制了标准权限的用户他对特定网站资源和敏感数据的访问
  • [LeetCode-35]-Search Insert Position(搜索整数所在的位置)

    文章目录 题目相关 Solution 1 顺序遍历 2 算法改进 二分查找 题目相关 题目解读 从有序整数列表中搜索给定整数 如果在其中返回下标位置 如果不在 返回应该在的位置 题目 原题链接 Given a sorted array an
  • MyBatis3 映射boolean 类型注意事项

    1 MySQL8 数据库关于boolean 存储结构定义 使用tinyint 1 代表Boolean 类型 2 实体定义关于属性字段为boolean 类型定义 3 实体属性与数据库字段映射文件配置 Mapper xml 文件 4 控制层 如
  • 你不知道的JavaScript---异步:现在与未来

    目录 异步 分块的程序 事件循环 并行线程 并发 非交互 交互 协作 任务 语句顺序 异步 js如何表达和控制持续一段时间的程序行为 分散在一段时间内运行的程序行为 持续一段时间 不是指类似于 for循环开始到结束的过程 而是指 程序的一部
  • Android 嵌套滑动总结,android基础考试题及答案

  • git 合并多个 commit

    1 rebase 介绍 rebase在git中是一个非常有魅力的命令 使用得当会极大提高自己的工作效率 相反 如果乱用 会给团队中其他人带来麻烦 它的作用简要概括为 可以对某一段线性提交历史进行编辑 删除 复制 粘贴 因此 合理使用reba
  • 数据分析(一)

    label distribution 是一个不均衡的数据集 需要做数据预处理 Sentence length distribution 句子的长度也很极端 有很多的outliers 需要对过长的数据进行舍弃或者切割
  • Eviews用向量自回归模型VAR实证分析公路交通通车里程与经济发展GDP协整关系时间序列数据和脉冲响应可视化

    最近我们被客户要求撰写关于向量自回归模型的研究报告 包括一些图形和统计输出 视频 向量自回归VAR数学原理及R软件经济数据脉冲响应分析实例 视频 向量自回归VAR数学原理及R语言软件经济数据脉冲响应分析实例 时长12 01 河源市是国务院1
  • JS函数curry(柯里化)

    原文地址 http blog jobbole com 77956 什么是柯里化 柯里化是这样的一个转换过程 把接受多个参数的函数变换成接受一个单一参数 译注 最初函数的第一个参数 的函数 如果其他的参数是必要的 返回接受余下的参数且返回结果
  • 机器学习之特征工程

    1 为什么做特征工程 我们学习编程语言时被告知程序 数据结构 算法 那么对于机器学习 我认为也可以类比为机器学习 大数据 机器学习算法 运行平台 面对一个机器学习问题 一般有两种解题思路 传统机器学习算法或者深度学习算法 一般而言 传统机器