集合框架
java集合框架包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。
Collection
Collection下包括Set、List、Queue,各自又包含了使用不同方式的实现。
Set
Set下包括TreeSet,HashSet,LinkedHashSet。其中TreeSet基于红黑树实现。
java集合框架包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。
Collection下包括Set、List、Queue,各自又包含了使用不同方式的实现。
Set下包括TreeSet,HashSet,LinkedHashSet。其中TreeSet基于红黑树实现。
uplift模型中文为增益模型,是工业界因果推断与机器学习结合最成熟的算法之一。传统的监督学习模型,往往是对输入x去预测一个y,而增益模型注重于x的变化对y的影响,以广告为例,传统的监督学习往往是给定这个特征去预测用户是否会点击,而增益模型注重的是给这个客户投放广告与否对客户是否购买广告商品所产生的影响。
因果推断是从观察到的数据中推断出变量之间的因果关系的过程。在统计学和数据科学中,因果推断涉及到尝试理解一个事件或行为是什么导致了另一个事件或行为。这与相关性或关联不同,因果推断试图确定一个变量的变化是否直接导致另一个变量的变化。
梯度下降法的基本思想是沿着函数梯度的负方向移动,直到找到一个局部最小值点。
利用泰勒展开,我们可以得到
如果取$\epsilon = -\eta f’(x)$, 我们会有
因为$\eta f’^2(x)>0$, 当$\eta$足够小,我们会有.
则通过$x \leftarrow x - \eta f’(x)$可以使得$f(x)$的值下降。
牛顿法是一种基于二阶泰勒展开的优化方法,利用Hessian矩阵来加速收敛。
通过泰勒展开,我们有
$f(x)$为最小值时,我们有$f’(x)=0$,则有
对于梯度下降,如果是n个样本的训练数据集,我们就需要计算n次每个样本的损失梯度,
计算负担会随着n的升高而变重,因此就有了随机梯度下降,即每次计算梯度时,只是随机抽取
一个样本进行计算。
由于
可以认为平均而言,随机梯度是对梯度的良好估计。
小批量随机梯度下降和随机梯度下降所用的所有元素都是从训练集中随机抽取的,因此梯度的期望保持不变,但是方差显著降低了。
一般来说,小批量随机梯度下降比随机梯度下降和梯度下降的速度快,收敛风险较小。
动量法是一种优化算法,它通过对过去的梯度进行加权平均,来改进梯度下降法的性能。动量法的基本思想是在每次迭代时,不仅考虑当前的梯度方向,还考虑过去梯度的方向,从而平滑了更新方向,有助于加速收敛并减少振荡。
AdaGrad 的核心在于动态调整每个参数的学习率。每个参数的学习率是根据该参数的历史梯度的平方和来调整的。如果某个参数的历史梯度变化较大,那么它的学习率会相应减小;反之,如果某个参数的历史梯度变化较小,那么它的学习率会相应增大。
RMSprop(Root Mean Square Propagation)是一种自适应学习率优化算法,旨在克服AdaGrad等方法中学习率递减过快的问题。RMSprop通过使用指数加权移动平均(Exponential Moving Average, EMA)来计算梯度平方的平均值,从而动态调整每个参数的学习率。这种方法在一定程度上解决了AdaGrad累积历史梯度平方和导致学习率过早减小的问题。
Adam 结合了 AdaGrad 和 RMSprop 的优点,同时解决了它们各自的缺点。Adam 通过使用梯度的一阶矩估计(即动量)和二阶矩估计(即 RMSprop 中的梯度平方的指数加权移动平均值)来动态调整每个参数的学习率。
协程、线程和进程是计算机编程中常用的并发编程概念。总的来说,协程适合于高并发、I/O 密集型的场景,可以减少线程切换的开销;线程适合于 CPU 密集型和需要实时响应的任务;而进程则适合于独立性强、资源隔离要求高的任务。在实际应用中,通常会根据任务的特点和需求选择合适的并发编程模型。
协程是一种程序组件,类似于线程,但其执行过程是可中断的。
在协程中,执行可以在特定的位置暂停,并在需要时恢复。
协程通常在单个线程中运行,因此不涉及线程切换的开销,可以有效地利用系统资源。
线程是操作系统能够进行运算调度的最小单位。
一个进程中可以包含多个线程,它们共享进程的内存空间和其他资源。
多线程编程允许程序同时执行多个任务,提高了程序的并发性和响应性。
线程之间的切换开销相对较小,但线程间的共享资源需要进行同步,以避免竞态条件和死锁等问题
进程是程序执行时的一个实例,每个进程都有自己独立的内存空间和系统资源。
进程间相互独立,各自拥有独立的地址空间和资源,彼此之间通信需要特殊的机制。
多进程编程可以充分利用多核处理器,但进程间的切换开销相对较大,因为需要切换地址空间和资源上下文。
在Python中,可以使用不同的工具来实现协程、线程和进程。
在Python中,协程通常使用 asyncio 库来实现。 线程可以使用内置的 threading 模块来实现。进程可以使用 multiprocessing 模块来实现。
需要注意的是,在Python中,由于全局解释器锁(GIL)的存在,多线程并不能有效利用多核处理器。因此,如果需要充分利用多核处理器,可以考虑使用多进程。而协程则是在单个线程中实现并发的一种方式,适合于I/O密集型任务。
马尔可夫决策过程(Markov Decision Process,简称 MDP)是强化学习中的一个重要概念,用于描述智能体在不确定环境下做出决策的数学模型。
MDP有几大要素:状态空间,动作空间,状态转移函数,奖励函数,折扣因子。
马尔可夫性质:当前状态可以完全表征过程。
MDP 的目标是找到一个最优策略,使得从任何初始状态出发,智能体在未来获得的累积奖励(回报)最大化。对于任意有限的马尔可夫决策过程,都存在一个最优策略,不差于其他所有可能的策略。
This is called the “value function” for the policy $\pi$:
The key idea behind all algorithms in reinforcement learning is that the value of state can be written as the average reward obtained in the first stage and the value function averaged over all possible next states.
This is defined to be the average return of a trajectory that begins at $s_0$
but when the action of the first stage is fixed to be $a_0$.
The main idea behind the Value Iteration algorithm is to use the principle of dynamic programming to find the optimal average return obtained from a given state. Note that implementing the Value Iteration algorithm requires that we know the Markov decision process (MDP), e.g., the transition and reward functions, completely.
贝尔曼方程(Bellman Equation)是强化学习和动态规划领域的一个重要概念,它用来描述在一个马尔可夫决策过程(MDP)中,状态价值函数或动作价值函数之间的关系。
Q-learning is an algorithm to learn the value function without necessarily knowing the MDP.
Q-learning 是一种强化学习算法,它属于无模型学习方法的一部分,因为 Q-learning 不需要了解环境的确切模型就能学习。Q-learning 的目标是学习一个动作价值函数, 更新规则是基于贝尔曼方程的。
为了学习这个动作价值函数,定义了一个损失函数, 该损失函数度量了给定
Q-函数与通过贝尔曼方程所预测的理想
Q-函数之间的差异。
我们可以通过梯度下降来最小化这个损失函数。
https://d2l.ai/chapter_reinforcement-learning/value-iter.html
https://d2l.ai/chapter_reinforcement-learning/qlearning.html
1 | pip install matplotlib |
1 | import matplotlib.pyplot as plt |
1 | import matplotlib.pyplot as plt |
决策树是一种用于分类和回归问题的监督学习算法。它通过树状图的结构来表示和推断决策规则。每个内部节点表示一个特征或属性,每个分支代表一个决策规则,而每个叶节点表示一个类别标签或一个数值。
决策树的学习过程形成了一个递归的分治算法,其中每个节点都对应于一个特征,并且通过节点上的决策规则将数据集分割成更纯的子集。在决策树的构建过程中,选择最佳特征和分割数据的目标是提高每个节点的纯度,使得决策树在训练数据上达到最佳的拟合效果。
支持向量机(Support Vector Machine,SVM)是一种用于分类和回归分析的监督学习算法。它的主要目标是找到一个超平面,将数据集划分成两个类别,同时使得两个类别中距离最近的数据点到该超平面的距离最大化。这两个最近的数据点被称为支持向量。
SVM 可以使用核函数来处理非线性可分的数据。核函数可以将输入特征映射到高维空间,从而在高维空间中找到一个线性超平面来解决原始空间中的非线性问题。
硬间隔支持向量机适用于线性可分的数据集。
\subsubsection*{优化问题}
目标是最大化间隔,同时保证所有样本都正确分类:
约束条件:
其中:
软间隔支持向量机适用于线性不可分的数据集,允许一定程度的误分类。
\subsubsection*{优化问题}
目标是最大化间隔,同时引入松弛变量 $ \xi_i $ 来允许一些样本在间隔内部或错误分类:
约束条件:
其中:
通过拉格朗日乘子法,可以将原始问题转化为对偶问题。
\subsubsection*{拉格朗日函数}
其中:
\subsubsection*{对偶问题}
通过求解拉格朗日函数关于 $ \mathbf{w} $ 和 $ b $ 的偏导数并令其为零,可以得到对偶问题:
约束条件:
通过求解对偶问题,可以得到支持向量机的决策函数:
其中,只有当 $ \alpha_i > 0 $ 时,对应的样本 $ \mathbf{x}_i $ 才是支持向量。
对于非线性可分的数据集,可以通过核函数将数据映射到高维空间,使数据在高维空间中线性可分。
线性核:
多项式核:
高斯核(RBF核):
Sigmoid核:
朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的分类算法,被广泛用于文本分类和其他分类问题。它被称为”朴素”是因为它假设每个特征与其他特征之间都是相互独立的,这是一个较为简化的假设,但在实践中,朴素贝叶斯通常表现得相当好。
在朴素贝叶斯中,我们考虑一个分类问题,其中 A 是类别,而 B 是特征。贝叶斯定理用于计算给定特征的情况下某个类别的概率。我们可以使用训练数据中的频率估计概率,并计算每个类别的概率。然后,给定一个新的特征向量,我们可以使用贝叶斯定理计算每个类别的后验概率,并选择具有最高概率的类别作为预测结果。
贝叶斯定理描述了在已知某些证据的情况下,某个假设的概率:
其中:
\subsection*{朴素贝叶斯分类器}
在朴素贝叶斯分类器中,假设特征之间相互独立。对于一个给定的样本 ( x = (x_1, x_2, \ldots, x_n) ),我们需要计算每个类别的后验概率 ( P(C_k | x) ),并选择具有最高后验概率的类别作为预测结果。
根据贝叶斯定理,后验概率可以表示为:
其中:
由于假设特征之间相互独立,条件概率 ( P(x | C_k) ) 可以分解为各个特征的条件概率的乘积:
类别先验概率 ( P(C_k) ) 通常通过训练数据中的类别频率来估计:
边缘概率 ( P(x) ) 可以通过全概率公式计算:
但在实际应用中,通常不需要显式计算 ( P(x) ),因为它是所有类别的后验概率的归一化常数,不会影响类别的选择。
选择具有最大后验概率的类别作为预测结果:
逻辑回归(Logistic Regression)是一种用于解决二分类问题的监督学习算法,尽管名称中包含”回归”一词,但实际上它用于分类任务。
逻辑回归使用一个假设函数(sigmoid函数),将输入特征的线性组合映射到一个在0和1之间的概率值。逻辑回归将概率值转换为二分类的决策,通常使用一个阈值(例如0.5)。逻辑回归使用交叉熵损失函数来衡量预测概率与实际标签之间的差异。损失函数的目标是最小化误差。
对于单个样本 $(x^{(i)}, y^{(i)})$,其损失为:
其中 $\hat{y}^{(i)} = \sigma(z^{(i)})$ 是模型的输出,$z^{(i)} = w^T x^{(i)} + b$,而 $\sigma(z) = \frac{1}{1 + e^{-z}}$ 是 sigmoid 函数。
对于整个训练集,总损失 $J(w, b)$ 为所有样本损失的平均值:
在每次迭代中,参数 $w$ 和 $b$ 会根据计算出的梯度进行更新:
其中 $\alpha$ 是学习率,控制着每次参数更新的步伐大小。