【算法刷题-题解】2024_09_23_优必选校招算法工程师岗

4.
在变量选择过程中,下列哪些方法可用于检查模型的性能? ACD
A
多重变量用于同一个模型
B
模型的可解释性
C
特征的信息
D
交叉验证

变量选择过程:指的是在大量特征或者自变量中挑选出对预测结果或模型性能最有贡献的少量特征。
    这一过程的目的是去除对特征没有帮助的/冗余的或噪声较大的变量,从而提高模型的性能,简化模型,减少过拟合风险,并提升可解释性。

6.
对于Bagging 哪些说法是正确的 B
A
个体学习器间相关性较高
B
个体学习器间相关性较低
C
使用“加权平均”而不是“投票法”产生结果
D
个体学习器由相同的学习算法生成

Bagging:Bootstrapping aggregating 引导聚集算法,是机器学习领域的一种团体学习算法
Bagging算法可与其他分类/回归算法结合,提高准确率/稳定性,通过降低结果的方差,避免过拟合的发生
是并行式集成学习方法的代表。
基于自助采样法获得多个含m个训练样本的采样集(有放回采样),基于每个采样集训练一个基学习器,再将基学习器进行结合
Bagging通常会对分类任务采用简单投票法,对回归任务采用简单平均法
    
7.
下列关于主成分分析法(PCA)说法正确的是 ABD
A
进行主成分分析之前要对数据进行中心化
B
要选出方差最大的作为主成分
C
要选出方差最小的作为主成分
D
主成分分析法可用于低维数据的可视化处理

中心化操作:将每个特征的均值调整为0
确保主成分是关于原点的,并且有助于计算协方差矩阵

PCA通常用于数据降维和可视化,
可以将高维数据投影到低维空间,从而进行可视化分析
8.
下列关于随机森林和GradientBoosting 说法正确的是 B
A
随机森林里的决策树不是相互独立的,而GradientBooting 里的决策树是相互独立的。
B
两者都使用特征的随机子集创造决策树
C
因为GrandientBoosting 里的树是互相独立的,所以可以生成平行的树。
D
GradientBoosting 总是优于随机森林。

解析:
    随机森林里的决策树也是相互独立的,每棵树再训练时都使用不同的随机特征和数据子集
    GradientBoosting中的树是相互依赖的,每棵树依赖前一棵树的结果,通过逐步减少误差来提升模型的性能
        因此不是独立的

    两者都可以使用特征的随机子集来训练各自的决策树
        随机森林:每棵树使用数据集的随机子集和特征的随机子集来进行训练,保证模型的多样性
        gradient boosting:每棵树依赖前一棵树的残差,但也可以使用随机特征子集进行构建,提高模型的泛化能力并防止过拟合
    Gradient hoosting中的树是相互依赖的,所以不能并行生成
    
Gradient Boosting 和随机森林都有各自的优缺点,哪个更优取决于具体的任务和数据集的特点。
    Gradient Boosting 通常在处理高偏差数据时表现更好,但更容易过拟合,且训练时间较长。
    随机森林在某些情况下具有更好的泛化能力,并且训练时间更短。
10.
二维高斯卷积核C++实现

1.定义高斯函数:使用公式生成二维高斯函数的值。
2.创建卷积核:根据给定的标准差和大小生成高斯卷积核。
3.归一化:确保卷积核的总和为 1,以保持图像的亮度。
#include <iostream>
#include <vector>
#include <cmath>

std::vector<std::vector<double>> createGaussianKernel(int size, double sigma) {
    std::vector<std::vector<double>> kernel(size, std::vector<double>(size));
    double sum = 0.0;  // 用于归一化的总和

    int halfSize = size / 2;  // 半径

    for (int x = -halfSize; x <= halfSize; ++x) {
        for (int y = -halfSize; y <= halfSize; ++y) {
            // 计算高斯值
            kernel[x + halfSize][y + halfSize] = (1 / (2 * M_PI * sigma * sigma)) *
                                                   exp(-(x * x + y * y) / (2 * sigma * sigma));
            sum += kernel[x + halfSize][y + halfSize];  // 累加总和
        }
    }

    // 归一化卷积核
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < size; ++j) {
            kernel[i][j] /= sum;
        }
    }

    return kernel;
}

void printKernel(const std::vector<std::vector<double>>& kernel) {
    for (const auto& row : kernel) {
        for (const auto& value : row) {
            std::cout << value << "\t";
        }
        std::cout << std::endl;
    }
}

int main() {
    int size = 5;      // 卷积核的大小,通常为奇数
    double sigma = 1.0; // 标准差

    std::vector<std::vector<double>> gaussianKernel = createGaussianKernel(size, sigma);
    
    std::cout << "Gaussian Kernel: " << std::endl;
    printKernel(gaussianKernel);

    return 0;
}

16.
梯度下降有时会陷于局部极小值,但EM 算法不会。×

虽然梯度下降法在某些情况下可能会陷入局部极小值,但期望最大化(EM)算法同样也可能会陷入局部极大值。

解释:
梯度下降:
    梯度下降是一种优化方法,常用于寻找函数的局部最小值。
    在非凸优化问题中,它可能会收敛到局部极小值,而不是全局极小值。
EM算法:
    EM算法用于估计具有隐变量的概率模型的参数。
    虽然 EM 算法通常能够有效收敛,但在复杂的模型中,它也可能收敛到局部极大值,而不是全局极大值。
    这是因为 EM 算法依赖于初始参数的选择,不同的初始值可能导致不同的局部极大值。
17.
Boosting 的一个优点是不会过拟合 ×

