1.综合评价与决策——主成分分析(PCA)法(附Python源码)
2.Python数据分析实战-实现T检验(附源码和实现效果)
3.深入理解Pytorch的差方差分析BatchNorm操作(含部分源码)
4.Alpha系列——组合优化概述附源码
5.PyTorch 源码分析(三):torch.nn.Norm类算子
6.Diffusion Model原理详解及源码解析
综合评价与决策——主成分分析(PCA)法(附Python源码)
本文探讨了综合评价与决策过程中的主成分分析(PCA)法,其核心在于量化评价对象的指标相对优劣。具体做法如下:
首先,源码考虑有n个评价对象,代码每个对象被分配到m个评价属性上,差方差分析形成决策矩阵。指标源码统计器矩阵中的源码每个行向量代表一个评价对象。
主成分分析(PCA)的代码核心思想是通过线性组合,最大化各分量的差方差分析方差之和。其具体步骤包括数据预处理、指标计算相关系数矩阵的源码特征值与特征向量,以及计算评分模型。代码
在数据预处理阶段,差方差分析将所有属性标准化,指标形成标准决策阵。源码
接着,计算相关系数矩阵的特征值与特征向量,特征向量构成旋转坐标系,使各分量方差之和最大化。
通过计算主成分贡献率与累积贡献率,确定前k个主成分,其中k通常设为使累积贡献率达到0.9的值。这k个主成分的线性组合得到最终评分模型。
应用实例中,以我国-年宏观投资效益数据为例,通过PCA法,得到评分向量,从而对这些年的投资效益进行排序。
附Python源码,用于实现上述PCA过程的完整步骤。
参考文献提供了理论基础,包括数学建模算法与应用、机器学习等领域的相关内容。
Python数据分析实战-实现T检验(附源码和实现效果)
T检验是一种用于比较两个样本均值是否存在显著差异的统计方法。广泛应用于各种场景,例如判断两组数据是否具有显著差异。使用T检验前,需确保数据符合正态分布,并且样本方差具有相似性。T检验有多种变体,包括独立样本T检验、配对样本T检验和单样本T检验,针对不同实验设计和数据类型选择适当方法至关重要。
实现T检验的Python代码如下:
python
import numpy as np
import scipy.stats as stats
# 示例数据
data1 = np.array([1, 2, 3, 4, 5])
data2 = np.array([2, 3, 4, 5, 6])
# 独立样本T检验
t_statistic, p_value = stats.ttest_ind(data1, data2)
print(f"T统计量:{ t_statistic}")
print(f"显著性水平:{ p_value}")
# 根据p值判断差异显著性
if p_value < 0.:
print("两个样本的均值存在显著差异")
else:
print("两个样本的均值无显著差异")
运行上述代码,将输出T统计量和显著性水平。根据p值判断,若p值小于0.,则可认为两个样本的均值存在显著差异;否则,认为两者均值无显著差异。
实现效果
根据上述代码,表白网页源码中文执行T检验后,得到的输出信息如下:
python
T统计量:-0.
显著性水平:0.
根据输出结果,T统计量为-0.,显著性水平为0.。由于p值大于0.,我们无法得出两个样本均值存在显著差异的结论。因此,可以判断在置信水平为0.时,两个样本的均值无显著差异。
深入理解Pytorch的BatchNorm操作(含部分源码)
Pytorch中的BatchNorm操作在训练和测试模式下有所不同,特别是在涉及dropout时。Batch Normalization(BN)是深度学习中的重要技术,通过在神经网络中间层对输入数据进行标准化处理,解决协方差偏移问题。其核心公式包含对每个通道数据的均值和方差计算,规范化操作后进行仿射变换以保持模型性能。
在BN中,需要关注的参数主要包括学习参数gamma和beta,以及动态统计的running_mean和running_var。在Pytorch的实现中,如nn.BatchNorm2d API,关键参数包括trainning(模型是否在训练模式)、affine(是否启用仿射变换)、track_running_stats(是否跟踪动态统计)和momentum(动态统计更新的权重)。
训练状态会影响BN层的计算,当模型处于训练状态(trainning=True)时,running_mean和running_var会在每次前向传播(forward())中更新,而转为测试模式(mode.eval())则会冻结这些统计值。源码中的_NormBase类和_BatchNorm类定义了这些操作的细节,包括动态统计的管理。
对于自定义BN,可以重载前向传播函数,改变规范化操作的细节。总的来说,理解Pytorch的BatchNorm操作,需关注其在训练和测试模式中的行为,以及与模型训练状态相关的关键参数。
Alpha系列——组合优化概述附源码
在股票投资组合管理中,组合优化扮演着核心角色,它主要涉及两个方面:预测(alpha挖掘)与组合优化。本文通过实战视角,详细阐述了各种组合优化场景,并提供了相应的实验代码,帮助投资者更深入地理解这一过程。
在alpha构建阶段,我们分为alpha研究与alpha组合两个流程。研究阶段专注于寻找具有高信息含量、能够产生alpha因子的信息源,并对这些因子的彩色冷暖通道源码生成来源和结构进行探索与验证,主要通过统计检验和可视化手段实现。组合阶段则将所有alpha因子融合,处理它们之间的相关性,目标是实现信息最大化或alpha最大化,数据质量和预测对alpha的贡献至关重要。
进入组合构建阶段,我们的目标是综合收益、风险与投资者的偏好或约束。首先,选择合适的风险度量与建模方法,包括协方差矩阵、VAR或risk parity,然后定义目标函数,如收益最大化、风险最小化、夏普比率或信息比率最大化等。最后,根据投资者的偏好或先验信息设定其他约束条件,如空头限制、净杠杆约束、单头寸范围和行业头寸限制等。
在交易执行阶段,我们关注的是将理想组合转化为实际交易列表的过程。面对交易成本的复杂性,如线性与非线性成本,以及如何有效执行交易等挑战。实际操作中,小资金倾向于激进一次性下单,而大资金则更可能将交易执行交由交易员管理。
总结来看,从alpha预测向量出发,解决最优化问题是组合优化的核心议题。实践中,常见优化问题包括马科维茨问题(经典均值方差优化)、禁止做空约束、换手率约束、持有约束以及交易成本约束等。通过因子模型对协方差进行建模,可以提高风险模型的解释力。综合考虑持有约束、交易成本约束与风险模型,形成全栈优化策略。主动投资部分,基于信息率定义的策略提供给读者实践探索。
本文旨在展示量化股票投资组合的完整流程,即从alpha生成到组合构建的整合过程。组合优化与alpha预测同等重要,共同支撑着投资决策。希望本文提供的彩色通道公式源码代码与案例能够为读者提供实践指导,进一步加深对组合优化的理解与应用。
PyTorch 源码分析(三):torch.nn.Norm类算子
PyTorch源码详解(三):torch.nn.Norm类算子深入解析
Norm类算子在PyTorch中扮演着关键角色,它们包括BN(BatchNorm)、LayerNorm和InstanceNorm。1. BN/LayerNorm/InstanceNorm详解
BatchNorm(BN)的核心功能是对每个通道(C通道)的数据进行标准化,确保数据在每个批次后保持一致的尺度。它通过学习得到的gamma和beta参数进行缩放和平移,保持输入和输出形状一致,同时让数据分布更加稳定。 gamma和beta作为动态调整权重的参数,它们在BN的学习过程中起到至关重要的作用。2. Norm算子源码分析
继承关系:Norm类在PyTorch中具有清晰的继承结构,子类如BatchNorm和InstanceNorm分别继承了其特有的功能。
BN与InstanceNorm实现:在Python代码中,BatchNorm和InstanceNorm的实例化和计算逻辑都包含对输入数据的2D转换,即将其分割为M*N的矩阵。
计算过程:在计算过程中,首先计算每个通道的均值和方差,这是这些标准化方法的基础步骤。
C++侧的源码洞察
C++实现中,对于BatchNorm和LayerNorm,代码着重于处理数据的标准化操作,同时确保线程安全,通过高效的数据视图和线程视图处理来提高性能。Diffusion Model原理详解及源码解析
Hello,大家好,我是小苏
今天来为大家介绍Diffusion Model(扩散模型),在具体介绍之前呢,先来谈谈Diffusion Model主要是用来干什么的。其实啊,它对标的是生成对抗网络(GAN),只要GAN能干的事它基本都能干。在我一番体验Diffusion Model后,它给我的感觉是非常惊艳的。我之前用GAN网络来实现一些生成任务其实效果并不是很理想,而且往往训练很不稳定。但是换成Diffusion Model后生成的则非常逼真,也明显感觉到每一轮训练的结果相比之前都更加优异,也即训练更加稳定。
说了这么多,我就是想告诉大家Diffusion Model值得一学。但是说实话,这部分的公式理解起来是有一定困难的,我想这也成为了想学这个技术的同学的拦路虎。那么本文将用通俗的语言和公式为大家介绍Diffusion Model,并且结合公式为大家梳理Diffusion Model的代码,探究其是如何通过代码实现的。如果你想弄懂这部分,请耐心读下去,安卓 6.0 源码相信你会有所收获。
如果你准备好了的话,就让我们开始吧!!!
Diffusion Model的整体思路如下图所示:
其主要分为正向过程和逆向过程,正向过程类似于编码,逆向过程类似于解码。
怎么样,大家现在的感觉如何?是不是知道了Diffusion Model大概是怎么样的过程了呢,但是又对里面的细节感到很迷惑,搞不懂这样是怎么还原出的。不用担心,后面我会慢慢为大家细细介绍。
这一部分为大家介绍一下Diffusion Model正向过程和逆向过程的细节,主要通过推导一些公式来表示加噪前后图像间的关系。
正向过程在整体思路部分我们已经知道了正向过程其实就是一个不断加噪的过程,于是我们考虑能不能用一些公式表示出加噪前后图像的关系呢。我想让大家先思考一下后一时刻的图像受哪些因素影响呢,更具体的说,比如[公式]由哪些量所决定呢?我想这个问题很简单,即[公式]是由[公式]和所加的噪声共同决定的,也就是说后一时刻的图像主要由两个量决定,其一是上一时刻图像,其二是所加噪声量。「这个很好理解,大家应该都能明白吧」明白了这点,我们就可以用一个公式来表示[公式]时刻和[公式]时刻两个图像的关系,如下:
[公式] ——公式1
其中,[公式]表示[公式]时刻的图像,[公式]表示[公式]时刻图像,[公式]表示添加的高斯噪声,其服从N(0,1)分布。「注:N(0,1)表示标准高斯分布,其方差为1,均值为0」目前可以看出[公式]和[公式]、[公式]都有关系,这和我们前文所述后一时刻的图像由前一时刻图像和噪声决定相符合,这时你可能要问了,那么这个公式前面的[公式]和[公式]是什么呢,其实这个表示这两个量的权重大小,它们的平方和为1。
接着我们再深入考虑,为什么设置这样的权重?这个权重的设置是我们预先设定的吗?其实呢,[公式]还和另外一个量[公式]有关,关系式如下:
[公式] ——公式2
其中,[公式]是预先给定的值,它是一个随时刻不断增大的值,论文中它的范围为[0.,0.]。既然[公式]越来越大,则[公式]越来越小,[公式]越来越小,[公式]越来越大。现在我们在来考虑公式1,[公式]的权重[公式]随着时刻增加越来越大,表明我们所加的高斯噪声越来越多,这和我们整体思路部分所述是一致的,即越往后所加的噪声越多。
现在,我们已经得到了[公式]时刻和[公式]时刻两个图像的关系,但是[公式]时刻的图像是未知的。我们需要再由[公式]时刻推导出[公式]时刻图像,然后再由[公式]时刻推导出[公式]时刻图像,依此类推,直到由[公式]时刻推导出[公式]时刻图像即可。
逆向过程是将高斯噪声还原为预期的过程。先来看看我们已知条件有什么,其实就一个[公式]时刻的高斯噪声。我们希望将[公式]时刻的高斯噪声变成[公式]时刻的图像,是很难一步到位的,因此我们思考能不能和正向过程一样,先考虑[公式]时刻图像和[公式]时刻的关系,然后一步步向前推导得出结论呢。好的,思路有了,那就先来想想如何由已知的[公式]时刻图像得到[公式]时刻图像叭。
接着,我们利用贝叶斯公式来求解。公式如下:
那么我们将利用贝叶斯公式来求[公式]时刻图像,公式如下:
[公式] ——公式8
公式8中[公式]我们可以求得,就是刚刚正向过程求的嘛。但[公式]和[公式]是未知的。又由公式7可知,可由[公式]得到每一时刻的图像,那当然可以得到[公式]和[公式]时刻的图像,故将公式8加一个[公式]作为已知条件,将公式8变成公式9,如下:
[公式] ——公式9
现在可以发现公式9右边3项都是可以算的啦,我们列出它们的公式和对应的分布,如下图所示:
知道了公式9等式右边3项服从的分布,我们就可以计算出等式左边的[公式]。大家知道怎么计算嘛,这个很简单啦,没有什么技巧,就是纯算。在附录->高斯分布性质部分我们知道了高斯分布的表达式为:[公式]。那么我们只需要求出公式9等式右边3个高斯分布表达式,然后进行乘除运算即可求得[公式]。
好了,我们上图中得到了式子[公式]其实就是[公式]的表达式了。知道了这个表达式有什么用呢,主要是求出均值和方差。首先我们应该知道对高斯分布进行乘除运算的结果仍然是高斯分布,也就是说[公式]服从高斯分布,那么他的表达式就为 [公式],我们对比两个表达式,就可以计算出[公式]和[公式],如下图所示:
现在我们有了均值[公式]和方差[公式]就可以求出[公式]了,也就是求得了[公式]时刻的图像。推导到这里不知道大家听懂了多少呢?其实你动动小手来算一算你会发现它还是很简单的。但是不知道大家有没有发现一个问题,我们刚刚求得的最终结果[公式]和[公式]中含义一个[公式],这个[公式]是什么啊,他是我们最后想要的结果,现在怎么当成已知量了呢?这一块确实有点奇怪,我们先来看看我们从哪里引入了[公式]。往上翻翻你会发现使用贝叶斯公式时我们利用了正向过程中推导的公式7来表示[公式]和[公式],但是现在看来那个地方会引入一个新的未知量[公式],该怎么办呢?这时我们考虑用公式7来反向估计[公式],即反解公式7得出[公式]的表达式,如下:
[公式] ——公式
得到[公式]的估计值,此时将公式代入到上图的[公式]中,计算后得到最后估计的 [公式],表达式如下:
[公式] ——公式
好了,现在在整理一下[公式]时刻图像的均值[公式]和方差[公式],如下图所示:
有了公式我们就可以估计出[公式]时刻的图像了,接着就可以一步步求出[公式]、[公式]、[公式]、[公式]的图像啦。
这一小节原理详解部分就为大家介绍到这里了,大家听懂了多少呢。相信你阅读了此部分后,对Diffusion Model的原理其实已经有了哥大概的解了,但是肯定还有一些疑惑的地方,不用担心,代码部分会进一步帮助大家。
代码下载及使用本次代码下载地址: Diffusion Model代码
先来说说代码的使用吧,代码其实包含两个项目,一个的ddpm.py,另一个是ddpm_condition.py。大家可以理解为ddpm.py是最简单的扩散模型,ddpm_condition.py是ddpm.py的优化。本节会以ddpm.py为大家讲解。代码使用起来非常简单,首先在ddpm.py文件中指定数据集路径,即设置dataset_path的值,然后我们就可以运行代码了。需要注意的是,如果你使用的是CPU的话,那么你可能还需要修改一下代码中的device参数,这个就很简单啦,大家自己摸索摸索就能研究明白。
这里来简单说说ddpm的意思,英文全称为Denoising Diffusion Probabilistic Model,中文译为去噪扩散概率模型。
代码流程图这里我们直接来看论文中给的流程图好了,如下:
看到这个图你大概率是懵逼的,我来稍稍为大家解释一下。首先这个图表示整个算法的流程分为了训练阶段(Training)和采样阶段(Sampling)。
我们在正向过程中加入的噪声其实都是已知的,是可以作为真实值的。而逆向过程相当于一个去噪过程,我们用一个模型来预测噪声,让正向过程每一步加入的噪声和逆向过程对应步骤预测的噪声尽可能一致,而逆向过程预测噪声的方式就是丢入模型训练,其实就是Training中的第五步。
代码解析首先,按照我们理论部分应该有一个正向过程,其最重要的就是最后得出的公式7,如下:
[公式]
那么我们在代码中看一看是如何利用这个公式7的,代码如下:
Ɛ为随机的标准高斯分布,其实也就是真实值。大家可以看出,上式的返回值sqrt_alpha_hat * x + sqrt_one_minus_alpha_hat其实就表示公式7。注:这个代码我省略了很多细节,我只把关键的代码展示给大家看,要想完全明白,还需要大家记住调试调试了
接着我们就通过一个模型预测噪声,如下:
model的结构很简单,就是一个Unet结构,然后里面嵌套了几个Transformer机制,我就不带大家跳进去慢慢看了。现在有了预测值,也有了真实值Ɛ返回后Ɛ用noise表示,就可以计算他们的损失并不断迭代了。
上述其实就是训练过程的大体结构,我省略了很多,要是大家有任何问题的话可以评论区留言讨论。现在来看看采样过程的代码吧!!!
上述代码关键的就是 x = 1 / torch.sqrt(alpha) * (x - ((1 - alpha) / (torch.sqrt(1 - alpha_hat))) * predicted_noise) + torch.sqrt(beta) * noise这个公式,其对应着代码流程图中Sampling阶段中的第4步。需要注意一下这里的跟方差[公式]这个公式给的是[公式],但其实在我们理论计算时为[公式],这里做了近似处理计算,即[公式]和[公式]都是非常小且近似0的数,故把[公式]当成1计算,这里注意一下就好。
代码小结可以看出,这一部分我所用的篇幅很少,只列出了关键的部分,很多细节需要大家自己感悟。比如代码中时刻T的用法,其实是较难理解的,代码中将其作为正余弦位置编码处理。如果你对位置编码不熟悉,可以看一下我的 这篇文章的附录部分,有详细的介绍位置编码,相信你读后会有所收获。
参考链接由浅入深了解Diffusion
附录高斯分布性质高斯分布又称正态分布,其表达式为:
[公式]
其中[公式]为均值,[公式]为方差。若随机变量服X从正态均值为[公式],方差为[公式]的高斯分布,一般记为[公式]。此外,有一点大家需要知道,如果我们知道一个随机变量服从高斯分布,且知道他们的均值和方差,那么我们就能写出该随机变量的表达式。
高斯分布还有一些非常好的性质,现举一些例子帮助大家理解。
版权声明:本文为奥比中光3D视觉开发者社区特约作者授权原创发布,未经授权不得转载,本文仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。
3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。
加入 3D视觉开发者社区学习行业前沿知识,赋能开发者技能提升!加入 3D视觉AI开放平台体验AI算法能力,助力开发者视觉算法落地!
往期推荐:1、 开发者社区「运营官」招募启动啦! - 知乎 (zhihu.com)
2、 综述:基于点云的自动驾驶3D目标检测和分类方法 - 知乎 (zhihu.com)
3、 最新综述:基于深度学习方式的单目物体姿态估计与跟踪 - 知乎 (zhihu.com)
BatchNorm理解(含Pytorch部分源码)
深度学习中,数据归一化是关键。神经网络学习数据分布以在测试集上达到泛化效果。然而,若每个batch输入数据分布不同,即Covariate Shift,这会带来训练挑战。数据经过多层网络后,分布发生改变,形成Internal Covariate Shift,这进一步增加了下层网络学习的难度。为解决中间层Internal Covariate Shift问题,引入了Batch Normalization(BN)操作。
BN算法流程如下:
(1)计算输入批量数据的均值。
(2)计算输入批量数据的方差。
(3)对每个数据进行归一化。
(4)引入缩放变量和平移变量,通过训练更新,计算归一化后的值。
BN中均值方差计算基于张量数据,通常维度为[N, H, W, C]。其中N为batch_size,H和W为特征图尺寸,C为通道数。均值计算是每个通道内数字总和除以[N, H, W]。例如,对于[2,2,2,3]输入,代表2个batch,每个batch有3个特征图(通道数为3),每个特征图大小为2*2。以通道1为例,计算步骤如下:
均值计算公式为:均值=(所有数字总和)/ [N, H, W]。
最终获得三个通道的均值和方差,网络更新参数,为每一个channel对应一个缩放变量和平移变量。
在Pytorch中,BN通过_NormBase类和_BatchNorm类实现。_NormBase类定义BN相关的属性,_BatchNorm类继承自_NormBase,是BatchNorm2d实际调用的类。具体源码包括定义属性、计算均值和方差、归一化以及参数更新等关键步骤。