矩阵算法

2024-05-13

矩阵算法(通用10篇)

矩阵算法 篇1

引言

随着信息技术的不断发展, 网络信息安全已经成了人们非常关心的话题。加密技术不仅可以保证网络传输数据的保密性, 而且还可以实现认证。所以加密算法要能实现通信双方传输的信息不被第三者获知或者修改, 同时加密技术也间接地提供了认证功能, 因为只有通信的双方知道如何加密和解密对方的信息。

一、算法基础

本算法基于矩阵的逆矩阵的性质:A*B=C, C*D (B的逆矩阵) =A。通过密钥生成的n阶矩阵加密, 通过其逆矩阵解密。

矩阵乘法的运算规则:m*n阶矩阵乘n*j阶矩阵等于m*j阶矩阵。

二、算法步骤

步骤1:输入明文。可以为字母, 数字, 标点符号, 汉字, 输入后会将其存放在矩阵中, 若不能将m*n阶矩阵填满则在最后一行中补1将其变为m*n阶矩阵;

步骤2:输入密钥。密钥可以由代码生成, 也可以为字母或数字, 将其存放在方阵中, 若不能构成方阵则补1直到成为一个方阵。检查密钥矩阵所对应的行列式的值, 若其等于0则重新生成密钥矩阵;

步骤3:加密过程。将明文矩阵A与密文方阵B相乘得到密文矩阵C, 将密文矩阵转化成字符串, 遍历输出, 即得到密文;

步骤4:解密过程。利用递归的方式求出密钥矩阵所对应的伴随阵, 将其记录A;计算密钥矩阵对应的行列式的值, 将其计算出来b;计算出矩阵A/b, 记录为密钥矩阵对应的逆矩阵C。将密文矩阵左乘C, 得到矩阵M, 将M减去矩阵尾部加的1即可得到明文。

三、算法流程

密钥矩阵必须为方阵 (即n×n阶) , 因为只有方阵对应的行列式才能求值, 并且其对应行列式的值不能为0, 若为0则代表其无逆阵, 即经其加密后无法通过求密钥矩阵的逆阵解密, 这种加密也就不可逆了, 如果你想埋藏自己的秘密, 也许是个不错的选择。

根据矩阵的运算性质, 两个相同的矩阵左乘与右乘结果不同, 在此算法中采用的是密文矩阵左乘C得到明文M。另外, 从解密的流程图可以看出, 如果不知道密钥矩阵很难算出明文的。

四、算法实现

实现算法的开发环境为my Exapilise, 开发语言为java, 内部函数及接口包括:求一个矩阵的伴随矩阵的函数;两矩阵相乘的函数;求转置矩阵的函数;逆矩阵的函数;字符串放入矩阵中的函数。

输入的明文可以为字母、数字、文字或者符号, 密钥可以是字母、数字或者字母和数字的组合。明文, 密钥的长度和数值都可以自行改变, 本文中都以3×3阶密钥矩阵为例。密钥并非一定要输入9位, 可以是其他位数, 程序内部方法都是以常数3为参数传值。

当明文长度较长, 密钥长度超过9位时, 加密效果如图3所示:

明文越长, 形成的明文矩阵的行数越多, 但列数要跟密钥矩阵的阶数一致, 因为只有这样才可以做乘法, 但这并不意味着对明文的长度有限制, 因为明文的行数可以改变, 也可以在形成的矩阵尾部补1。明文矩阵的行数越多, 与密钥矩阵相乘的过程越复杂, 形成的密文矩阵也就更加难以破解。

当明文长度较短, 密钥长度不足9位时, 仍然可以正常加密, 效果如图4所示:

五、结束语

该算法还可以进一步扩展, 若A可逆, 数a不等于0, 则a*A可逆, 且 (a A) 的逆矩阵= (1/a) *A的逆矩阵。因为a可以为小数, 可以通过找到某个矩阵A与其逆矩阵B, 通过a变换生成私钥和公钥进行加密。

参考文献

[1]王雅庆, 周尚波.基于分数阶变换的数字图像加密算法研究[J].计算机应用研究, 2011 (07) :2738-2741.

[2]曹美君, 张宏.混沌理论在数据加密巾的应用[J].信息技术.2009 (06) :169-171.

[3]Subramanyam A.v., Emmanuel S., Kankanhalli, M.S..Robust Watermarking of Compressed and Encryped JPEG2000 Images[J].Multimedia IEEE Transactions on.2012, 703 (14) :1520-9210.

[4]戴琳琳.基于矩阵变换的图像加密算法研究[D], 2013 (6) .

[5]石井, 吴哲, 谭璐, 王昊鹏, 王娜.RSA数据加密算法的分析与改进[J].济南大学学报 (自然科学版) , 2013 (03) .

[6]任勇金.基于混沌系统的图像加密算法研究[J].数字技术与应用, 2012 (06)

矩阵算法 篇2

一组特征矩阵联合对角化算法的收敛性分析