Boosting 方法(如 AdaBoost 和 Gradient Boosting)确实具有强大的学习能力,但它们也可能会过拟合,
尤其是在以下情况下:
模型复杂度:
    Boosting 通过逐步添加基学习器(如决策树)来提高模型的性能。
    每添加一个新模型都会关注前一个模型错误分类的样本。
    如果基学习器过于复杂,或训练的基学习器数量过多,模型可能会对训练数据过拟合。
数据集大小:
    在小数据集上,Boosting 方法更容易过拟合,因为模型可以学习到数据中的噪声。
正则化:
    虽然 Boosting 自身并不内置正则化机制,但许多实现(例如 XGBoost 和 LightGBM)提供了正则化参数,
    可以帮助控制过拟合。
18.
在AdaBoost 算法中,所有被错分的样本的权重更新比例相同。√

AdaBoost算法:(Adaptive Boosting)
    是一种集成学习算法,主要用于提高分类模型的准确性。
    它通过结合多个弱分类器(通常是简单模型,如决策树桩)来创建一个强分类器。

AdaBoost 的核心思想是关注那些被当前模型错误分类的样本,
    通过调整这些样本的权重,使得后续的分类器更加关注这些难以分类的样本。
    
    在每一轮迭代中,AdaBoost 根据基学习器的错误率来调整样本的权重。
    对于被错分的样本,其权重会增加,以便在下一次迭代中给予更多关注。
    对于正确分类的样本,其权重会减少。
    
    被错误分类的样本的权重增加的比例通常取决于它们在当前基学习器中的表现,因此不同样本的权重更新是不同的。
    
    AdaBoost 使用一个特定的公式来更新每个样本的权重,其中与每个样本的分类结果和基学习器的性能相关联。
    
在 AdaBoost 算法中,被错分的样本的权重更新并不是相同的,
    而是根据每个样本在当前迭代中的错误分类情况进行加权更新。

19.
在核回归中,最影响回归的过拟合性和欠拟合之间平衡的参数是否为核函数的 宽度

核回归是一种非参数回归方法,它使用核函数来估计数据点的值。
其核心思想:
    是通过加权平均的方式对目标变量进行估计,权重由距离决定。常用的核函数包括高斯核、均匀核等。

核函数的宽度对过拟合和欠拟合的影响
核函数的宽度(如高斯核的 σ)是影响核回归模型表现的关键参数之一,具体影响如下:
    当核宽度较小(例如,σ 很小)时,模型会对训练数据点非常敏感,容易捕捉到噪声,从而导致过拟合。
    当核宽度较大(例如,σ 很大)时,模型变得更加平滑,无法捕捉到数据中的细微结构,可能导致欠拟合

20.
回归函数A 比B 简单,那么A 在测试集上效果一般比B 好。 √

模型复杂度与泛化能力:
    简单模型通常更容易避免过拟合,但这并不意味着它总是会在测试集上表现更好。
    复杂模型可能能够捕捉到数据中的更复杂的模式,如果训练数据充分且代表性强,它们可能在测试集上表现更佳。
    
数据特性:
    测试集的表现不仅取决于模型的复杂度,还取决于数据的分布、噪声水平和模型与数据之间的匹配程度。
    在某些情况下,复杂模型在训练集上可能会过拟合,但在测试集上表现仍然优于简单模型,特别是在数据量足够大的情况下。

偏差-方差权衡:
    简单模型往往具有较高的偏差(bias)和较低的方差(variance),而复杂模型则可能具有较低的偏差和较高的方差。
    在某些数据集上,复杂模型由于其灵活性能够更好地拟合数据,因此可能在测试集上表现更好。
    
# 存在疑问
21.
当训练数据较少模型较大时比较容易发生 过拟合

过拟合是指模型在训练数据上表现良好,但在测试数据或新数据上表现不佳的现象。
    这通常发生在模型学习到了训练数据中的噪声或特定模式,而不是泛化出数据的真实分布。
过拟合发生的原因:
    模型复杂度:
        大模型(如深度神经网络或高维多项式回归)具有更多的参数和更高的灵活性,能够拟合训练数据中的细微波动和噪声。
        如果训练数据不足,这种灵活性可能导致模型过度拟合这些不具代表性的特征。
        
    训练数据量:
        当训练数据量较小时,模型缺乏足够的信息来学习出数据的真实分布。
        此时,大模型更容易学习到训练数据中的特例和噪声,从而导致过拟合。
        
    偏差-方差权衡:
        大模型通常具有较低的偏差(bias)和较高的方差(variance)。
        在数据量不足的情况下,高方差的模型会对训练数据中的每个小变化做出反应,造成不稳定的预测结果。

解决过拟合的方法
    简化模型:选择较小或更简单的模型以减少复杂度。
    增加数据量:收集更多的训练数据,帮助模型学习更全面的特征。
    正则化:使用 L1 或 L2 正则化来限制模型的复杂度。
    交叉验证:使用交叉验证方法来评估模型的泛化能力,从而更好地调整模型参数。

22.
有n 个数据,按照1:1 划分为训练集与测试集, 随着n 增大训练误差和测试误差会减小。 √
    
更多的数据提供更多的信息:

    增加数据量可以让模型学习到更全面的数据分布和特征,从而提高其拟合能力。
    更多的数据可以帮助模型更好地捕捉到数据的潜在规律。
    
降低过拟合的风险:
    当数据量较少时,模型容易对训练数据的特例和噪声进行过拟合。增加训练数据量可以降低这种过拟合的风险,使得模型能够更好地泛化到测试集上。

更可靠的估计:
    随着训练数据量的增加,模型参数的估计变得更加可靠,从而使得训练误差和测试误差都有可能下降。

偏差-方差权衡:
    增加数据量可以有效降低模型的方差,使得模型在新数据上的表现更稳定,减少测试误差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值