《算法》
射击气球
- 对于某一个气球,至少使用一个弓箭手将它射穿,怎么样才能保证最少的弓箭手?
- 如果射穿某个气球的同时,尽可能多的射穿其他的气球,就可以使用最少的弓箭手
- 怎么才能实现射穿某个气球的同时尽可能多的射穿其他的气球?
-
对题目进行建模:将气球从start到end映射成数轴上的线段,并且按气球的start位置在x轴的大小将气球排序,如下图:
图1. 气球模型 - 例如,在射击(1,6)气球的时候,要尽可能的射穿其他的气球,由图可以看出在(2, 6)位置(我们称该区间为射击区间),可以保证射击(1,6)的同时射击(2,8),使得射击(1,6)气球的同时尽可能多的射穿其他气球。
- 由上面的分析可知,我们只要确定了射击某一个气球时并且可以尽可能多的射击其他气球的射击区间就可以解决该问题,为此,问题转化为找射击区间,并且射击区间的个数为最少使用的射击手的数量。
- 寻找射击区间代码如下。
-
- 代码实现
int shootNumber(std::vector<std::pair<int, int>> &num)
{
// 首先将气球按照左侧元素的大小进行排序
std::sort(num.begin(), num.end(), cmp);
int shoot_number = 1; // 射击手的数量
// 射击区间
int shoot_begin = num[0].first;
int shoot_end = num[0].second;
for (int i = 1; i < num.size(); i++) { // 遍历每一个气球,更新射击区间和射击手的数量
if (num[i].first <= shoot_end) {
shoot_begin = num[i].first; // 更新射击区间左端点
if (num[i].second < shoot_end) { // 更新射击区间右端点
shoot_end = num[i].second;
}
}
else { // 需要增加一个新的射击区间
shoot_number++;
shoot_begin = num[i].first;
shoot_end = num[i].second;
}
}
return shoot_number;
}
《机器学习》
模型选择
- 基本概念
-
训练集:用来训练模型的数据集。
-
验证集:用于模型的选择的数据集。
-
测试集:最终对选择好的模型进行评估。测试集中最好不要包含训练集中的样本。
-
误差:训练出来的模型在使用的时候的模型输出值与样本的真实值之间的差异称为误差。
-
经验误差:模型在训练集上的误差称为经验误差。又称为训练误差。
-
泛化误差:模型在测试集上的误差称为泛化误差。(说明:泛化误差越小,说明模型越好;但是我们训练完一个模型之后,由于我们不知道我们要用该模型进行预测的数据样本是什么,为此在实际中我们并无法确定泛化误差,而我们实际能做的就是努力使经验误差最小)
图2. 误差概念 -
经验风险
图3. 经验风险 -
结构风险
图4. 结构风险
- 什么是模型选择
- 我们知道在对给定的数据集进行建模的时候,我们可能会选择不同的算法实现不同的模型。例如:有一个分类问题,针对给定的数据集,我们可以使用逻辑回归、朴素贝叶斯等多种算法来建立多个分类模型,那么就会存在这几个模型哪个模型的效果最好,我们要选择这些模型中最好的那个模型作为我们的最终模型。其中涉及的确定哪个算法得到的模型的最好就是我们的模型选择。
- 对模型的泛化误差进行评估,选择泛化误差最小的那个模型即可。但是,我们无法直接获得泛化误差,而训练误差又由于过拟合现象的存在,不适合作为标准,为此我们需要采用其他的方法来进行模型的选择。
- 怎进行模型选择
- 知道了什么是模型选择的概念,接下来就是怎么选择效果最好的模型?
- 常用的模型选择的方法有两种:交叉验证和正则化
交叉验证
所谓交叉验证就是重复的使用数据。
正则化
在经验风险上加上一个正则化项 。
模型评价
- 什么是模型评价
模型评价,就是对确定好的模型进行评价,来判断该模型的效果好坏。 - 怎么进行模型的评价
- 回归任务常用的性能度量是:均方误差
- 分类任务常用的性能度量是:
- 错误率和精度、
- 查准率、查全率和F1:P-R曲线
网友评论