先将一组特征矩阵联合对角化问题转化为一种代价函数的优化问题,再利用梯度下降方法求解代价函数的最优点.研究了一类代价函数的`一些基本性质和各种等价形式,分析了一组特征矩阵联合对角化算法的收敛性.分析结果表明一组特征矩阵联合对角化算法是一种不动点算法;在特征矩阵无误差情况下,这个算法单步迭代就收敛到理论解.

作 者:张海琴 于力 作者单位:西安电子科技大学,理学院,陕西,西安,710071刊 名:西安电子科技大学学报(自然科学版) ISTIC EI PKU英文刊名:JOURNAL OF XIDIAN UNIVERSITY年,卷(期):29(6)分类号:O211.2关键词:收敛性分析 特征矩阵 联合对角化 双正交性 代价函数

矩阵算法 篇3

关键词:粗糙集;图像分割;最大类间方差法;病害识别;黄瓜叶片病斑

中图分类号: TP391.41文献标志码: A文章编号:1002-1302(2015)01-0387-03

收稿日期:2014-03-19

基金项目:河南省郑州市科技攻关(编号:131PPTGG426);安徽省自然科学基金(编号:1208085MF94、1208085MF98);河南省科技攻关(编号:142102310518);河南省教育厅科学技术研究重点项目(编号:14B520064)。

通信作者:张会敏(1981—),女,河南漯河人,讲师,研究方向为计算机应用技术。E-mail:zhangshanwen1965@163.com。作物病害严重影响我国农业生产的产量和质量。及时、快速地发现并识别农作物病害对正确地采取相应措施防治病害、减少病害带来的损失具有重要意义。但由于实际病害叶片的形状、纹理和颜色多种多样,使得从叶片图像中提取的病害分类特征也各种各样,各种特征对病害识别的贡献不同,因此需要进行特征选择[1]。粗糙集(rough sets,RS)是一种经典的特征选择方法,能够直接从给定问题的描述集出发,通过不可分辨关系和等价关系类给出问题的近似域,从而得到该问题的内在规律。多年来,RS已被成功应用于人工智能、模式识别、智能控制、机器学习、信息处理、数据挖掘、医疗诊断、专家系统以及决策分析等领域[2-3]。属性约简是RS的一个重要应用[4],基于RS的属性约简是在保持信息系统分类或决策能力不变的前提下,通过对知识的化简,导出分类问题的分类规则和决策。基于区分矩阵的属性约简策略是建立在两两互异目标上属性集合的区分矩阵[5]。区分矩阵的元素代表能够区分2个目标的属性组合。实际应用中可以将区分矩阵中出现次数多少作为属性重要性的判断依据,即出现次数越多的属性的重要性越大。本试验在研究作物病害叶片图像分割的基础上,将基于区分矩阵的属性约简策略应用于病害叶片图像分类特征选择中,提出了一种有效的作物病害识别方法。

1作物病害叶片图像特征提取

作物病害叶片病斑图像分割是病害识别的一个重要步骤。最大类间方差(Otsu)阈值法因其分割精度高、适用范围广而成为广泛采用的一种图像阈值分割方法[6],其原理是:将病害叶片图像像素分为病斑和正常2类,再通过计算划分出2类病害的类间方差值,若类间方差值小于某一给定值,合并初始划分的2类。然后计算此时所有类的类间方差值和分离因素的F值,若F值大于某个给定值,则退出该算法;否则,就按顺序在已存在的类中继续对图像分割。最后得到叶片病斑图像。

由于实际得到的病害叶片图像为RGB模式,该色彩模式对光照比较敏感,而HIS色彩模式能够克服采集过程中光照对病害识别率的影响,因此在作物病害识别中须要将RGB转换成HIS,HIS颜色模型反映了人的视觉对色彩的感觉[7-8]。由RGB转换HIS的公式如下:

I=(R+G+B)/3

S=1-3(R+G+B)[min(R,G,B)]

H=θG≥B

θ-2πG

式中:θ=arccos[(R-G)+R-B]/2(R-G)2+(R-B)(G-B)。

在本试验中,利用Matlab中的Imread函数分别提取彩色叶片图像中R、G、B 3个通道的图像,再利用式(1)将其转换为H、I、S模式。然后,采用Otsu阈值法分别将H、I、S图像转换为二值化图像,以提取叶片病斑区域。不妨将得到的病斑二值化图像仍记为H、I、S。

为了得到能区分作物病害的颜色特征值,分别计算病害叶片图像R、G、B分量和分割后的病斑图像的H、I、S分量的均值、方差、偏度、峰值、能量、熵,共6×6=36个统计特征参数[9]。计算公式如下:

p(b)=h(b)/s

b=∑b=1bp(b)

bk=1/δ3∑(b-b)3p(b)

δ2=∑b=1(b-b)2p(b)

bF=1/δ4∑b=1(b-b)4p(b)-3

bN=∑b=1[p(b)]2

bE=∑b=1p(b)lg[p(b)]。(2)

式中,p(b)为灰度级,h(b)为直方图,s为图像的面积,b为灰度均值,b为b的均值、bk为偏度,bF为峰值,bN为能量,bE为熵。

若直接把提取的36个病害图像特征参数用于构建病害识别模型,则识别效果的稳定性较差,因为各个特征对识别结果的贡献不同,有些特征甚至会影响识别结果。因此,须要对得到的特征进行选择。笔者使用基于区分矩阵的属性约简方法对得到的36个特征进行选择。

2基于区分矩阵的属性约简方法

基于区分矩阵的属性约简方法基本思想:将属性在区分矩阵中出现的次数作为目标属性的重要性判断函数。计算各属性的重要性判断函数f,由此可以确定第1个重要属性,此时重要属性的判断函数f值最大。在第1个重要属性简单求出后,进一步快速简单地求出后续的重要属性。设决策表S的核值集合为Core,其属性约简过程如下:

输入S的属性约简矩阵RM;输出S的属性约简Redu;

(1)初始化,令Redu=Core,H=;

nlc202309011120

(2)令Q={RM(aj)|aj∈Redu或AFI(aj)=0},则RM=RM-Q,B=A-Redu-H;

(3)对aj∈B,计算f(aj)=Max{ak},(k=1,2,…,m),其中f(x)为属性重要性判断函数;

(4)Redu←Redu∪{aj};

(5)对每个aj∈B,令H2(aj)∩RM(ak),H3(aj)=|H2(aj)|;

(6)对所有aj∈B,令RM(aj)←RM(aj)-H2(aj),f(aj)←f(aj)-H3(aj);若f(ak)=0,则H1=∪{ak};

(7)重复步骤(2)~(6),直到判断函数AFI为零向量;

(8)输出Redu 。Redu为信息表的一个属性约简。

3基于病害叶片的作物病害识别方法

由以上分析可得作物病害识别步骤如下:

(1)将采集到的每幅病害叶片图像转换为HIS模式;

(2)采用Otsu阈值法分别将叶片图像的H、I、S分量进行病斑分割,再转换为二值化图像,不妨还记为H、I、S;

(3)利用式(2)分别提取H、I、S的36个分类特征,得到一个特征向量,然后生成包括条件属性集合和结论属性集合的满足粗糙集数据处理要求的二维关系规则表;

(4)将关系表中的每类特征属性进行归一化和离散化处理;

(5)利用基于区分矩阵的属性约简方法对关系表进行属性约简,依次消去可省略的属性(列)和合并重复的对象(行),再对每一个对象进行简化,消去冗余的属性值;

(6)根据一定的评选准则选取有效识别规则的属性简化表,最终获得优选的最简单判定规则;

(7)利用最近邻分类器对植物病害进行识别。该分类器的基本思路是计算待测试样本与训练样本之间的欧式距离的最小值,由此确定待识别测试样本的类别。

4结果与分析

为了验证本研究提出的作物病害识别方法,采集温室黄瓜常见的细菌性角斑病、黄瓜炭疽病和黄瓜褐斑病的病害叶片各100幅,其中50幅图像作为训练集,其余50幅作为测试集。本研究所使用的病害样本图像均是在陕西杨凌农业示范区科学园黄瓜温室采集得到的,黄瓜品种为中农26号。以白色为背景色,在自然光照的非强光条件下对自然发病的黄瓜叶片进行图像采集得到黄瓜病害叶片图像。以Matlab 7.X软件中自带的图像处理工具箱为图像处理和分析平台,计算以上特征参数,数据统计分析采用常用统计分析SAS软件。

采用Otsu阈值法分别将病害叶片进行病斑分割,分割定位待识别的黄瓜叶片病害部分病斑,利用式(2)提取病害叶片病斑的36个分类特征。图1为3种黄瓜病害叶片图像及对应的分割病斑图像的H分量。

首先将得到的36个特征进行离散化,即把每个特征划分成有限个区域,本试验中取5个区域,使得每个区域中对象的决策值相同。然后利用基于区分矩阵的属性约简方法对这36个特征进行属性约简,得到6个重要的属性,分别为病斑分量H的均值、方差、能量,病斑分量I的均值,病斑分量S的方差和能量。再将这6个属性组成一个特征向量来表示这个样本。最后利用最近邻分类器对病害种类进行分类,结果见表1。为了说明本研究所提出方法的有效性,表1中给出了基于全部36个特征和基于其他2种方法[10-11]的识别结果。由表1看出,本研究提出的方法的识别率最高,对黄瓜褐斑病的识别率高达94.26%,表明该方法用于黄瓜叶部病害图像识别是有效可行的。

表1不同黄瓜病害识别方法的识别结果

方法识别率(%)36个特征识别法78.59文献[10]82.88文献[11]90.35本研究所提出的方法94.26

叶片图像采集和识别试验结果显示:(1)病害识别中并非特征越多越好,应对识别特征进行优化组合或特征选择;(2)即使同一病害样本在不同成像环境下拍摄,图像特征向量也会存在一定差异;(3)不同黄瓜品种、不同发病时期的病症表现差异较大。这些差异应与识别效果相结合,可以通过制定图像的采集规范予以解决。

5结论

本研究利用最大类间方差法分割黄瓜病斑图像,再提取病斑图像的36个特征,然后利用粗糙集对36个特征进行属性约简,得到6个重要特征,最后利用最近邻分类器对病害进行分类。该方法提取病斑具有操作简单、分割效果好的特点。本试验结果表明该方法是有效可行的。由于病害叶片拍摄状态和光照等环境因素对颜色特征存在影响,发病程度及病斑的典型性也可能对识别准确率有影响,这些因素对拍摄照片中颜色特征的定量关系有待进一步研究。对于某些颜色、形状特征非常相似的其他黄瓜病症,还应进一步提取病斑的颜色、形状和纹理等特征,综合考虑决定黄瓜病害症状的物理特征,以实现对病害的有效识别。

参考文献:

[1]李旺,唐少先. 基于图像处理的农作物病害识别研究现状[J]. 湖南农机,2012,39(1):176-178.

[2]Qian Y H,Liang J Y,Pedrycz W,et al. An efficient accelerator for attribute reduction from incomplete data in rough set framework[J]. Pattern Recognition,2011,44(8):1658-1670.

[3]胡可云,陆玉昌,石纯一. 粗糙集理论及其应用进展[J]. 清华大学学报:自然科学版,2001,41(1):64-68.

[4]樊持杰,陈丽敏,夏春艳. 基于RS的属性约简算法[J]. 微计算机信息,2010,26(2):222-223.

[5]李智玲,胡彧. 一种改进的区分矩阵属性约简算法[J]. 计算机系统应用,2008,17(10):51-55.

[6]王祥科,郑志强. Otsu多阈值快速分割算法及其在彩色图像中的应用[J]. 计算机应用,2006,26(增刊1):14-15.

[7]虎晓红,李炳军,席磊. 基于多示例图的小麦叶部病害分割方法[J]. 农业工程学报,2012,28(13):154-159.

[8]Tushar H J, Ravindra D B, Prashant G P. Crop disease detection using image segmentation[J]. World Journal of Science and Technology,2012,2(4): 190-194.

[9]Revathi P,Revathi R. Knowledge discovery in diagnose of crop diseases using machine learning techniques[J]. International Journal of Engineering Science and Technology,2011,3(9): 7187-7190.

[10]岑喆鑫,李宝聚,石延霞,等. 基于彩色图像颜色统计特征的黄瓜炭疽病和褐斑病的识别研究[J]. 园艺学报,2007,34(6):1425-1430.

[11]贾建楠,吉海彦. 基于病斑形状和神经网络的黄瓜病害识别[J]. 农业工程学报,2013,29(增刊1):115-121.于翰林,卢泽民,朱咏莉. 基于嵌入式Web服务器的pH值检测系统的设计[J]. 江苏农业科学,2015,43(1):390-393.

基于特征矩阵的高效数字识别算法 篇4

关键词:特征矩阵,数字识别,图像处理,识别率

0引言

数字识别技术是图像处理领域中的一个研究热点, 在食品、化妆品、药品等外包装生产日期提取上具有重要的实用价值。近年来, 随着人们对数字图像识别算法的不断研究, 数字图像识别方法也越来越多, 主要有基于神经网络数字图像识别[1]、基于最小距离法的数字图像识别, 以及基于模板匹配的数字图像识别[2]。在实际应用中, 人们发现数字识别算法的识别率一般较低, 个别识别率较高的算法比较复杂, 且收敛速度普遍较慢, 缺少两方面性能皆优的方法。针对目前存在的问题, 结合印刷体数字的特点, 笔者提出了一种基于特征矩阵的高效数字图像识别算法。该算法首先在预处理的基础上提取字符的特征矩阵, 利用特征矩阵对简单的特征[3-4] (横线) 进行提取, 然后应用结构语句识别方法将数字中的多数识别出来。再采用排除法缩小识别数字的范围, 并对其中的数字特征凹陷区域进行分析和比较, 同时采用上述同样的方法对数字进行识别使算法简单, 识别速度快且识别效果好。

1数字图像预处理

图像预处理是对采集到的图像画面在进行数字识别之前所做的一些相关工作, 主要包括图像灰度化、二值化、 梯度锐化、中值滤波、分割、归一化、细化等步骤, 具体流程如图1所示。对图像进行预处理非常必要, 它能够有效地去除图像噪声, 减小各类干扰对图像识别的不利影响, 为特征提取和识别奠定了基础。图像预处理的每一步结果如图2-图9所示。

2数字识别算法

经过细化之后, 通过从上到下, 从左到右对图像进行扫描, 提取字符的特征矩阵。由于细化后矩阵的边界可能存在全为0的行或列, 为了便于后续特征提取, 需要将其全为0的行列全部删除, 得到类似如图10所示的矩阵, 记为juzhen[m][n]。设前景像素为1, 背景像素为0。

对0~9这10个印刷体数字, 首先可以根据是否存在横线将数字分为两个子集, 其中1、2、4、5、7存在横线记H =1。0、3、6、8、9不存在横线记H=0。在H=1的集合中, 因为横线存在的位置不同, 可以将其再分为3个子集: 1、2存在下横线;5、7存在上横线;4横线位置记为其它。 这样数字识别的范围又进一步缩小了, 接下来可以在小范围内进行特征比较来实现数字的识别。如5、7特征比较发现, 5上半部分存在左凹陷区, 下半部分存在右凹陷区。 对于凹陷区域的识别可以依据矩阵在凹陷区域内像素值为0, 限定区域范围统计0的行数即可, 该区域范围仅针对每个特定数字而言, 这样5就可以识别出来, 运用排除法7自然而然也被识别出来。1、2特征比较发现, 1存在竖线, 2没有这个特征, 4不需进行特征比较即可得出结果, 为了使识别结果更加准确, 可以加上竖线这个特征。 在H=0的集合中, 0的结构较简单, 特征也较明显, 把它作为一个集合来对待。它是一个封闭的圆圈, 圆圈内没有像素则通过矩阵在一个较大区域内像素1的个数小于阈值的范围来提取。3、8、6、9作为另一个集合, 特征比较发现, 3上、下两部都存在右凹陷区, 6上半部分存在左凹陷区, 9下半部分存在右凹陷, 除此之外就是8。这10个数字中的1较特殊, 有的字体底部没有横线, 有的底部存在横线, 所以除了上述判断还要考虑没有横线的情况。数字识别流程如图11所示, 其中上半部分左凹陷区域记为上左, 上半部分右凹陷区记为上右, 下半部分右凹陷区域记为下右, 下半部分左凹陷区域记为下左。识别顺序按照从上到下、从左到右进行。对于易识别错误的字符进行了多处特征比较, 如字符3、5等。数字特征提取条件如表1所示, 特征的提取需要用到以下自定义函数:

H (juzhen[m][n], int r, int m, int s, int n) ;//横线的提取, 统计每一行像素值为1的长度是否为列的3m/4, 存在H=1, 不存在则H=0。

L (juzhen[m][n], int r, int m, int s, int n) ;//竖线的提取, 统计每一列像素值为1的长度是否为列的3n/4, 存在L=1, 不存在则L=0。

Q (juzhen[m][n], int r, int m, int s, int n) ;//圆圈的的提取, 某一区域内像素值为1的点的个数。

S (juzhen[m][n], int r, int m, int s, int n) ;//凹陷区域的提取, 某一区域内像素全为0的行数。

其中, juzhen[m][n]为字符的特征矩阵, r, m分别为矩阵行的起始、结束位置, s, n分别为矩阵列的起始、结束位置。

3实验结果与分析

在上述数字图像预处理基础上, 利用上述识别算法对图像进行数字识别, 结果保存在文本文件中, 图像识别的结果如图12所示。

为了检验本文的算法对数字识别的效果, 对0~9这10个印刷体数字包括不同字体在内的单个字符各100幅图像进行识别测试, 测试硬件环境为AMD Athlon 1.91 GHz、内存2GB, 采用C语言, 并结合数字图像处理和计算机软件平台OpenCV, 在VC6.0集成开发环境中实现以上算法编程。单个字符可在6ms内完成整个识别过程, 实验结果如表2所示。识别率等于99% 的0、1两个数字本身结构比较简单, 容易识别;识别率在98%的有3、5、6、 9这4个数字, 只要能够限制准确数字凹陷区的起始行、 起始列、结束行和结束列, 数字识别率还可以提高;图像数字2、8的识别率分别建立在3、5和6、9的识别率的基础之上, 所以数字2、8的识别率比3、5和6、9的识别率要低一些;数字图像4、7在细化后容易对字符造成损害, 再加上特征提取的条件较为简单, 因此, 很容易识别为1和8。

4结语

本文提出了一种基于特征矩阵的高效数字识别算法, 并对从0~9的每个数字字符图像进行了测试。结果表明, 该算法的思路简单、速度快, 且识别率达97% 以上。 通过分析发现, 使用该方法发生误判时, 错误源可能来自于图像的不规范, 比如图像本身的不完整、预处理技术的缺陷, 以及特征选取的局限性。

参考文献

[1]张翼成, 陈欣, 杨红军, 等.基于组合特征的BP神经网络数字识别方法[J].计算机系统应用, 2013, 22 (3) :113-116.

[2]陈爱斌, 陆丽娜.基于多特征的印刷体数字识别[J].计算技术与自动化, 2011, 30 (3) :105-108.

[3]陈军胜.组合结构特征的自由手写体数字识别算法研究[J].计算机工程与应用, 2013, 49 (5) :179-184.

矩阵算法 篇5

学生宿舍的合理分配涉及学生高考入学成绩、生源地等诸多约束条件, 在充分分析现行学生宿舍分配问题的基础上, 对学生宿舍的合理分配问题进行了研究, 提出了解决这类问题的一种新方法--基于矩阵存储的回溯算法. 在对该算法的.时间复杂度进行分析的基础上, 得出了该算法较同类问题的回溯法具有更好的时间效率, 在多约束分配问题中更具合理性和有效性.

作 者:王文发 马燕 李宏达 WANG Wen-fa MA Yan LI Hong-da 作者单位:王文发,马燕,WANG Wen-fa,MA Yan(延安大学计算机学院,延安,716000;延安大学软件研究与开发中心,延安,716000)

李宏达,LI Hong-da(中国科学院软件研究所信息安全国家重点实验室,北京,100080)

矩阵算法 篇6

关联规则挖掘是由Rakesh Agrawal等人于1993年提出的[1], 是在数据集中找出满足用户设定的最小支持度和最小置信度的关联规则。关联规则挖掘通常分为两步: (1) 从事务数据库中找出所有频繁项集; (2) 从频繁项集中得到所有符合条件的关联规则。其中第 (1) 步频繁项集的产生是关联规则挖掘问题的核心, 其效率高低决定关联规则挖掘的总体性能。产生频繁项集的算法很多, 其中最具影响力的Apriori算法, 采用逐层迭代从大量候选项集中产生频繁项集。Apri ori算法实现时需要多次扫描数据库, 产生大量候选项集。本文提出一种利用模式矩阵的优化算法EP_Apriori。

2、基本概念

Apriori算法首先扫描事务数据库T中找出1-项频繁集, 记为L1, 然后利用 (k-1) -项频繁集Lk-1来找出k-项频繁集的集合Lk, 直到不能找到频繁项集为止。其中核心的步骤分三步[2]:

(1) 连接 (self-joining) :通过Lk-1连接产生k-项候选集合C k。

(2) 剪枝 (pruning) :第 (1) 步中Ck包含有大量的候选项集, 为了减少支持度的计算量, 要对Ck进行剪枝。依据的原理是频繁集的非空子集一定是频繁的, 如果一个k-项候选集的任意个 (k-1) -项子集不在Lk-1中, 则该候选集不可能是频繁的, 可以从Ck中删除。

(3) 计算:扫描事务数据库T, 统计Ck中每个项集的支持度计数, 根据用户设定的最小支持度阈值确定k-项频繁集Lk。

3、EP_Apriori算法

3.1 EP_Apriori算法基本思想

Apriori算法存在以下2点不足: (1) 经过连接和剪枝后仍然会产生海量的候选项集; (2) 需要多次扫描事务数据库, 每计算一次频繁集需要对所有事务进行扫描。文献[3]介绍的P_Matrix算法通过一次扫描数据库产生模式矩阵, 通过对矩阵的按位与运算直接产生频繁项集, 减少了扫描事务数据库的次数, 避免了海量候选项集的产生。但是该算法在产生k-项 (k≥3) 频繁集时需要重新建立模式矩阵, 还需要用并集运算去掉重复项, 时间消耗较多。EP_Apriori算法只建立一次模式矩阵, 保留每次向量的与操作结果, 在 (k-1) -项频繁集的基础上直接k-计算项频繁集, 减少了剪枝步骤, 避免了大量候选项集的产生。

3.2 EP_Apriori算法设计

4、结语

与传统Apriori算法相比, EP_Apriori算法利用模式矩阵只需要一次扫描数据库, 通过1-项频繁集矩阵和 (k-1) -项频繁集矩阵直接产生k-项频繁项集, 节省了候选项集占用的内存空间, 减少对数据库的扫描, 大大提高了频繁项集的产生速度。

摘要:本文利用模式矩阵对传统Apriori算法进行优化, 提出了一种新的优化算法EPApriori。该算法仅扫描数据库一次, 建立模式矩阵, 将k?项频繁集的产生简化为1-项频繁集矩阵和 (k?1) ?项频繁集矩阵行向量的逻辑与操作, 避免了大量候选项集的产生。该算法在时间复杂度和空间复杂度上均优于Apriori算法。

关键词:关联规则,Apriori算法,模式矩阵

参考文献

[1]戴新喜, 白似雪.一种高效的基于模式矩阵的Apriori改进算法[J].广西师范大学学报, 2007, 25 (4) :176-178.

基于矩阵算法的配电网故障定位 篇7

实现配电网故障点的准确定位,快速隔离可以减小故障后的停电面积,缩短停电时间,提高供电质量。目前,实现配电网故障定位和隔离的算法主要有两类:一类是基于矩阵运算的故障定位矩阵算法;另一类是人工智能型故障定位算法。以人工智能为基础的遗传算法、神经网络和模式识别算法等,由于计算时间长,很难满足在线实时处理的要求,在实际中较少应用。文献[1]提出的基于FTU的配电网故障定位算法提出了单电源单故障定位的判断方法,未考虑多电源闭环运行情况。文献[2]能够实现树形网与开环运行的故障定位,不需要进行矩阵的乘法计算,运算量小,节约时间,但是不适用于多电源、多故障点的情况。文献[3]对故障矩阵进行了重新定义且对每个电源都假定了一个正方向,适用于多电源,多故障点的情况,但是采用的矩阵乘法与规格化处理,运算量大。文献[4]适用于多电源供电情况下的单点故障情况,但忽略了馈线末端故障的判断。

现实中,配电网通常闭环网络开环运行,即多电源供电联络开关断开的环网也存在单电源供电辐射网。基于这种现状,本文提出一种适用于多电源并列运行开环网络与辐射形网络的新型配电网故障判定矩阵算法,避免矩阵相乘或复杂规格化处理。

1算法原理分析

1.1网络关联矩阵的形成

将馈线上的断路器、分段开关和联络开关当作节点进行统一编号。三电源并列供电开环运行网络如图1所示。当单电源供电时,潮流方向为单一流向,无需指定正方向。当多电源并列供电时,取由各电源正常供电时潮流方向为正方向。以联络开关为分界点,将配电网进行区域划分,即每个电源到分界点之间为一个供电区域。根据节点有向连接关系构造网络关联矩阵。假设网络中共有N个节点,则可以构造一个N阶方阵组成的网络关联矩阵D。若节点i与节点j之间存在一条支路,则Dij=1;若节点之间没有关联或者方向与选取的潮流方向不同时,则Dij=0,即

undefined

图1中电源A对应区域的网络描述矩阵为

undefined

同理,电源B和电源C对应区域的网络关联矩阵分别为

undefined

整个网络的关联矩阵的表示是将所有区域的网络关联矩阵置于对角线上,其它元素置0,即

undefined

,上图的网络联系矩阵则为

undefined

1.2故障判定矩阵的形成

根据馈线的最大负荷,对各个FTU进行整定。当馈线发生故障时,故障电流流过各开关上的FTU,该FTU即将此故障电流记录下来并上报给主站。通过修改流过故障电流的开关对应节点在网络关联矩阵中的元素,可以形成故障判定矩阵。具体原则如下:若节点i流过故障电流,则Dij=1,Dij(j≠i)即第i列元素保持不变,表示从其它节点到节点i有故障电流经过,在矩阵中保留它们的关联指向;若节点i无故障电流流过,Dij=0且Dij(j≠i)即第i列元素全部置0,表示没有从其它节点流向节点i的故障电流,其它节点与节点i的关联指向或者被故障点隔断。图1中流过故障电流的开关有1A、2A、1B、2B、4B、1C,因此其故障判定矩阵可以列写为

undefined

1.3故障点判定原理

由故障判定矩阵P可简单判断出故障点前端节点,若Pii=1,Pij=0(j≠i),则可判定节点i为故障点前端的节点。但是不能确定故障为节点之间的馈线故障还是末端馈线的故障。若节点j无故障电流流过,则对故障判定矩阵P的处理,要忽略其它节点指向j的联系,需要原来的网络关联矩阵D来辅助判定,判定原则:末端馈线的故障Pii=1,Dij=0,即节点i流过故障电流,但节点i在网络中不流向任何节点,说明节点i为末端馈线上端的节点;节点间馈线的故障Pii=1,Dij=1且Pij≠1,即节点i流过故障电流,节点i到节点j之间存在一条正向馈线,节点j无故障电流流过,故障电流在馈线上“有进无出”,故障点在节点i与节点j之间。

对于图1所示的情况,根据网络关联矩阵和故障判定矩阵,由P22=1,D23=1,D24=1,可判定故障发生在节点2A、节点3A之间的馈线支路上。同理可以判断节点4B、5B和8B之间的支路与节点1C和2C之间的支路也有故障发生。

2算法的实现

2.1算法流程

算法实现的编程语言采用的是面向对象的可视化编程语言VC++语言,它具有结构严谨、编译速度快和运行效率高等特点。将程序划分为若干个独立的功能模块,尽可能减少各功能模块之间的影响。故障定位程序由以下几个部分组成:配电网拓扑信息的获取,用来形成网络关联矩阵;FTU上传的故障信息获取,与网络关联矩阵结合形成故障判定矩阵;故障结果输出,将算法判定的故障区域告知工作人员。算法的故障判定矩阵的形成流程如图2所示。故障定位的算法流程如图3所示。程序最后形成的用户界面如图4所示。

2.2算法验证

以图1中配电网为例,对不同区域的故障通过程序进行了验证,图4为程序输出的用户界面。选取5种情况为例,包括末端馈线和节点间故障,故障定位算例测试结果如表1所示。

由表1可以看出,其数据证明了该矩阵定位算法的准确性。

3 结论

该算法以故障判定矩阵为核心,判定配电网故障区域,判据简单、编程易实现且不存在漏判现象,满足实时在线的快速故障判定需求。它可以对辐射形和开环运行环网形配电网任意区域多处故障进行准确定位。

摘要:分析了原有的配电网矩阵法故障定位中存在的问题,提出一种适用于辐射状网及开环运行环网的配电网故障定位算法。该算法仍以矩阵分析为核心,通过网络拓扑形成网络关联矩阵,然后结合馈线终端设备(FTU)上传的故障信息形成故障判定矩阵,判定方法简单。它不仅可以实现配电网单一故障的快速定位,而且对末端故障及多点故障也可以做出准确判断。通过编程实现算法,并用不同区域故障的模拟验证了算法的有效性。

关键词:配电网,馈线自动化,故障定位,故障判定矩阵

参考文献

[1]陈清川,王成楷,杨振中.一种基于网形结构矩阵的配电网故障定位改进算法研究[J].电气技术,2010(12):31-34,38.

[2]王飞,孙莹.配电网故障定位的改进矩阵算法[J].电力系统自动化,2003,27(24):45-46,49.

[3]卫志农,何桦,郑玉平.配电网故障定位的一种新算法[J].电力系统自动化,2001,25(14):48-50.

矩阵算法 篇8

以求解线性方程组的矩阵三角分解 (LU分解) 为代表的数值计算在现代科学研究和工程技术中得到广泛应用。当今的计算机在高速的CPU和低速的存储器之间设置了二级或更多级的高速缓冲存储器 (简称高缓, cache) , 高缓的存取速度很快, 但容量较小, 将计算机当前正在运算的数据或经常需要访问的数据置于高缓中, 让数据存取的速度适应CPU的处理速度, 从而提高计算机整体的运算效率。对于大型方程组, 其系数矩阵很大, 标准LU分解直接对大矩阵进行计算, 一次参与运算的数据量很大, 不能很好地利用当今计算机的高缓, 运算效率不高。本文对LU分解运用分块算法, 将大矩阵的运算分解成分块子矩阵的运算, 使各部分小的分块矩阵的数据运算能够更多地在高缓中进行, 同时采取矩阵转置、循环展开等优化技术, 对分块算法中各个模块的计算设计了较高效的算法, 提高了算法的总体运算速度。

1 LU分解分块算法

LU分解用于求解线形方程组Ax=b。从高斯消去法出发, 其系数矩阵A可分解为单位下三角阵L和上三角阵U之积:

或:

A=LU (2)

利用分解后的LU, 通过回代可方便地求出方程组的解。由矩阵乘法可推导出:

式 (3) 即为标准LU分解的计算公式, 整个数据计算在大矩阵A的范围内进行。

下面介绍LU分解分块算法。将矩阵A分解成2×2块, 方程A=LU可写成:

由矩阵乘法有:

A11=L11U11 (5)

A12=L11U12 (6)

A21=L21U11 (7)

A22=L21U12+L22U22 (8)

LU分解分块算法的步骤如下:

① 对式 (5) 中的分块矩阵A11进行LU分解, 可得L11、U11。

② 将①中得到的L11求逆, 并代入式 (6) , 有U12 = L11 -1A12 。

③ 将①中得到的U11求逆, 并代入式 (7) , 有L21 = A21 U11 -1。

④ 改写式 (8) , 设A′22=A22-L21U12, 则式 (8) 成为A′22=L22U22, 即为A′22的LU分解。

对A′22的LU分解可继续采用上述分块过程进行计算。这样, 只要每次选取适当的分块大小, 分块后的各子矩阵间的运算就有可能在高缓中进行, 从而提高运算速度。

2 LU分解分块算法的设计与实现

综上所述, LU分解分块算法的实现涉及六个模块的计算, 分别是分块矩阵的LU分解、单位下三角阵求逆、上三角阵求逆、单位下三角阵乘矩形阵、矩形阵乘上三角阵和矩形阵乘矩形阵。

2.1 分块矩阵LU分解

分块矩阵 (A11) 的LU分解计算采用式 (3) 所示的标准LU分解公式。与标准LU分解算法不同之处在于: (1) 形参的个数不同。对于分块分解, 需提供分块矩阵入口地址p, 阶数d以及在原矩阵内的偏移量displace和原矩阵的阶数n。 (2) 选主元的范围不同。标准LU分解是在大矩阵A的范围内选主元, 而块内LU分解是在分块矩阵的范围内选主元。

2.2 单位下三角阵求逆

可证明单位下三角阵的逆矩阵仍为单位下三角阵, 上三角阵的逆矩阵仍为上三角阵且对角线上的元素分别变为原来的倒数。

因为L11为单位下三角矩阵, 求逆后对角线上元素仍为1, 所以在计算时, 只需对对角线以下部分求逆。设单位下三角阵为L= (lij) d×d, 其逆矩阵为B= (bij) d×d。由矩阵乘法k=ji (lik×bij) =0 (j<i) , 有bij=-k=ji-1 (lik×bkj) (i=2, 3, , d; j=2, 3, …, i-1) , 对角线上元素为bii=lii=1。在该算法中可直接将算出的bij保存在原lij的位置上。

2.3 上三角阵求逆

设上三角矩阵为U= (uij) d×d, 其逆矩阵为C= (cij) d×d。同样有cii=1uiik=ij (uik×ckj) =0, 得到cij=-1uiik=i+1j (uik×ckj) (i=d, d-1, , 1; j=d, d-1, …, i+2) 。计算出的cij直接保存在原uij的位置上。

上面分别设计了针对单位下三角阵和上三角阵的求逆算法, 而没有采用常用的原地全选主元高斯约旦消元法, 这样做可以充分利用三角矩阵的特点, 避免无效的计算。且高斯约旦消元法对矩阵求逆时, 要多次全选主元, 进行很多次比较, 新设计的两个算法中不需要进行比较。

2.4 矩阵相乘

矩阵相乘是LU分解分块算法中的核心运算, 提高矩阵相乘的运算速度是提高整个分块算法效率的关键。本文采用了矩阵分块、矩阵转置和循环展开等方法来提高矩阵相乘的运算速度。

矩阵分块 将大矩阵逐次一分为二, 直到划分到分块矩阵小于指定的大小。把这些分块矩阵当作元素来处理, 分块矩阵内部用普通三重循环来计算。设两相乘矩阵为AB, 则过程如下所示:

(A11A12A21A22) (B11B12B21B22) = (A11B11+A12B21A11B12+A12B22A21B11+A22B21A21B12+A22B22)

测试表明, 采用矩阵分块相乘技术可使运算速度得到较大提高。但对矩阵相乘仅仅采用分块还不够, 有必要引入矩阵转置和循环展开技术。

矩阵转置 对于矩阵Am×pBp×n=Cm×n, 无论分不分块, 最终都要用三重循环实现。对C语言来说, 是采取按行存放元素, 最内层循环内AC是顺序存取, 而B是不连续的。当矩阵的阶数较大时, 访问B中上下相邻两个元素跨度很大, cache 内可能放不下, 访问时不能命中, 仍要访问内存。这样的访问会进行m次, 当m很大时, 会降低效率。所以将B转置, 在最内层循环中用A的一行乘B的一行, 这样ABC都是顺序存取, 提高了数据访问速度。

循环展开 循环展开可减少测试循环终止条件的次数, 它不仅可以减少循环的开销, 还可以在两个方面提高程序的性能。一是使程序利用多个执行部件并行计算, 充分发挥现代计算机多执行部件的特性。二是循环展开有助于重用装入寄存器中的数据, 降低了寄存器与cache以及cache 与内存之间对通信带宽的需求。展开多层循环的外层循环可以使一些变量得到重用。

下面介绍三处矩阵相乘的具体实现。

2.4.1 单位下三角阵乘矩形阵

计算U12 = L11-1A12 , 先将A12转置, 然后相乘, 结果保存于一临时矩阵T中。计算时需使用一大小为m的额外向量空间, 来保存A12转置后矩阵当前循环到的一行。乘运算从右边矩阵中的第一行开始, 逐行向下进行。采用循环展开技术, 第一层和第二层循环各展开1次。此时需要考虑两矩阵的行数为奇数的情况。当左边矩阵行数为奇数时, 计算结果存入右边矩阵的最后一列中;当右边矩阵行数为奇数时, 计算结果存入右边矩阵的最后一行中。

由于L11-1的对角线上元素全为1, 所以它们不需和T中的对应元素相乘, 可直接将这些元素作为最内层循环乘积项累加的变量初始值, 这样可减少m×n次乘操作。又L11-1为下三角阵, 只需将其对角线以下元素与T中对应元素相乘即可。

2.4.2 矩形阵乘上三角阵

在计算L21 = A21 U11-1时, 将结果保存在左边矩阵 (A21) 中, 使用一大小为n的额外向量空间来保存左边矩阵当前循环到的一行, 从左边矩阵的第一行开始, 逐行向下运算。计算时, 第一层和第二层各循环展开1次。同样要考虑两矩阵的行数或列数为奇数的情况。当左边矩阵行数为奇数时, 计算结果存入左边矩阵最后一行;右边矩阵列数为奇数时, 结果存入左边矩阵最后一列。

在该模块中, 矩形阵A21的列数大于等于上三角阵U1l的列数, 且U11对角线以下元素全为 0, 所以没有对其转置, 只需将三角阵对角线以上元素与左边矩形阵中对应元素相乘即可。

2.4.3 矩形阵乘矩形阵

A′22=A22-L21U12中, L21U12为两矩形阵相乘。计算时, 对L21进行分块, 将U12转置并分块。由2.4.1节中得到的结果T可直接作为L21所乘的对象, 并在做乘法时将所得的积取反, 相当于完成减运算, 这些操作有利于提高整个算法的效率。

L21、T分块时, 取m=n=d, 即分块矩阵为d阶方阵。这样一直分块下去, 直至L21最后所剩一块矩阵的行数为N%d+d, 列数为d;T最后所剩一块矩阵的行数为d, 列数为N%d+d, 其中N为原矩阵A的阶数。

分块子矩阵相乘时采用循环展开技术, 第一层和第二层循环各展开1次。此时由于参与计算的分块矩阵均为稠密型矩阵, 可直接展开不必象有三角阵参与那样考虑边界处的处理, 计算结果最终保存在L21分块对应的位置上。

3 测试与分析

3.1 测试结果与比较

两种算法在PC机上测试, CPU为Pentium 4, 主频2.8GHz, 内存512MB, 编译系统采用VC++6.0。在验证算法计算正确的基础上, 依次取矩阵的阶数为300~6000, 对两种算法进行运行和比较。对于分块算法, 取每次分块大小d=150。测得的算法运行时间如表1所示, 表中第四行为分块算法比标准算法效率提高的百分比。

表1 (续)

由表1可见, LU分解分块算法明显优于标准算法, 在大矩阵情况下, 运算速度提高50%以上。

3.2 测试结果分析

标准LU分解算法和LU分解分块算法中的运算时间主要用在乘操作和除操作上, 可分别计算出两种算法中乘操作和除操作的运算次数, 限于篇幅在此只给出结果, 作简要分析。

分块算法 (取每次分块大小为d) 的乘运算量约为n3/3+ (n%d-0.5) n2, 除运算量约为 (d+1) n/2。标准算法的乘运算量为n (2n-1) (n-1) /6, 除运算量为n (n-1) /2。当矩阵阶数n很大时, 两算法的乘运算量相差不大, 而分块算法除运算量比标准算法降低了一阶。计算机做除法最耗时, 且标准算法没能充分利用高缓。分块算法在较好地利用高缓的同时, 通过矩阵分块、矩阵转置和循环展开等技术加速了矩阵乘法的运算, 所以运算效率显著提高。

LU分解分块算法比标准LU分解算法多用约d×n的存储空间。

4 结束语

本文将分块算法引入LU分解, 并加以有效实现, 使算法的运算速度得到较大提高。由算法分析和测试可知, 在分块算法中, 两矩形阵相乘的用时最多, 约占总时间的70%。因此, 要想进一步提高运算速度, 必须提高两矩形阵相乘的效率。可以对矩阵相乘作并行处理, 事实上在LU分解分块算法中, 有些模块是可以并行计算的。再者就是研究出达到最佳运算效率时总阶数n与分块大小d之间、cache大小与d之间的关系。以上这些问题将是以后进一步研究的目标。

摘要:对稠密型线性方程组的系数矩阵进行分块LU分解, 更充分地利用高速缓存, 提高运算效率。对LU分解分块算法进行了研究, 用VC++6.0对分块算法进行实现, 并与标准的LU分解算法进行比较。在大矩阵情况下, 分块算法比标准算法运算速度提高50%以上。

关键词:LU分解,矩阵分块,矩阵快速相乘,VC++6.0

参考文献

[1]陈建平.LU分解递归算法的研究[J].计算机科学, 2004, 31 (6) :141-142.

[2]李玉成, 朱鹏.BLAS的加速方法与实现技术[J].数值计算与计算机应用, 1998, 19 (3) :227-240.

[3]李玉成.LAPACK中的分块算法及其效果[J].数值计算与计算机应用, 2001, 22 (3) :172-180.

[4]李忠泽, 陈瑾, 龙翔, 等.基于PentiumPro的高性能BLAS的设计与实现[J].北京航空航天大学学报, 1998, 24 (4) :454-457.

[5]王小牛, 冯百明.基于存储的矩阵乘积优化算法[J].西北师范大学学报, 2005, 41 (1) :22-24.

[6]刘萍.数值计算方法[M].2版.北京:人民邮电出版社, 2007:85-88.

[7]Elmroth E, Gustavson F, Jonsson I, et al.Recursive Blocked Algorithms and Hybrid Data Structures.SIAMReview, 2004, 46 (1) :3-45.

[8]Toledo S.Locality of Reference in LUDecomposition with partial pivo-ting[J].SIAM Journal of Matrix Analysis&Application, 1997, 18 (4) :1065-1081.

基于邻接矩阵的最短路径算法 篇9

关键词:最短路径,定界,活节点

0 引言

最短路径问题是给定有向图G、节点V的集合及边上的权值求源点到目标点最短距离。目前解决这个问题的算法很多, 其中最有名的算法是Dijkstra算法, 其余的方法大都是利用Dijkstra算法或者改进它, 例如:王江晴使用dijkstra算法计算动态路径, 而李洪波只是利用矩阵计算路径上的节点数, 没有涉及到路径上的权值。本文把邻接矩阵的计算用于解决最短路径, 提供了一种解决最短路径问题的新方法, 特别对于邻接矩阵是稀疏矩阵的情况下非常适合。

1 相关概念

已知:一个有向图G= (V (G) , E (G) , W (G) ) , 其中G表示图, V (G) 表示图G的节点集合, E (G) 表示图G边的集合, W (G) 表示边上路径的权值。设节点集合为V (G) = (v1v2…vn) vi为节点, E (G) = (…eij…) eij表示邻接节点vi、vj边上的权值, W (G) = (…wij…) wij表示从节点vi到vj的路径上权值累加和。求一条从v1到vn的最短有向路径的长度。

设n个顶点的邻接矩阵为:A (G) = (aij) =A

令B= (bij) 表示图G的可达性矩阵

其中:Aj= (ajst) , ajst表示矩阵A的j次幂的第s行第t列位置的元素s, t=1, …, n。

对于大规模稀疏矩阵的时候, 由于数据元素或者为1或者为零, 因此, 只需要存储非零数据元素的行和列的位置, 而不需要存储元素的值。本文将采用下面所示二元组的顺序表和行逻辑连接的顺序表存储数组元素:

2 路径构造的方法与策略

2.1 通路的构造

设A和Ar (r

2.2 中间节点的选取原则

每次从可选取的节点中, 选择一个邻接边长最短的节点, 但不构成回路。

2.3 更新活节点集

更新的方法是把刚刚添加到路径中的新节点从活节点集合中删除;同时, 把新节点的子节点添加到活节点集合中;这个过程表示为:active=active-{新添加的节点}∪{新添加的节点的子节点}。

Active表示活节点集合。

2.4 定界

定界分两种情况考虑:

情况1:如果算法计算到某一步骤, 已经产生一条从始节点v1到终节点vn的通路, 设通路的有向路径的长度为w1。而另一条正在搜索的路路径长度为w2, 不管正在计算的路径是否已经搜索到通路, 如果满足:w1≤w2, 那么这条正在搜索的路径应该去掉;如果满足w1>w2, 那么搜索继续。

情况2:设vj有k个分支点vj+1, …vj+k, 如下图1所示, 设ejj+1是其中邻接边长最短的, vn到vj比目前找出来的最短路径短, 而从vn到vj+1比目前的最短路径要长, 那么, 按照情况1, vj+1应该不在最优路径上, 应该删除, 事实上这时经过vj的每一条路径都比经过vj, vj+1要长, 所以更应该删除, 因此vj应该被删除。

2.5 计算路径长度

设第一搜索点为vn, 已经搜索到vi, 而vj是要加到这条路径上的vi的邻接点, 那么:wnj=wni+eij。

另外, 本算法采取从最后一个节点逆向搜索节点, 本算法假设寻找vi到vn的最短路径, 对于其余情况也是类似的。

3 搜索算法

初始化:给A赋初值

第一步计算矩阵A的幂

令活节点集

active={vi│vi为指向vn的邻接点, 并且vi在起点到终点的通路上}

第二步深度搜索优先, 寻找第一条通路。按深度搜索优先原则, 根据2.1和2.2增加邻接边, 按2.3更新活节点集合, 按照2.5计算路径长度, 重复这个步骤直到找到第一条从源点到目标点的通路, 并且令这条路是当前的最短路径。

第三步宽度搜索优先, 选择新的分支点。按宽度搜索优先原则, 根据2.1和2.2增加邻接边;按照2.5计算准路径的长度, 转第四步。

第四步定界。如果准路径长度大于当前最短路径, 根据定界2.4删除相应的活节点;如果准路径长度小于等于当前最短路径的长度, 按2.3更新活节点集合active, 然后分两种情况:

(1) 准路径是从源点到目标点的通路, 准路径为新的当前最短路径;

(2) 准路径不是从源点到目标点的通路, 则转第三步。

第五步输出最短路径节点集和最短路径长度。

4 实例

上图2为一个有向路径图, 求标号为0的节点v0到标号为4的节点v4的最短距离。

首先给出邻接矩阵:

计算A的幂其中乘法为普通乘法, 加法为逻辑相加:

有:a04=1, a204=1, a304=1

对应于a304=1, 有a202=1, a24=1, 所以v2、v4为邻接点, e24=10

对应于a204=1, 有a03=1, a34=1所以v3、v4为邻接点, e34=60

对应于a04=1, 有e04=100

min{e04, e24, e34}=e24=10, 所以v4的邻接点为v2, 对应active={v1, v3}。

以v2进行深度搜索得到节点v1, e12=50, 继续得到节点v0, e01=10所以通路为:T={v0, v1, v2, v4}, w0, 4=70 active={v3}。

第三步从active={v3}中取出v3, 而w34=60, w34+w03=90>70, 舍弃e04=100>w04, 舍弃。

所以:T={v0, v1, v2, v4}, w0, 4=70 active={v3}。

5 结束语

从上面的实例可以看出v5虽然与v4邻接边长最短, 但是, 由于它不在从目的点到源点的通路上, 所以v5不在活节点集合中, 这样会减少很多搜索的计算量, 故, 本算法的第一条是只有在通路上的节点才是活节点。本算法与Dijksta算法不同之处在于:Dijkstra算法只要跟源点是连通的点都是活节点, 而本算法只有从源点到目的点通路上的点才是活节点;Dijkstra算法把源点到其余每一点的最短路径都求出来, 本算法直接求源点到每个目的点的最短路径, 因此从这个角度来说本文节省了大量的计算量。当然由于要计算矩阵的幂, 会增加计算量, 并且一般情况下, 这个计算量很大;但是, 当邻接矩阵是稀疏矩阵时, 矩阵幂的计算量会大大减少。因此本文算法适合于邻接矩阵是稀疏矩阵的情况。

参考文献

[1]吴晓红.关于最短路径问题的一种有效算法[J].系统工程与电子技术, 1999 (11) .

[2]段凡丁.关于最短路径的SPFA快速算法[J].西南交通大学学报, 1994 (2) .

[3]伍建华.单源最短路径问题的Seidel迭代法[J].计算机应用, 2001 (8) .

[4]乐阳, 龚健雅.Dijkstra最短路径算法的一种高效率实现[J].武汉测绘科技大学学报, 1999 (3) .

[5]孙强.Dijkstra的一种改进算法[J].计算机工程与应用, 2003 (3) .

[6]王江晴.动态车辆路径问题中的实时最短路径算法研究[J].武汉理工大学学报 (交通科学与工程) , 2007 (1) .

[7]李洪波.Floyd最短路径算法[J].计算机工程与应用, 2006 (34) .

矩阵算法 篇10

关键词:频繁项集,矩阵,权值

数据挖掘是从数据库、数据仓库或其他信息库中发现有趣知识的过程, 而这些有趣的关联能辅助决策者作出正确的决策。目前最经典的关联规则算法是由Agrawal等于1994年提出的apriori算法。但Apriori算法在处理含有大量事务的数据库时, 需要多次扫描数据库, 而且会产生大量的候选项集, 使该算法效率降低。本文提出的基于矩阵的Apriori改进算法可以避免多次扫描数据库且无需产生大量候选项集, 从而大大提高了算法的效率。

1 基本概念

设I={I1, I2, …, Im}是项目的集合, 任务相关的数据D是数据库的集合, 其中每个事务T是项目的集合, 使得T⊆I。每个事务有一个唯一标识符, 称作TID。

定义1:每个项Ij的向量定义为:

其中,

定义2:项集I的矩阵记为:

性质1:若有一事务T其长度小于2, 则可以在矩阵中删除该事务所对应的列项量。

证明:若事务T的长度小于2, 则说明事务T不可能包含频繁K (k>1) -项集, 故可以在矩阵中删除该事务所对应的列向量。

性质2:任何非频繁项集都不可能是频繁项集的子集[1]。

2 基于压缩矩阵的Apriori算法 (简称PM_Apriori算法)

(1) 扫描数据库建立布尔矩阵D, 使D中的每列压缩存储一条或多条事务信息, 且无重复列 (建立一个数组av来存放每列的权值即含相同项目的事务个数) 。

(2) 裁剪矩阵。 (1) 扫描矩阵并计算所有项目的支持度计数, 若项目的支持度小于最小支持度, 则该项目对生成频繁K (K>1) -项集不起作用, 可以在矩阵中删除该项目所对应的行向量。 (2) 分别对矩阵中的每个列求和, 若某列和小于2, 依据性质1则可删除该列向量。

(3) 生成频繁2-项集对D各行按位做与运算, 并对运算结果求两个项目同时在所有事务中出现的次数:

若其值小于最小支持度计数, 则舍去该行向量, 否则保存。此时, 保存下来的行向量所对应的项目集即为频繁2-项集。

(4) 生成频繁K-项集。 (1) 对步骤2.3保存下来的行向量, 按原来顺序重新组合成矩阵, 得到矩阵D1。 (2) 分别对D1中的每个列求和, 若其和小于2, 则删除该列向量。 (3) 对D1保存下来的列向量, 按原来顺序组合成矩阵, 得到矩阵D2。 (4) 对D2各行按位做与运算, 将运算结果中的1取出, 分别与其对应列的权值相乘后相加, 求出该项集的支持度计数, 若其值小于最小支持度计数, 则舍去该行向量, 否则保存。 (5) 对保存的行向量所对应的项集求并集, 去掉重复的行向量, 此时, 保存下来的行向量所对应的项集即为频繁3-项集和频繁4-项集。 (6) 对保存下来的行向量按原来顺序重新组合成矩阵, 得到相应的矩阵D3。 (7) 分别对D3中的每个列求和, 若其和小于2, 则删除该列向量。 (8) 对D3保存下来的列向量, 按原来顺序组合成矩阵, 得到矩阵D4。 (9) 重复以上步骤直到矩阵行数少于或等于一行, 则算法结束。

(5) 对所有保存下来的行向量转化成相应的频繁项集并输出。

3 PM_Apriori算法与Apriori算法性能比较

为了验证改进后的算法性能, 以Apriori算法作为实验对比算法进行性能分析。程序为Delphi 7.0实现, 数据库为SQL Server 2000自带的Foodmart数据库, 图1描述了支持度为10%, 两种算法随记录数增加而在执行时间上的差异。

4 结语

本文提出的PM_Apriori算法可以避免多次扫描数据库且无需产生大量的候选项集, 并用矩阵的方式直接产生频繁项集, 算法效率得到很大提升。数据库中有大量相同的记录, 为每条记录增加权值 (记录重复次数) , 可降低数据库的规模。实验结果也验证了这种改进是有效的。对于未来工作, 应放在候选项集的裁剪, 以更好的提高算法效率。

参考文献

[1]范明, 孟小峰.数据挖掘概念与技术[M].北京:机械工业出版社, 2007.

上一篇:老年痴呆可预防下一篇:高压超高压论文