技术岗(算法)面试问题汇总(数据挖掘/图像分割/NLP)

文章目录

一.深度学习

1.1 如何计算参数量和计算量?

例:输入是m×m×c的图像,卷积核大小是k×k,其输出是n×n×d,也表示卷积核的数量是d,其总参数是多少,总的乘法计算量是多少?
总参数:c×k×k×d
总乘法计算量:c×k×k×n×n×d

计算量解释如下:
对于输出featuremap上某一个channel的点,经过如下两步得到:

  1. 卷积核k×k与输入的每个channel卷积,把每个channel上的内容加起来,就得到最后一个点。那么输出featuremap上每个点的计算量为c×k×k
  2. 输出featuremap上有n×n×d个点,所以总乘法计算量:c×k×k×n×n×d
    (参考:https://www.cnblogs.com/gezhuangzhuang/p/10922568.html

1.2 特征工程怎么做的(可能会问到项目里用了哪些)?

  1. 数值类型转换:幅度调整/归一化,统计值(包括max, min, mean, std等),离散化(把连续值转成非线性数据),柱状分布(离散化后统计每个区间的个数做柱状图)。
  2. 类别类型:one-hot编码、Hash编码成词向量、柱状图(Histogram)映射
  3. 统计型:加减平均(商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少,用户连续登录天数超过平均多少)、分位线(商品属于售出商品价格的多少分位线处)、次序型(排在第几位)、比例类(电商中,好/中/差评比例,你已超过全国百分之…的同学)
  4. 组合特征:拼接型(简单的组合特征。例如挖掘用户对某种类型的喜爱,对用户和类型做拼接。正负权重,代表喜欢或不喜欢某种类型)、模型特征组合(用GBDT产出特征组合路径或将组合特征和原始特征一起放进LR训练)

1.3 简述残差网络ResNet

  1. 问:网络简述
    答:在深度学习中,网络层数增多一般会伴着下面几个问题。(1)计算资源的消耗(2)模型容易过拟合、退化()(3)梯度消失/梯度爆炸。
    ResNet使用了一个新的思想,假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层是冗余层的。那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同。具体哪些层是恒等层,网络训练的时候自己会判断出来。
  2. 问:为什么 VGG 比 ResNet 浅很多,两者的参数量却相当?
    答:两个原因,一是因为 ResNet省略了全连接层,二是因为 ResNet采用了 bottle-neck(building block) 结构。
  3. 问:为什么叫残差?
    答:
    在这里插入图片描述

X是我们的拟合的函数,H(x)就是具体的数据点,通过训练使的拟合的值X加上F(x)得到具体数据点的值,因此 F(x)就是残差了。其中,X系数为1是为了防止反向传播过程中的梯度消失或者梯度爆炸。

1.4 简述LSTM网络

参考:https://www.jianshu.com/p/95d5c461924c
LSTM与RNN的区别:

  1. RNN没有细胞状态;LSTM通过细胞状态记忆信息。
  2. RNN激活函数只有tanh;LSTM通过输入门、遗忘门、输出门引入sigmoid函数并结合tanh函数,添加求和操作,减少梯度消失和梯度爆炸的可能性。
  3. RNN只能够处理短期依赖问题;LSTM既能够处理短期依赖问题,又能够处理长期依赖问题。

1.5 Transformer

  1. 问:QKV分别代表什么?
    答:Q:查询向量
    K:表示被查询信息与其他信息相关性的向量
    V:表示被查询信息的向量
    一个很形象的解释方法:你有一个问题Q,然后去搜索引擎里面搜,搜索引擎里面有好多文章,每个文章V有一个能代表其正文内容的标题K,然后搜索引擎用你的问题Q和那些文章V的标题K进行一个匹配,看看相关度(QK —>attention值),然后你想用这些检索到的不同相关度的文章V来表示你的问题,就用这些相关度将检索的文章V做一个加权和,那么你就得到了一个新的Q’,这个Q’融合了相关性强的文章V更多信息,而融合了相关性弱的文章V较少的信息。这就是注意力机制,注意力度不同,重点关注(权值大)与你想要的东西相关性强的部分,稍微关注(权值小)相关性弱的部分。
    x的注意力权重,由x自己来决定,所以叫自注意力。

1.5 BN

  1. BN的作用:BN可以加速模型训练,防止‘梯度爆炸’,提高网络泛化能力。
    加速训练:Batch Gradient Descent使用多个梯度的均值来更新权重,用相对少的训练次数遍历完整个训练集,也正是因为平均了多个样本的梯度,许多样本对神经网络的贡献就被其他样本平均掉了,相当于在每个epoch中,训练集的样本数被缩小了。batch中每个样本的差异性越大,这种弊端就越严重。BN首先是把所有的samples的统计分布标准化,降低了batch内不同样本的差异性,然后又允许batch内的各个samples有各自的统计分布。所以,BN的优点自然也就是允许网络使用较大的学习速率进行训练,加快网络的训练速度(减少epoch次数),提升效果。
    提高泛化能力:省去过拟合中dropout、L2正则项参数的选择问题,采用BN算法后,可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;
  2. 为什么需要BN?
    神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低。
    网络一旦训练起来,参数就要更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。
  3. BN的过程?
    在这里插入图片描述 (1)求每一个训练批次数据的均值
    (2)求每一个训练批次数据的方差
    (3)使用求得的均值和方差对该批次的训练数据做归一化,获得0-1分布。其中ε是为了避免除数为0时所使用的微小正数。
    (4)尺度变换和偏移:将xi乘以γ调整数值大小,再加上β增加偏移后得到yi,这里的γ是尺度因子,β是平移因子。这一步是BN的精髓,由于归一化后的xi基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:γ,β。 γ和β是在训练时网络自己学习得到的。

1.6 1x1卷积的作用

  1. 灵活的控制特征图的深度
  2. 减少参数
  3. 实现了跨通道的信息组合,并增加了非线性特征

1.7 为什么3x3卷积被广泛应用

因为通过串联两个3x3的卷积核可以达到5x5卷积核的感受野,同时降低了模型的参数量。并且多个3x3卷积核的串联有更多的激活函数,有更强的非线性表达能力。

二.机器学习

2.1 简述meanshift的过程

2.2 交叉熵来源和应用

  1. 交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。
  2. 交叉熵在分类问题中常常与softmax是标配,softmax将输出的结果进行处理,使其多个分类的预测值和为1,再通过交叉熵来计算损失。

在这里插入图片描述
应用:
在这里插入图片描述

2.3 机器学习中集成学习(Bagging, Boosting和Stacking)的简述和区别

1. Bagging: 所谓的bootstrapping aggregation,其思想是在随机不同版本的训练数据上训练许多基础模型。每个模型拥有一票表决权,并且无论预测准确度如何,都做相同的处理,然后对预测变量进行汇总以得出最终结果。在大多数情况下,Bagging后结果的方差会变小。例如,随机森林是Bagging方法中最著名的模型,它将决策树与Bagging理念结合在一起。
通常在每一轮中使用bootstrapping方法(替换样本)从原始样本集中提取训练子集。因此,在训练集中,有些样本可能被多次使用,而有些样本可能永远不会被使用。这使得训练子集是独立的。
模型的选择没有限制,我们根据所面临的问题采用不同的分类器或回归器。每个预测模型都可以由训练集并行生成。它们同等重要,所占比重相同。在合并输出后,对分类问题使用多数投票,对回归问题使用平均投票。
2.Boosting: boosting和bagging之间最本质的区别在于,boosting并不会同等的对待基础模型,而是通过连续的测试和筛选来选择“精英”。表现良好的模型对投票的权重更大,而表现较差的模型的权重更小,然后将所有的投票组合得到最终结果。在大多数情况下,boosting后结果的偏差会变小。例如,Adaboost和Gradient boost是boosting方法中最常用的模型。
一般情况下,每一轮的训练集保持不变,但在boosting轮次结束时,模型中每个样本在训练集中的分布可能会发生变化。这是一个迭代过程,它更关注(增加权重)以前错误分类的记录,而忽略(减少权重)前一轮中的正确记录。换句话说,它可以将弱学习者的表现提高到强学习者的水平。
与bagging不同,每个预测模型只能顺序生成,因为后一个模型的参数需要前一个模型的结果。汇总模型后,我们对分类问题使用多数投票,对回归问题进行平均。
3. Stacking 对基础模型(弱学习器)的结果进行平均或投票相对简单,但是学习误差可能很大,因此创建了另一种学习方法(Stacking)。Stacking策略不是对模型的结果进行简单的逻辑处理,而是在模型外增加一层。
因此,我们总共有两层模型,即通过预测训练集建立第一层模型,然后将训练集预测模型的结果作为输入,再对第二层新模型进行训练,得到最终结果。基本上,Stacking可以减少方差或bagging/boosting的偏差。
参考:机器学习中集成学习(Bagging, Boosting和Stacking)简介和示例

boosting和bagging的区别:

  1. 样本选择:Bagging 算法是有放回的随机抽样;Boosting 算法每一轮训练集不变,只是训练集中的每个样例在分类器中的权重发生变化,而权重根据上一轮分类结果进行调整;
  2. 样例权重:Bagging 使用随机抽样,样例权重一致;Boosting 则根据错误率不断调整样例权重值,错误率越大权重越大;
  3. 预测函数:Bagging 所有预测模型的权重相等;Boosting 算法对于误差小的分类器具有更大的权重;
  4. 并行计算:Bagging 算法可以并行生成各个基模型;Boosting 理论上只能顺序生产,因为每一个模型都需要上一个模型的结果;
  5. Bagging 是减少模型的 Variance(方差),Boosting 是减少模型的 Bias(偏差).Bagging 里每个模型都是强分类器,因为降低的是方差,方差过高需要降低是过拟合;Boosting 里每个分类模型都是弱分类器,因为降低的是偏差,偏度过高是欠拟合。
    Error = Bias + Variance
    参考:机器学习笔记(五)Bagging、Boosting & Stacking 区别与描述

2.4 分类和回归的评价指标

分类指标
混淆矩阵:
在这里插入图片描述(1)精确率(Precision):预测正确的正例数据占预测为正例数据的比例;公式:P=TP/(TP+FP)。
(2)召回率(Recall):预测为正例的数据占实际为正例数据的比例;公式:R=TP/(TP+FN)。
(3)准确率(Accuracy):衡量所有样本被分类准确的比例;公式:A=(TP+TN)/(TP+FP+TN+FN)。
(4)F1分数(F1 score):精确率和召回率的调和平均;
计算每个类别下的f1-score,计算方式如下:
在这里插入图片描述各个类别下的F1-score求均值,得到最后的评测结果:
在这里插入图片描述
总体写为:
在这里插入图片描述

2.5 XGBoost与GBDT的联系和区别有哪些?

  1. GBDT是机器学习算法,XGBoost是该算法的工程实现。
  2. 正则项:在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
  3. 导数信息:GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
  4. 基分类器:传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器。
  5. 子采样:传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样。
  6. 缺失值处理:传统GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值的处理策略。
  7. 并行化:传统GBDT没有进行并行化设计,注意不是tree维度的并行,而是特征维度的并行。XGBoost预先将每个特征按特征值排好序,存储为块结构,分裂结点时可以采用多线程并行查找每个特征的最佳分割点,极大提升训练速度。

2.6 为什么XGBoost要用泰勒展开,优势在哪里?

  1. 从为什么会想到引入泰勒二阶的角度来说(可扩展性):XGBoost官网上有说,当目标函数是MSE时,展开是一阶项(残差)+二阶项的形式,而其它目标函数,如logistic loss的展开式就没有这样的形式。为了能有个统一的形式,所以采用泰勒展开来得到二阶项,这样就能把MSE推导的那套直接复用到其它自定义损失函数上。简短来说,就是为了统一损失函数求导的形式以支持自定义损失函数。至于为什么要在形式上与MSE统一?是因为MSE是最普遍且常用的损失函数,而且求导最容易,求导后的形式也十分简单。所以理论上只要损失函数形式与MSE统一了,那就只用推导MSE就好了。

  2. 从二阶导本身的性质,也就是从为什么要用泰勒二阶展开的角度来说(精准性):二阶信息本身就能让梯度收敛更快更准确。这一点在优化算法里的牛顿法中已经证实。可以简单认为一阶导指引梯度方向,二阶导指引梯度方向如何变化。简单来说,相对于GBDT的一阶泰勒展开,XGBoost采用二阶泰勒展开,可以更为精准的逼近真实的损失函数。

参考:终于有人说清楚了–XGBoost算法

2.7 由二叉树双分支节点数计算叶子节点数

二叉树中双分支结点就是度为2的结点,叶子就是度为0的结点。
根据二叉树的性质:n0 = n2 + 1

2.8 决策树优缺点

优点:

  1. 对噪声有很好的健壮性且能够学习析取表达式;
  2. 可以表示为if-then的规则,逻辑性直观,可读性高,具有清晰的可解释性;
  3. 每一步都适用当前所有样例,大大降低了对个别样例错误的敏感性;
  4. 能处理不均一的数据,无需对数据进行标准量化,能够对缺少属性值的样例进行分类;
  5. 搜索假设完整空间,避免了搜索不完整空间的风险;

缺点:

  1. 只维护单一的当前分支假设;
  2. 搜索过程无回溯,属于爬山搜索,易得到局部最优而非全局最优
  3. 容易过拟合,需要在训练中设置限定条件或者训练后对树进行修剪

2.9 牛顿法和拟牛顿法

牛顿法:在这里插入图片描述

拟牛顿法:拟牛顿法(DFP、BFGS、L-BFGS)
或者参照统计学习方法附录B

2.10 Hessian矩阵和Jacobian矩阵

添加链接描述
梯度向量是Jacobi矩阵的一个特例!当目标函数为标量函数时,Jacobi矩阵就是梯度向量

2.11 SVM的优缺点

优点:

  1. 有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题;
  2. 能找出对任务至关重要的关键样本(即:支持向量);
  3. 采用核技巧之后,可以处理非线性分类/回归任务;
  4. 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。

缺点:

  1. 训练时间长。当采用 SMO 算法时,由于每次都需要挑选一对参数,因此时间复杂度为 O ( N 2 ) O(N^2) ON2 ,其中 N 为训练样本的数量;
  2. 当采用核技巧时,如果需要存储核矩阵,则空间复杂度为 O ( N 2 ) O(N^2) ON2
  3. 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。

因此支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。

2.12 kmeans收敛性

2.13 XGBoost为什么采用负梯度拟合误差?

回归任务下,GBDT 在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数。
在这里插入图片描述
所以,当损失函数选用均方损失函数是时,每一次拟合的值就是(真实值 - 当前模型预测的值),即残差。此时的变量是 y 2 y^2 y2,即“当前预测模型的值”,也就是对它求负梯度。

2.14 XGBoost对缺失值是怎么处理的?

在普通的GBDT策略中,对于缺失值的方法是先手动对缺失值进行填充,然后当做有值的特征进行处理,但是这样人工填充不一定准确,而且没有什么理论依据。而XGBoost采取的策略是先不处理那些值缺失的样本,采用那些有值的样本搞出分裂点,在遍历每个有值特征的时候,尝试将缺失样本划入左子树和右子树,选择使损失最优的值作为分裂点。

2.15 XGBoost为什么可以并行训练?

  1. XGBoost的并行,并不是说每棵树可以并行训练,XGBoost本质上仍然采用boosting思想,每棵树训练前需要等前面的树训练完成才能开始训练。
  2. XGBoost的并行,指的是特征维度的并行:在训练之前,每个特征按特征值对样本进行预排序,并存储为Block结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个block并行计算。

2.16 逻辑斯特回归为什么要对特征进行离散化。

  1. 非线性!非线性!非线性!逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;离散特征的增加和减少都很容易,易于模型的快速迭代;
  2. 速度快!速度快!速度快!稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  3. 鲁棒性!鲁棒性!鲁棒性!离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
  4. 方便交叉与特征组合:离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  5. 稳定性:特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
  6. 简化模型:特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

2.17 分类问题可以使用MSE(均方误差)作为损失函数吗?

  1. 从损失函数公式本身来说
    MSE衡量的是预测值和目标值的欧式距离。而在分类问题中label的值大小在欧氏空间中是没有意义的。所以分类问题不能用mse作为损失函数。
    如果强行使用,MSE(均方误差)对于每一个输出的结果都非常看重(让正确分类变大的同时,也让错误分类变得平均),而交叉熵只对正确分类的结果看重。交叉熵的损失函数只和分类正确的预测结果有关系,而MSE的损失函数还和错误的分类有关系,该分类函数除了让正确的分类尽量变大,还会让错误的分类变得平均,但实际在分类问题中这个调整是没有必要的。但是对于回归问题来说,这样的考虑就显得很重要了。
  2. 从优化求解角度来说
    分类问题是逻辑回归,必须有激活函数这个非线性单元在,比如sigmoid(也可以是其他非线性激活函数),而如果还用mse做损失函数的话,是非凸函数,有多个极值点,所以不适用做损失函数了。

2.18 梯度消失、梯度爆炸的解决方法

  1. 梯度消失:换激活函数、批归一化、换网络结构
  2. 梯度爆炸:梯度剪切、权重正则化。

2.19 过拟合原因和解决方法

  1. 正则化(Regularization)(L1和L2)
  2. 调整损失函数
  3. 数据增强(Data augmentation),或者增加训练数据样本数量。
  4. 增大批处理数量
  5. 调整数据分布
  6. Dropout
  7. early stopping

三.图像分割

3.1 实例分割最常用的指标是什么?怎么计算?

四.数据结构

数据结构:十大排序算法和七大查找算法总结(原理讲解和代码实现)-------(一)排序算法篇

4.1 链表和数组使用场景

数组应用场景:数据比较少;经常做的运算是按序号访问数据元素;数组更容易实现,任何高级语言都支持;构建的线性表较稳定。
链表应用场景:对线性表的长度或者规模难以估计;频繁做插入删除操作;构建动态性比较强的线性表。

4.2 list,tuple,dict,set的区别和用法

一句话来概括四种数据类型的区别是:tuple是一个不可改变的list,set是一个没有Value的dict,list和set的数据是可变的,tuple和dict的数据是不可变的!
list和set的数据可变的,tuple和dict的数据是不可变的。list是最自由的,可以使用索引、切片,可以进行计算和修改;tuple是不自由的,数据不能更改,但是和list一样具有序列,可以用索引和切片;dict是半自由的,自由体现在键值对的无序,可以通过key去索引value的值,不自由体现在数据操作只能通过key来实现,键值对是不可变类型;set是半自由的,自由体现在它通过list传值给它,数据类型是可变的,还可以改变list中的值,数据集是无序的,不重复的,可以进行计算,不自由体现在无法使用索引和切片准确定位。

五.Python

5.1 面向对象和面向过程有什么区别,什么是面向对象?

面向对象的程序设计是当下最流行的程序设计方式之一。在面向对象的设计思想中,将程序视为多个对象共同协作的结果。程序被划分为多个子模块,再由多个对象完成各自模块最终实现程序的功能。面向对象的三大特性为继承、封装、多态。
面向过程的程序设计是一种以过程为中心的设计方式。在该方式中,将目标功能的实现分为多个步骤。程序依据步骤的过程一步步执行,最终实现程序功能。
比较总结:

  1. 面向过程编程中,开发者注重于程序功能实现的过程,编程过程中扮演类似执行者的角色
  2. 面向对象编程中,开发者注重于对象的创建和调用,编程过程中扮演类似指挥者的角色
  3. 面向过程编程中,开发者可以精准把控程序执行的每一步和每一个细节(比如:手洗衣服过程中,衣服的哪个部位需要多搓一会,扇扇子的时候多扇头还是扇脚)
  4. 面向对象编程中,开发者无需知道对象的每一个细节,对象如何工作交给对象的设计者完成(当然开发者常常扮演设计者的角色,同时已经有很多东西已经被设计好了)
  5. 面向过程设计方式在中小型项目中更有优势。开发者只需要想好步骤,再依据步骤写下来即可。
  6. 面向对象设计方式在大中型项目中更有优势。开发者设计好对象后,只需调用对象完成任务使得代码更简洁易懂易于维护。
  7. 面向对象设计方式在宏观上是面向对象的,在微观上依旧是面向过程的。 在每个对象的内部有着它们的行为属性,设计者在设计如何让它们工作的过程中依旧是按照面向过程的思想让程序按照步骤执行。由此可见:面向过程是程序设计的基本方式。
    参考:https://blog.csdn.net/a850661962/article/details/102746274

优缺点总结
面向过程:
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低

5.2 Arraylist和Linkedlist有什么区别?

  1. 效率不同:当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
    当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
  2. 自由性不同:ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
  3. 主要控件开销不同:ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。

5.3

六.数据分析SQL

6.1 SQL调优方法汇总

参考:数据库SQL调优的几种方式(转)

七·推荐算法

7.1 协同过滤算法

基于用户的协同过滤算法: 其简单应用情景是当用户需要个性化推荐时,可以先找到与他相似其他用户(通过兴趣、爱好或行为习惯等,然后把那些用户喜欢的并且自己不知道的物品推荐给用户。
在这里插入图片描述基于物品的协同过滤算法: 其简单应用情景是:当一个用户需要个性化推荐时,例如由于他之前购买过金庸的《射雕英雄传》这本书,所以会给他推荐《神雕侠侶》,因为其他用户很多都同时购买了这两本书。

注:1、如果是热门物品,很多人都喜欢,就会接近1,就会造成很多物品都和热门物品相似,此时要增加惩罚力度。

2、活跃用户对物品相似度的贡献小于不活跃的用户。

在这里插入图片描述
基于内容的推荐算法 之前也成为基于内容的过滤(搜索)算法,早期主要应用在信息检索和信息过滤。
基于内容的推荐算法一般包括以下三步:
1、为每个物品抽取一些特征用来表示这个物品。
2、使用用户的历史行为数据分析物品的这些特征,从而学习出用户的喜好特征或者说兴趣。
3、通过比较上一步得到的用户兴趣和待推荐物品的特征,确定一组相关性最大的物品作为推荐列表。

参考:推荐算法概述(基于用户的协同过滤算法、基于物品的协同过滤算法、基于内容的推荐算法)

八·基础知识

8.1 NP难问题是什么

P类问题: 就是指那些计算机比较容易算出答案的问题。
NP类问题: 就是指那些已知答案以后计算机可以比较容易地验证答案的问题。
NPC问题: 首先,它得是一个NP问题;然后,所有的NP问题都可以归约到它。
归约的标准概念: 如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可归约为问题B。
NP-Hard问题: 满足NPC问题定义的第二条但不一定要满足第一条,就是说所有的NP问题都能归化到它,但它本身并不一定是个NP问题,也就是即使有一天发现了NPC问题的多项式算法,但NP-Hard问题仍然无法用多项式算法解决,因为它不是NP问题,对于答案的验证都很困难。

8.2 为什么正态分布是最常见的分布?

根据中心极限定理: 多个独立统计量的和的平均值,符合正态分布。
上图中,随着统计量个数的增加,它们和的平均值越来越符合正态分布。根据中心极限定理,如果一个事物受到多种因素的影响,不管每个因素本身是什么分布,它们加总后,结果的平均值就是正态分布。

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值