精华内容
下载资源
问答
  • 前言本文介绍了3篇二进制代码相似性分析的顶会技术,他们体现了二进制代码相似性分析中一些最先进思想。第一篇是Genius技术,是在《基于神经网络图嵌入跨平台二进制代码相似性检测》论文中作为对比技术介绍,它...
    fad12c9038cee08dead0b37611f03350.png

    前言

    本文介绍了3篇二进制代码相似性分析的顶会技术,他们体现了二进制代码相似性分析中一些最先进的思想。

    第一篇是Genius技术,是在《基于神经网络图嵌入的跨平台二进制代码相似性检测》论文中作为对比技术介绍,它首次使用图嵌入这个机器学习的概念去做二进制代码相似性分析,它涉及到了聚类算法、图比对、密码本等技术,也为后两篇论文打下了基础。

    第二篇是Gemini技术,它使用了更先进的Structure2vec算法计算图嵌入,并融合Siamese网络和神经网络。

    第三篇是腾讯科恩实验室最近的顶会技术,它以Gemini的思路作为基础,使用了更多的自然言语处理和深度学习算法去训练程序控制流图中基本块语义信息、结构信息、顺序信息。

    最近,科恩实验室顶会 《基于语义感知的神经网络的二进制代码相似度检测》 让我眼前一亮。因为当时我也正尝试在二进制代码分析中引入机器学习,正在试用的是随机森林和adaboost算法(相较之下太low了),打算用它们做一个独立于IDA的func_split,用来识别二进制代码的函数。

    然后,就去看了一下这个论文,看上去很高大上。但郁闷的是,对提到的二进制相关知识都很熟悉,但对算法应用的原因和意义都很懵逼。就这样,深度学习在二进制分析上的应用让我产生了极大兴趣,我决定好好研究下。

    但是这个论文用的机器学习算法太多了,而且工作是基于另一篇论文的基础,为了搞懂这个论文,我决定先去读它的基线论文 《基于神经网络图嵌入的跨平台二进制代码相似性检测》 ,然后再来看看科恩顶会的创新和精妙之处 。

    论文分析

    基于神经网络图嵌入的跨平台二进制代码相似性检测

    从论文标题说起:

    图嵌入

    先解释一个最重要的术语“图嵌入”,图嵌入的目的是降维,在保留图特征的前提下将图经过非线性变换成一维向量。

    相较于以前通过比对两个二进制函数的CFG图(函数的控制流程图)的相似性去判断代码相似性(图比对),现在提取CFG图嵌入后对向量做相似性比较,其时间代价是不是更小,而且特征更为抽象。

    但是,利用CFG图嵌入做二进制代码的相似性检测,前人已经做过了(Genius),而且Genius在对CFG做嵌入之前,将CFG转换为ACFG,即提取控制流程图中平台无关的基本块属性和块间属性。

    Genius使用二部图匹配算法和密码本作为基础去计算ACFG的嵌入,具体做法是使用聚类算法训练出一个具有代表性的ACFG的特征向量集合,形成一个ACFG与特征向量对应的密码本,对于新的待计算ACFG,通过二部图匹配算法与码本中每个代表性的ACFG进行相似性比对,新ACFG的嵌入即为与其最相似的代表性ACFG的特征向量。

    Genius的图嵌入生成方法时间代价较高,而且码本质量取决于训练数据规模。

    Gemini(论文实现的原型)采用Structure2vec算法计算ACFG的图嵌入,该算法从空间结构的相似性去定义相似度,通过评价函数整合节点和它n层邻居的信息,将这些信息压缩成一个有限维的非线性向量。

    原产的Structure2vec算法并不能直接用于计算ACFG图嵌入 ,Gemini使用了其变种,首先对ACFG每个节点使用变种的Structure2vec算法压缩基本块属性和图结构信息到一个特征向量中,然后使用聚合函数将所有节点的特征向量聚合成一个向量。

    听起来不错吧, 它可以整合CFG中基本块信息和基本块间的结构信息并把它们映射成一个非线性向量的表示形式。

    注:Structure2vec论文是2017年发表,Genius论文是2016年发表,也不怪Genius没考虑到用Structure2vec算法去计算ACFG图嵌入。

    加入神经网络的图嵌入

    到这里,Gemini做二进制代码的相似性分析基础架构都有了(即基于Structure2vec算法生成2个二进制函数的ACFG图嵌入,然后通过比较2个嵌入向量的相似性),神经网络有什么用?这时,神经网络算法就该出场了,给它安排的活是训练Structure2vec算法的参数,这时候有公式可能更直观些。

    f1dda80a169cb5992710b39e5a253da4.png

    如公式2所示,这是Gemini选定用来在Structure2vec模型中做非线性映射的模型,这个非线性映射的输入xv是节点的基本块属性信息,u∈N(v)是节点的邻接节点信息,经过映射可得到一个节点的特征向量,而整个ACFG特征向量是通过所有节点聚合得来。

    其中,σ(·)是一个非线性变化, Gemini为了使非线性变化较为强大,就把σ(·)设计成n层全连接神经网络 ;W1是一个d*p矩阵,d是xv(基本块属性)的长度,p是生成的嵌入长度,W1也是待训练参数。

    目前,总结来说就是,基础是Structure2vec模型中加入神经网络来训练其非线性变化的模型,再用聚合函数将ACFG节点的特征向量聚合成ACFG的图嵌入,结合神经网络的图嵌入最终输出的依然是ACFG图嵌入(也可以称为ACFG的特征向量)。

    Siamese网络

    在前面已经介绍过本文采用的二进制代码相似比对的方式就是比较图嵌入,那么图嵌入计算出来后,如何处理可以得到相似度的结果,答案就是Siamese网络,其模型特点是在样本量少的情况下识别类型。

    b6808d70ba95043d64055857c6439091.png

    如上图所示,Siamese模型本身包括了目标降维模块,正好上文的融入神经网络的图嵌入即可作为模型中的降维模块。整体模型的输入是两个待比较二进制函数的ACFG,经过嵌入网络得到降维的特征向量u1和u2,然后计算二者余弦距离,通过阈值判定结果是-1(非相似),还是1(相似)。当然,训练过程都有真实的标签,以便整个模型不断调整参数。

    跨平台

    跨平台指的是什么呢?即,二进制代码相似性比较与二进制代码所处平台、使用的编译器和优化选项无关,训练出的ACFG图嵌入计算模型和使用的相似比对方法与以上条件无关。

    又是如何做的呢?总结起来有两点工作:

    继承了Genius提取二进制函数CFG中与平台无关性的属性,6个基本块属性: 字符串常量、数字常量,传递指令数量,调用指令数量,运算指令数量,指令总数量; 1个基本块间属性: 基本块子代数量。 需要注意的是,Gemini抛弃了Genius中使用的另一个基本块间属性“介数中心性”(betweenness),原因是该属性提取较慢,与模型的最终效果影响也不大。

    训练数据采集的平台无关性,Gemini使用同一份源码在不同系统平台、不同编译器、不同编译器优化选项的条件下生成大量带标签的样本。 另外有一个样本处理的细节是 不会将同一份源码编译后的二进制代码分开在训练集、验证集和测试集。 个人认为这样做有助于在训练模型的过程中充分考虑到编译的不同条件,以训练出平台无关性模型。 在测试时,也可以用其它源码生成的样本来验证未经训练的数据是否符合模型。

    总结标题

    在介绍了论文中的图嵌入、神经网络、跨平台的概念及论文中的应用,那论文整体的思路也都明确了。总结下标题,目标是做跨平台二进制代码的相似性检查,方法是加入神经网络的图嵌入。

    对论文的思考

    对于二进制代码,它的变化并不是无穷无尽的,因为它的产生是来源于机器规则,它看起来复杂难懂,但其内部必然藏着巨大的规律性 ,而深度学习的优势就在于挖掘这种潜在的规律,我目前认为“深度学习是只要你有,我就一定能挖出来”。至于怎么挖,用什么样的算法和模型,这需要人去建立二进制数据和模型的联系和关系,这篇论文是一个很好的结合,我相信未来,在这个方向上的继往开来者会很多。

    对于ACFG中的属性,不同平台、编译器、优化选项生成的二进制代码, 有些属性值(运算指令、call指令、指令总数,甚至常量值等)存在噪声,它的成分并不是全部用来体现函数本身 ,有些仅是某个平台和编译器或优化选项特有的,例如一些安全机制,栈随机值保护、栈指针验证、异常处理等,在不同平台和优化选项中,这些可能出现,也可能不出现。训练模型时需要考虑这些,在模型真正用于实际时也需要考虑这些。

    论文写的非常好,从引言到原理阐述,其他方法的对比,对模型中特殊情况的考虑(例如超参问题),还有深度挖掘了这个项目的主线之外的价值点(例如再训练问题),并做了相关的实验。值得经常翻看,所以认真的把它翻译成了中文,包括人家的答谢,英文水平有限,还望有看到的见谅。

    注:论文翻译可在博客的历史文章中找到。

    基于语义感知的神经网络的二进制代码相似度检测

    现在来看看科恩的论文,着重说说它与Gemini的不同之处吧。

    e50fdd8981d67f4ccde40dd431438fa5.png

    Semantic-aware 模块: BERT算法训练基本块语义与结构信息

    Gemini沿用了它的基线论文Genius提取CFG属性后(即ACFG)做图嵌入,该篇论文认为这将损失大量的语义信息,故而在形成类似Gemini中ACFG的过程前,引入了NLP(自然语言处理),即使用BERT算法对每个基本块序列进行训练,语义训练模型包含4个子任务,期望训练出的模型包含以下4个维度的信息:

    • Block的代码语义
    • Block的邻接信息
    • Block是否属于CFG
    • Block所属平台、编译器、及哪个优化选项

    语义提取模型最终输出类似于Genius和Gemini的ACFG图,区别是该部分使用机器学习替代了人工提取(使用IDA脚本),而且包含基本块属性额外的信息, 输出的基本块特征向量由机器学习得到

    MPNN算法计算“ACFG”的图嵌入

    MPNN(消息传递网络)是由Goog le科学家提出的一种模型,它本质上还是利用卷积神经网络学习图结构信息,只是形式框架上较为新颖,它通过收到邻居的消息来更新自己的状态,所以叫作消息传递网络。(目前还没有对卷积神经网络和MPNN进行细致学习,能理解的就是这么多,可能有不准确的地方)。

    不过,简单的理解,该模型的作用可以类比Gemini的Structure2vec模型,他们的输入都是CFG图(其中基本块属性被量化成有限维特征向量),输出都是图嵌入, 但这个图嵌入不是最终的图嵌入,它还要融入节点顺序模型的训练成果。

    CNN算法训练节点顺序的特征

    使用CNN(卷积神经网络)对CFG中节点相应顺序或者说布局进行训练也是该论文的一个重要创新部分。

    由于前面已经包含了基本块的属性信息和CFG整体结构信息,这个模型就专注于训练CFG的节点顺序信息。

    具体做法是,先把CFG节点布局抽象成01矩阵,然后对矩阵做卷积神经网络,学习CFG节点顺序相关特征,最后输出是一个特征向量。

    模型融合

    该篇论文使用了三个模型从不同角度去训练二进制代码CFG中的信息,其中语义感知模型和结构感知模型是串联的,顺序模型可以与前面两个并连,最后使用MLP(多层神经网络)将两条线上输出的特征向量映射为一个特征向量。

    融入三种模型后输出的这个特征向量才是和Gemini中基于神经网络的Structure2vec模型训练出的特征向量是类似地位。

    对论文的思考

    科恩的论文对二进制本身特性考虑的更多,例如我在前边论文思考中提到的平台、编译器、优化选项产生的噪声,他们在语义感知模型中加入了训练Block属于某个平台、编译器和优化选项这个信息,不确定是否能消除这个噪声,但至少考虑到了。

    CFG还有一个很重要的信息,即节点的有向传播( 基本块间的跳转是有向的,不能逆代码流程方向传播 ),论文中的顺序感知模型也许正好可以弥补这个方面的信息。

    整个提取图嵌入的流程在3个地方用了神经网络算法,1个地方用了NLP算法,而且训练无法并行,也不是端到端, 最长的链路为BERT -> MPNN -> MPL, 这个也许会在实用性上面打些折扣,不知道是否可以做些合适的取舍或训练算法融合呢?

    感悟

    在漏洞挖掘领域中,当一门新技术、一个新工具、一些新代码出现时,厉害的人往往可以收获一大批CVE,靠的是日益累积的技术能力和漏洞挖掘领域中敏锐的嗅觉。我看顶级研究也是靠这两样,以2016年Genius论文为基础,它使用了图比对和密码本去计算CFG图嵌入。

    到2017年Structure2vec论文出现时,Gemini能第一个想到用Structure2vec算法去替代图比对和密码本。BERT和MPNN也是2017年以后才出现的,科恩的论文能想到它们适应于解决ACFG人工生成问题和图嵌入计算的问题。

    一个有前途的基础研究出来后,必定是遍地开花的结果,不过果实是留给准备充分的人!

    展开全文
  • 叙述了传统的PCA方法在处理QAR数据相似性问题的不足,提出基于EROS的KPCA方法处理QAR数据之间的相似性问题。通过引入EROS方法而不需要对数据进行向量化,引入核矩阵对QAR数据进行主成分分析,可以有效降低数据的维数...
  • 实验选取两组某烟草企业提供的烟叶光谱构建了光谱的相似性度量模型, 以相似性度量的准确率作为算法优劣的衡量标准。实验结果表明, GGLLE算法构建的相似性度量模型的准确率为93.3%, 明显优于主成分分析、栈式自编码器...
  • 对人类数据的分析主要来自辐射事故,放射疗法和原子弹受害者。 作者发表了以Cerveny,MacVittie和Young提出的数据为基础,采用概率公式模型构建的LD50通用数学方程式。 在这项研究中,作者比较了整体辐射耐受和...
  • 基于累积失效模型(CEM),对两组指数产品联合II型截尾数据进行综合分析.首先,计算未知参数极大似然估计(MLE),并利用矩母函数(MGF)建立其条件概率分布.然后,采用两种方法,基于概率分布精确分析方法和...
  • 多变量数据的统计描述与统计推断(三)轮廓分析轮廓分析是比较两组或多组多变量均数向量的轮廓是否相等。...抛开拗口的概念,轮廓分析就是比较分组样本的在不同条件下均值轮廓(变化趋势)的相似性。轮廓相似的情况:...

    多变量数据的统计描述与统计推断

    (三)轮廓分析

    轮廓分析是比较两组或多组多变量均数向量的轮廓是否相等。轮廓分析是两个或多个均数向量比较的一个特例。m个变量可以是同一个处理的m次重复测量结果,也可以是m次处理的观察结果,但m次处理的观察结果必须属于同一类型的指标且计量单位相同。a5ef4a5a3e0145459d547d9f25040b23.png

    1

    什么是轮廓分析?

    抛开拗口的概念,轮廓分析就是比较分组样本的在不同条件下均值轮廓(变化趋势)的相似性。轮廓相似的情况:d7602f85093347f7e976fcbce7e5e084.png轮廓不相似的情况:a006fa55737dc219fe21592b386ad2ee.png”如果轮廓相似,下一步可以继续分析轮廓是否重合也就是几个轮廓之间是否离得足够近,以至于看不出轮廓之间有什么差别。在前两步都满足的条件下,可以把分组合并成一组,看看轮廓是不是水平的,也就是看看各个条件之间是不是有什么差异。其实轮廓分析并不神秘,只不过以前不知道这个名字而已。其分析方法就是采用重复测量的多元方差分析(MANOVA)。第一步:轮廓是否相似其实就是看看分析各组之间是否存在交互作用;第二步:轮廓是否重合是看分组之间是否存在显著差异;第三步:轮廓是否水平是分析各个条件之间是否存在显著差异。注意步骤顺序,如果第一步的结论是轮廓不相似,那后两步就没有必要分析了;如果第二步的结论是轮廓不重合,则第三步就不用分析了。“以上概念都是来自知乎网友的回答,讲解的很透彻,我就直接粘贴过来了(主要是人家写得好,不是我偷懒···):473b48fc95a6325b202b96d0c78f9cdb.png概念原理知道了,那接下来就进入实战演练a5ef4a5a3e0145459d547d9f25040b23.png

    2

    实战演练

    经典案例:b409352760cfb9b99af40457d2b25b38.png256f599930eb1575c4737e9969d86373.png数据录入:f9af44c5a11787080272566c19458723.png仅截取部分SPSS设置:4ddaf3a84531b3c0e4a6c48af9885f27.png2c54be1d4ab7afdfb8ba0546669feb57.png56ef0435bc786b760e30ea03c76338ad.png4badc2ab20d5e651b569a3643735ed60.png结果:e38bdb5b97f88c85e6fce3df23d61c75.png平行轮廓检验:就看是有无交互作用,F=0.481,P>0.05,可以认为两总体的轮廓相互平行,也就是说硕士生和博士生的回答基本相同bb21dfbc5cbee0688ad31058a35efb06.png15dfa4162c8c2455a92e03834a934d49.png重合轮廓检验:分组之间是否存在显著差异,“group”F=0.276,P>0.05,可见两个总体重合了,从图上也能看出。水平轮廓检验:经过前两步的检验,两组轮廓即平行又重合,可将资料合并为一组,分析各个条件之间是否存在显著差异。得重新操作一下:f6939bfeac4fc8abb4ea7881d23e84dc.png我们将group移出主体间因子,其他不变。13ce7be68d3afd0a296ca8652627d220.png4830289a6092d711936dd7cc2774d5d1.pngF=10.928,P<0.001,意思是7个问题的均数不同,即7个问题的回答的分值有高有低。其中第5个问题均值最高,第4个问题均值最低。最终结论:对健康调查问卷7个问题的回答,硕士生和博士生没有差别。健康调查问卷每个问题回答的分值不同,第5个问题(有紧张情绪和压力感)均值最高,第4个问题(有生病的感觉)均值最低。a5ef4a5a3e0145459d547d9f25040b23.png

    END

    教材上多元方差分析的内容就说完了,当然不仅仅只有我说的这些这么简单,教材仅仅是入门的基础,后面深入复杂的东西还有很多。大家有需求的话,可以自己去查阅专门的教材进行学习,本章就再不扩展了。下一章开始新内容----相关回归的学习。拜拜。
    展开全文
  • 通过统计测试对数据进行分析和比较。 结果:研究组平均年龄(±SD)几乎相似(28.8±8.4 vs. 27.4±7.2岁,p = 0.486)。 在A组中,有83.33%患者发生了术后尿道狭窄,无一例出现尿失禁,20.83%患者出现了...
  • 最后,分别通过两组实测LiDAR点云数据对算法正确与有效进行验证。结果表明:在求解空间相似变换参数过程中,借助平面特征四参数表达法,通过参数对等条件约束来判断配准后同名特征一致,同时满足了同名...
  • 针对传统多机多目标攻击不易解算攻击任务分配,且计算量大的问题,提出基于划分的多目标模糊聚类算法,该算法根据目标属性的相似性进行多目标分类,可以有效地降低多目标任务分配解算维数,减少运算量,提高解算速度...
  • 方法:回顾性分析60例接受全膝关节置换术(TKA)患者,分为两组::骨表面置换术(PR)和无without骨表面置换术(NPR)。 我们审查了来自这些包含KSS患者的数据,这些数据通常用于我们服务中。 分析了2013年至...
  • 方法:这是一项回顾研究,前瞻地研究了1999年1月至2015年9月间进入心脏外科数据库的数据。总共9609例患者接受了心脏外科手术,其中54例患者在IVA存活下来。 将短期和长期结局与倾向匹配组进行比较。 使用Kaplan...
  • 在青春期后青少年中,两组之间NC相似。 在所有青少年以及处于成熟青春期和青春期后青少年中,均呈负相关。 不同是,青春期前青少年在NC和生化参数之间显示出正相关。 结论:这项研究表明,NC与血糖...
  • 考虑到局部参数对区分正常结构和病理结构兴趣,本研究将应用一阶和二阶立体学工具来确定与正常前列腺相比,细胞角蛋白18(ck18)免疫表达是否显示了BPH相关局部变化,如果进行整体估计两组相似。 方法:为...
  • 方法:我们于2016年1月1日至2018年3月31日进行了一项比较分析性横断面研究,分为两组:第1组接受腹腔镜子宫肌瘤切除术(LM)妇女和第2组接受腹腔子宫肌瘤切除术(AM)妇女。 收集的数据以Epi Info 7.2版本输入...
  • 相关系数是反映两变量间线性相关关系的統计指标,是一种反映变量之间相关关系密切程度的统计指标,在现实中一般用于对于两组数据的拟合和相似程度进行定量化分析,第用的般是皮尔逊相关系数( pearson),MLlib中默认的...

    1、相关系数和假设校验概述

        相关系数和假设检验是数理统计中的基本概念和统计工具,对于机器学习模型的设定和优化策略有很大帮助。

    1.1 相关系数

        相关系数是反映两变量间线性相关性关系的統计指标,是一种反映变量之间相关关系密切程度的统计指标,在现实中一般用于对于两组数据的拟合和相似程度进行定量化分析,第用的般是皮尔逊相关系数( pearson),MLlib中默认的相关系数求法也是皮尔逊相关系数法,另还支持斯皮尔曼等级相关系数( spearman)。皮尔逊相关系的值是一个1≤ρxy≤1的数,用以判定两个变量变化是同向还是反向,以便观察这两个变量是呈现正相关还是负相关,甚至为0时的”相互独立”,其数学公式为:

    即两变量的协方差除以其标准差,极大程度上规避了单用协方差无法体现相关性的劣势。
    斯皮尔曼等级相关系数的公式如下:

    Rs = 1-\frac{6 \times d}{N\times\left (N^2 -1 \right )}

     

    该相关系数没有皮尔逊那么严格。
    皮尔逊相关系数代表随着数据量的増加,两组数据的差别将増大,而斯皮尔曼相关系数更注重两组数据的拟合程度,即两组数据随着数据量的増加而増长曲线不变。

    1.2  假设校验

        假设检验是一种依据一定假设条件计算样本某种并判断是否符合总体规律,或判断两个样本之间是否存在独立性的统计学理论。假设检验的基本思想是小概率反证法思想,小概率思想认为小概率事件在一次实验中基本不可能发生,因此在假设检验中,我们通常先假定一个假设Ho,然后选择它的相反项为螽择假设H1,通常以α=005作为小概率事件的界定线,称之为显著性水平,通过我们的样本数据计算出一个概率值p,如果p≤0.05,那么认为H0是会发生的,也就是说H0的发生是小概率事件,也就是认为当p ≤ 0.05时,否定原假设H0
        常用的假设检验法有T检验,z检验,卡方检验和F检验。
       卡方检验的一种常用的假设检验方法, Spark MLlib目前支持皮尔逊卡方检测,包括“适配度检定”( Goodness of fit)和“独立性检定"( independence)。其中适配度检定是指样本的发生次数(实际值)分配是否服从母体的次数分配(期望),独立性检定偏向于两类变量之间的关系是否居于相关性。
       适配度检定举例:全世界上千万人统计人类出生时男孩和女孩的几率是一样的,某医院对2018年100名新生婴儿的性别做了统计,男孩56个,女孩44个,以此判定这个样本是否符合母体的分配规律。
       独立性检定举例:性别和习惯用左右手是否有关。

    2、调用方式
    2.1 相关系数

    依据我们输入的类型不同,则其对应的输出类型也不同,如果我们输入的是两个 JavaRDD<double>,则输出的是 double的值,这个值便是相关性系数;如果我们输入的是 RDD<Vector>(需通过 JavaRDD<Vector>.rdd()进行转换),则输出的结果是一个相关系数矩阵。相关系数矩阵是计算各列相关系数而生成的一个矩阵,相关系数矩阵第第列生成的值就是原数据中第列和第列生成的相关系数。API是 Statistics(org. apache. spark. mllib. stat. Statistics)的corr()方法。
    生成pearson相关系数:

    //输入的seriesX,seriesY是两组JavaRDD<Double>类型的数据,代表两个不同的变量
    //输出的类型是double
    Statistics.corr(seriesX, seriesY,”pearson”);
    生成spearman相关系数:
    //输入的seriesX,seriesY是两组JavaRDD<Double>类型的数据,代表两个不同的变量
    //输出的类型是double
    Statistics.corr(seriesX, seriesY,”spearman”);

    生成pearson相关系数矩阵和spearman相关系数矩阵:

    //输入的类型为RDD<Vector>
    Statistics.corr(data,”pearson”);
    Statistics.corr(data,” spearman”);

    2.2 假设检验 

    做适配度检定和独立性检定时,需要输入的参数关型不同,适配度检定要求输入的是 Vector.独立性检定要求输入的是Matrix。调用的API是 Statistics.chiSqTest();

    配度检定:这里依旧引用上例,新生婴儿的性别是否符合母体规律,(样本为2018年100名新生妥儿的性别做了统计,男孩56个,女孩44个)

    Vector v = Vectors.dense(new double[]{56,44});
    ChiSqTestResult result = Statistics.chiSqTest(v);

    独立性检定
    原始数据表达:

      小计
    右手 43 44 87
    左手 9 4 13
    小计 52 48 100
    //这里要注意矩阵是按列优先填充的,故数据要以列的形式写入
    Matrix matrix = Matrixs.dense(2,2,new double[]{43.0,9.0,44.0,4.0});
    Statistics.chiSqTest(matrix);

    3、 Spark中的实践应用

    3.1 相关系数的应用

    原始文件内容:(文件名为: correlations txt,存放在 src/main/resources),第一列是凝血酶浓度(单位升),第二列是凝血时间(秒),下面探究这两者之间的相性如何?

    1.1    14
    1.2    13
    1.0    15
    0.9    15
    1.2    13
    1.1    14
    0.9    16
    0.9    15
    1.0    14
    0.9    16
    1.1    15
    0.9    16
    1.0    15
    1.1    14
    0.8    17

    相关系数代码实现:
    Sparkconf conf = new SparkConf().setMaster("local").setAppName("Correlations");
    JavasparkContext jsc = new JavaSparkContext(conf);
    JavaRDD<String> lines = jsc.textFile("src/main/resources/correlations.txt");
    //将源文件读取进来的第一列作为第一个变量
    JavaRDD<Double> seriesX =lines.map(x ->x split(" ")).map(x->Double.parseDouble(x[0]));
    //将源文件读取进来的第二列作为第二个变量
    JavaRDD<Double> seriesY =lines.map(x ->x split(" ")).map(x->Double.parseDouble(x[1]));
    //调用Statistics包下的corr()即可得到皮尔逊相关系数
    double corr = Statistics.corr(seriesX,seriesY,"pearson");
    //结果是-0.907,表名两个变量呈现负相关趋势,即一方增高一方降低
    System.out.println(corr);
    //获取斯皮尔相关系数
    double corr2 = Statistics.corr(seriesX,seriesY,"spearman");
    //结果是-0.894
    System.out.println(corr);
    相关系数矩代码实现:
    Sparkconf conf = new SparkConf().setMaster("local").setAppName("Correlations");
    JavasparkContext jsc = new JavaSparkContext(conf);
    JavaRDD<String> lines = jsc.textFile("src/main/resources/correlations.txt");
    JavaRDD<Vector> data =lines.map(x->x split(" ")).map(x ->Vectors. dense(Double. parseDouble(x[0]), Double. parseDouble(x[1])));
    //将JavaRDD转化为RDD
    RDD<Vector> data2 = data.rdd();
    //调用Statistics包下的corr()得到皮尔逊相关系数矩阵
    Matrix corr = Statistics.corr(data2,"pearson");
    //结果是
    //1.0                 -0.9069678578088085
    //-0.9069678578088085 1.0
    /获取斯皮尔曼相关系数矩阵
    Matrix corr = Statistics.corr(data2,"spearman");
    //结果是:
    //1.0                  -0.8942857152857139
    // -0.8942857152857139 1.0

    3.2 假设检验的应用

    3.2.1 适合度检验

    背景:只要是质量合格的骰子掷出1~6的几率就应该是相同的,现在有一枚骰子掷出600次,统计出1~6的次数如下:90,85,123,91,86,125,判定该骰子是否有质
    原假设Ho:骰子没有问题
    显著性水平:a=0.05
    代码实现:(如果做适配度检验, Statistics. chiSqTest(v)需要输入的是一个向量)

    Sparkconf conf = new SparkConf().setMaster("local").setAppName("GoodnessOfFit");
    JavasparkContext jsc = new JavaSparkContext(conf);
    //做适配度检定是需要的参数是一个Vector
    Vector v = Vectors. dense(new double[] {90, 85, 123, 91, 86, 125});
    ChiSqTestResult result = Statistics.chiSqTest(v);
    System.out.println(result);
    结果显示:
    Chi squared test summary:
    method: pearson
    degrees of freedom = 5
    statistic = 17.56
    pvalue=0.0035515235818343554
    每一个值的输出含义:
    method:使用的方法,用的是皮尔逊卡方检验法
    degrees of freedom:自由度,一般为样本个数减1
    statistic:检验统计量,一个用来决定是否可以拒绝原假设的证据,该值越大表示可以绝句原假设的理由越充分
    pValue:根据显著性检验方法得到的一个概率p值,该值<=0.05为显著,通常这个值小于等于0.05,便认为有充足理由可以拒绝原假设
    这里的pValue = 0.00355 <= 0.05,则拒绝原假设,说明该骰子有问题。

    3.2.2 独立性检定

    显著性水平:α = 0.05
    代码实现:(如果做独立性检验, Statistics. chiSqTest()需要输入的是一个矩阵)

    Matrix m  = Matrixs.dense(2,2,new double[]{43.0,9.0,44.0,4.0});
    //做独立性检验时需要的参数为Matrix
    System.out.println(Statistics.chiSqTest(m));
    结果为:
    Chi squared test summary:
    method: pearson
    degrees of freedom = 1
    statistic = 1.7774150400145103
    pvalue=0.1824670652605519
    里 pvalue=0.182>0.05,表明可以接受原假设,即说明性别和惯用左右手没有关系。

     

    展开全文
  • 1.1 相关系数相关系数是反映两变量间线性相关关系的統计指标,是一种反映变量之间相关关系密切程度的统计指标,在现实中一般用于对于两组数据的拟合和相似程度进行定量化分析,第用的般是皮尔逊相关系数( pearson),...
    d2ab637325060354716cb3aedf47a0b3.png
    4442d31d0333bb66584198f629905ce3.png

    1、相关系数和假设校验概述

    相关系数和假设检验是数理统计中的基本概念和统计工具,对于机器学习模型的设定和优化策略有很大帮助。

    1.1 相关系数

    相关系数是反映两变量间线性相关性关系的統计指标,是一种反映变量之间相关关系密切程度的统计指标,在现实中一般用于对于两组数据的拟合和相似程度进行定量化分析,第用的般是皮尔逊相关系数( pearson),MLlib中默认的相关系数求法也是皮尔逊相关系数法,另还支持斯皮尔曼等级相关系数( spearman)。皮尔逊相关系的值是一个1≤ρxy≤1的数,用以判定两个变量变化是同向还是反向,以便观察这两个变量是呈现正相关还是负相关,甚至为0时的”相互独立”,其数学公式为:

    3e866b2338b9fdab270665c7afa90143.gif

    即两变量的协方差除以其标准差,极大程度上规避了单用协方差无法体现相关性的劣势。

    斯皮尔曼等级相关系数的公式如下:

    2d980feb37ca8bf59ce27a069e9157b8.gif

    该相关系数没有皮尔逊那么严格。

    皮尔逊相关系数代表随着数据量的増加,两组数据的差别将増大,而斯皮尔曼相关系数更注重两组数据的拟合程度,即两组数据随着数据量的増加而増长曲线不变。

    1.2 假设校验

    假设检验是一种依据一定假设条件计算样本某种并判断是否符合总体规律,或判断两个样本之间是否存在独立性的统计学理论。假设检验的基本思想是小概率反证法思想,小概率思想认为小概率事件在一次实验中基本不可能发生,因此在假设检验中,我们通常先假定一个假设Ho,然后选择它的相反项为螽择假设H1,通常以α=005作为小概率事件的界定线,称之为显著性水平,通过我们的样本数据计算出一个概率值p,如果p≤0.05,那么认为H0是会发生的,也就是说H0的发生是小概率事件,也就是认为当p ≤ 0.05时,否定原假设H0

    常用的假设检验法有T检验,z检验,卡方检验和F检验。

    卡方检验的一种常用的假设检验方法, Spark MLlib目前支持皮尔逊卡方检测,包括“适配度检定”( Goodness of fit)和“独立性检定"( independence)。其中适配度检定是指样本的发生次数(实际值)分配是否服从母体的次数分配(期望),独立性检定偏向于两类变量之间的关系是否居于相关性。

    适配度检定举例:全世界上千万人统计人类出生时男孩和女孩的几率是一样的,某医院对2018年100名新生婴儿的性别做了统计,男孩56个,女孩44个,以此判定这个样本是否符合母体的分配规律。

    独立性检定举例:性别和习惯用左右手是否有关。

    2、调用方式

    2.1 相关系数

    依据我们输入的类型不同,则其对应的输出类型也不同,如果我们输入的是两个 JavaRDD,则输出的是 double的值,这个值便是相关性系数;如果我们输入的是 RDD(需通过 JavaRDD.rdd()进行转换),则输出的结果是一个相关系数矩阵。相关系数矩阵是计算各列相关系数而生成的一个矩阵,相关系数矩阵第第列生成的值就是原数据中第列和第列生成的相关系数。API是 Statistics(org. apache. spark. mllib. stat. Statistics)的corr()方法。

    生成pearson相关系数:

    //输入的seriesX,seriesY是两组JavaRDD类型的数据,代表两个不同的变量//输出的类型是doubleStatistics.corr(seriesX, seriesY,”pearson”);生成spearman相关系数://输入的seriesX,seriesY是两组JavaRDD类型的数据,代表两个不同的变量//输出的类型是doubleStatistics.corr(seriesX, seriesY,”spearman”);生成pearson相关系数矩阵和spearman相关系数矩阵://输入的类型为RDDStatistics.corr(data,”pearson”);Statistics.corr(data,” spearman”);

    2.2 假设检验

    做适配度检定和独立性检定时,需要输入的参数关型不同,适配度检定要求输入的是 Vector.独立性检定要求输入的是Matrix。调用的API是 Statistics.chiSqTest();

    配度检定:这里依旧引用上例,新生婴儿的性别是否符合母体规律,(样本为2018年100名新生妥儿的性别做了统计,男孩56个,女孩44个)

    Vector v = Vectors.dense(new double[]{56,44});ChiSqTestResult result = Statistics.chiSqTest(v);

    独立性检定

    原始数据表达:

    2908a15c7654097f1d574080ffd83fa0.png

    //这里要注意矩阵是按列优先填充的,故数据要以列的形式写入

    Matrix matrix = Matrixs.dense(2,2,new double[]{43.0,9.0,44.0,4.0});Statistics.chiSqTest(matrix);

    3、 Spark中的实践应用

    3.1 相关系数的应用

    原始文件内容:(文件名为: correlations txt,存放在 src/main/resources),第一列是凝血酶浓度(单位升),第二列是凝血时间(秒),下面探究这两者之间的相性如何?

    1.1 14

    1.2 13

    1.0 15

    0.9 15

    1.2 13

    1.1 14

    0.9 16

    0.9 15

    1.0 14

    0.9 16

    1.1 15

    0.9 16

    1.0 15

    1.1 14

    0.8 17

    相关系数代码实现:

    Sparkconf conf = new SparkConf().setMaster("local").setAppName("Correlations");JavasparkContext jsc = new JavaSparkContext(conf);JavaRDD lines = jsc.textFile("src/main/resources/correlations.txt");//将源文件读取进来的第一列作为第一个变量JavaRDD seriesX =lines.map(x ->x split(" ")).map(x->Double.parseDouble(x[0]));//将源文件读取进来的第二列作为第二个变量JavaRDD seriesY =lines.map(x ->x split(" ")).map(x->Double.parseDouble(x[1]));//调用Statistics包下的corr()即可得到皮尔逊相关系数double corr = Statistics.corr(seriesX,seriesY,"pearson");//结果是-0.907,表名两个变量呈现负相关趋势,即一方增高一方降低System.out.println(corr);//获取斯皮尔相关系数double corr2 = Statistics.corr(seriesX,seriesY,"spearman");//结果是-0.894System.out.println(corr);

    相关系数矩代码实现:

    Sparkconf conf = new SparkConf().setMaster("local").setAppName("Correlations");JavasparkContext jsc = new JavaSparkContext(conf);JavaRDD lines = jsc.textFile("src/main/resources/correlations.txt");JavaRDD data =lines.map(x->x split(" ")).map(x ->Vectors. dense(Double. parseDouble(x[0]), Double. parseDouble(x[1])));//将JavaRDD转化为RDDRDD data2 = data.rdd();//调用Statistics包下的corr()得到皮尔逊相关系数矩阵Matrix corr = Statistics.corr(data2,"pearson");//结果是//1.0 -0.9069678578088085//-0.9069678578088085 1.0/获取斯皮尔曼相关系数矩阵Matrix corr = Statistics.corr(data2,"spearman");//结果是://1.0 -0.8942857152857139// -0.8942857152857139 1.0

    3.2 假设检验的应用

    3.2.1 适合度检验

    背景:只要是质量合格的骰子掷出1~6的几率就应该是相同的,现在有一枚骰子掷出600次,统计出1~6的次数如下:90,85,123,91,86,125,判定该骰子是否有质

    原假设Ho:骰子没有问题

    显著性水平:a=0.05

    代码实现:(如果做适配度检验, Statistics. chiSqTest(v)需要输入的是一个向量)

    Sparkconf conf = new SparkConf().setMaster("local").setAppName("GoodnessOfFit");JavasparkContext jsc = new JavaSparkContext(conf);//做适配度检定是需要的参数是一个VectorVector v = Vectors. dense(new double[] {90, 85, 123, 91, 86, 125});ChiSqTestResult result = Statistics.chiSqTest(v);System.out.println(result);

    结果显示:

    Chi squared test summary:

    method: pearson

    degrees of freedom = 5

    statistic = 17.56

    pvalue=0.0035515235818343554

    每一个值的输出含义:

    method:使用的方法,用的是皮尔逊卡方检验法

    degrees of freedom:自由度,一般为样本个数减1

    statistic:检验统计量,一个用来决定是否可以拒绝原假设的证据,该值越大表示可以绝句原假设的理由越充分

    pValue:根据显著性检验方法得到的一个概率p值,该值<=0.05为显著,通常这个值小于等于0.05,便认为有充足理由可以拒绝原假设

    这里的pValue = 0.00355 <= 0.05,则拒绝原假设,说明该骰子有问题。

    3.2.2 独立性检定

    显著性水平:α = 0.05

    代码实现:(如果做独立性检验, Statistics. chiSqTest()需要输入的是一个矩阵)

    Matrix m = Matrixs.dense(2,2,new double[]{43.0,9.0,44.0,4.0});//做独立性检验时需要的参数为MatrixSystem.out.println(Statistics.chiSqTest(m));结果为:Chi squared test summary:method: pearsondegrees of freedom = 1statistic = 1.7774150400145103pvalue=0.1824670652605519里 pvalue=0.182>0.05,表明可以接受原假设,即说明性别和惯用左右手没有关系。
    c5e6ae4d1fc6c1b333dfcc850c6535c5.png
    展开全文
  • 1.1 相关系数相关系数是反映两变量间线性相关关系的統计指标,是一种反映变量之间相关关系密切程度的统计指标,在现实中一般用于对于两组数据的拟合和相似程度进行定量化分析,第用的般是皮尔逊相关系数( pearson),...
  • 回归:预测数值型变量 分类:预测样本所属类别 聚类:在未知样本类别的情况下,根据样本之间的相似性把样本分成不同的类别 适用:用于股价、房价、空气质量等数值型变量的预测 数学模型:分析两组变量之间的关系 x:...
  • AB测试是为Web或App界面或流程制作两个(A/B)版本,在同一时间维度,分别让组成成分相同(相似访客群组(目标人群)随机访问这些版本,收集各群组用户体验数据和业务数据,最后分析、评估出最好版本,正式...
  • 目录 现实问题思考 无监督学习(Unsupervised Learning) 特点、优点与应用 聚类分析(Cluster ... 寻找数据特征的相似性 定义:机器学习的一种方法,训练数据中不带标签,让机器自动寻找数据规律并完成任务。
  • 使用SPSS软件分析收集的数据,以检测两组之间显着差异。 结果:PLF和PLIF组在年龄(p = 0.57),性别(p = 0.73),临床表现(p = 1),所需固定水平(p = 1)方面表现出相似的术前特征。 ,术前VAS评分(p = ...
  • 29物探:地球物理勘探简称物探,它是以不同地质体具有不同物理性质为基础,利用物探仪器测出地下各种地质体对地球物理场所产生异常而得到物理数据,来寻找煤系、煤层,了解地质构造等。 30地质编录:把直接...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

两组数据的相似性分析