前往顾页

操纵Flash实现MSApriori算法

时候:2012-05-07 21:33来源:知行网www.zhixing123.cn 编辑:麦田守望者

传统的Apriori算法对不合项目之间呈现频次相关太年夜的数据,在发掘时可能存在两个问题:
1、如果将最小支撑度设置太年夜,那明显得不到含有呈现频次较低的项目(罕见项目)的关联法则。
2、如果想要获得包含罕见的关联法则,就不克不及不把最小支撑度设置得很小。这会激发组合爆炸,适合请求的频繁项目集和关联法则的数量将以指数级的速率增加,会导致发掘过程无法进行。
处理问题1的体例是让用户指定多个最小支撑度阈值,为每个项目指定一个最小项目支撑度MIS(Minimum Item Support)。处理问题2可将频繁项目集合那些两个或多个频次相关太年夜的项目标候选集给过滤失落,即设置一个“束缚前提”。
这个扩展模型即令MIS(i)表示第i个项目标MIS值。一条法则R的最小支撑度为R中所有项目中最低的MIS值。如一条法则R:i1,i2,...,ik->ik+1,...,ir。满足它的最小支撑度,那数据集的实在支撑度要年夜于或即是min(MIS(i1),MIS(i2),...,MIS(ir))。
算法如:(参考刘兵WEB数据发掘)
 

利用Flash实现MSApriori算法 1
利用Flash实现MSApriori算法 2
利用Flash实现MSApriori算法 3
下面是利用Flash来实现的MS-Apriori:(这回用OOP体例来写)
package
{
import flash.display.Sprite;
public class MSAprioriFla extends Sprite
{
public function MSAprioriFla()
{
//var T:String = "牛肉,鸡肉,牛奶;牛肉,奶酪;奶酪,靴子;牛肉,鸡肉,奶酪;牛肉,鸡肉,衣服,奶酪,牛奶;鸡肉,衣服,牛奶;鸡肉,牛奶,衣服;牛奶,衣服;牛奶,衣服,鸡肉";
//var T:String = "1,2;2,4;2,3;1,2,4;1,3;2,3;1,3;1,2,3;1,2,3";
//var T:String = "1,2,5;2,4;2,3;1,2,4;1,3;2,3;1,3;1,2,3,5;1,2,3";
//var T:String="牛肉,面包;面包,衣服;牛肉,面包,牛奶;奶酪,靴子;牛肉,面包,奶酪,鞋子;牛肉,面包,奶酪,牛奶;面包,牛奶,衣服";//cn example
var T:String="牛肉,面包;面包,衣服;面包,衣服,牛奶;奶酪,靴子;牛肉,面包,奶酪,鞋子;牛肉,面包,奶酪,牛奶;面包,牛奶,衣服";//en example
var arrT:Array = T.split(";");
var vT:Vector.<Vector.<String>>=new Vector.<Vector.<String>>();
var vs:Vector.<String>;
var arr:Array;
var i,j:int;
for(i=0;i<arrT.length;i++)
{
arr=arrT[i].split(",");
vs=new Vector.<String>();
for(j=0;j<arr.length;j++)
{
vs.push(arr[j]);
}
vT.push(vs);
}
//筹办MIS
var vMIS:Vector.<ItemMIS>=new Vector.<ItemMIS>();
//vMIS.push( new ItemMIS("1",.1),
// new ItemMIS("2",.2),
// new ItemMIS("3",.05),
// new ItemMIS("4",.06))
vMIS.push(new ItemMIS("牛奶",.5),new ItemMIS("面包",.7),new ItemMIS("衣服",.25),
new ItemMIS("牛肉",.25),new ItemMIS("奶酪",.25),new ItemMIS("靴子",.25),new ItemMIS("鞋子",.25));
var msa:MSApriori=new MSApriori(vT,vMIS);
trace(msa.TToString());
msa.exec();

}
}
}
///////////////////////////////
package
{
public class MSApriori
{
private var T:Vector.<Vector.<String>>=new Vector.<Vector.<String>>();
private var Tn:int;
private var IMIS:Vector.<ItemMIS > ;
var oMIS:Object=new Object();
private var Phi:Number=.1;
public function MSApriori(_T:Vector.<Vector.<String>>,_imis:Vector.<ItemMIS>)
{
T = _T;
Tn = T.length;
IMIS = _imis;
}

public function exec():void
{
//从T中提取1-项目集
var vtC1:Vector.<ItemSet>=new Vector.<ItemSet>();
var oC1:Object=new Object();//当hash表用
var vtF1:Vector.<ItemSet>=new Vector.<ItemSet>();
var i,j:int;
var vt1,vt2:Vector.<String>;
var item:ItemSet;

//IMIS排序
IMIS.sort(function compare(x:ItemMIS, y:ItemMIS):Number {
if(x.MIS==y.MIS) return 0;
else if(x.MIS>y.MIS) return 1;
else return -1;
});//按数值排序
//将IMIS hash,便利检索
for(i=0;i<IMIS.length;i++)
{
oMIS[IMIS[i].Item1k]=IMIS[i].MIS;
}


//1.候选1-项集
for (i=0; i<T.length; i++)
{
vt1 = T[i];
for (j=0; j<vt1.length; j++)
{
if (!Contain(vtC1,vt1[j]))
{
vt2=new Vector.<String>();
vt2.push(vt1[j].toString());
item=new ItemSet(vt2);
vtC1.push(item);
oC1[vt1[j].toString()]=item;
}
}
}
//排序
vtC1 = vtC1.sort(
function compare(x:ItemSet, y:ItemSet):Number {
if(x.Item[0]==y.Item[0]) return 0;
else if(x.Item[0]>y.Item[0]) return 1;
else return -1;
}
);

//计较各项集的count
var key:String;
for(i=0;i<T.length;i++)
{
for(j=0;j<T[i].length;j++)
{
key=T[i][j];
if(oC1[key]!=undefined) oC1[key].count++;
}
}
//计较每个项集的count/n
for(i=0;i<vtC1.length;i++)
{
vtC1[i].sup=vtC1[i].count/Tn;
}
//调试用

//将C1按MIS的值来升序排序
var vtC11:Vector.<ItemSet>=new Vector.<ItemSet>();
for(i=0;i<IMIS.length;i++)
{
vtC11.push(oC1[IMIS[i].Item1k]);
}
vtC1=vtC11;

//在MIS中找出第1个满足i.count/n>=MIS(i)的地位
vtC11=new Vector.<ItemSet>();
for(i=0;i<IMIS.length;i++)
{
if(oC1[IMIS[i].Item1k].sup>=IMIS[i].MIS)
{
vtC11.push(oC1[IMIS[i].Item1k]);
break;
}
}
trace("i为"+i);
var iimis:Number=IMIS[i].MIS;

for(i++;i<IMIS.length;i++)
{
if(oC1[IMIS[i].Item1k].sup>=iimis)vtC11.push(oC1[IMIS[i].Item1k]);
}
vtC1=vtC11;
trace("1.候选1-项集:\n"+ISToString(vtC1));


//2.1-频繁集
var mis:Number;
for(i=0;i<vtC1.length;i++)
{
mis=oMIS[vtC1[i].Item.toString()];
if(vtC1[i].sup>=mis){
vtF1.push(vtC1[i]);
}
}
trace("2.1-频繁集为:\n"+ISToString(vtF1));

var k:int=2;
var vtFk:Vector.<ItemSet>;
var vtCk:Vector.<ItemSet>;



do
{
if(k==2)vtCk=level2_candidate_gen(vtC1,Phi);
else vtCk=MScandidate_gen(vtFk,Phi);
trace("3."+k+"-候选集为:"+ISToString(vtCk));
for(i=0;i<T.length;i++)
{
for(j=0;j<vtCk.length;j++)
{
if(Contain2(T[i],vtCk[j].Item))vtCk[j].count++;
}
}
vtFk=new Vector.<ItemSet>();

for(i=0;i<vtCk.length;i++)
{
vtCk[i].sup=vtCk[i].count/Tn;
if(vtCk[i].sup>=oMIS[vtCk[i].Item[0]]) vtFk.push(vtCk[i]);
}
trace("3."+k+"-频繁集为:"+ISToString(vtFk));
k++

}while(vtFk.length>0);



}

private function MScandidate_gen(Fk:Vector.<ItemSet>,phi:Number):Vector.<ItemSet>
{
var rs:Vector.<ItemSet>=new Vector.<ItemSet>();
var i,j:int;
var k:int=Fk[0].Item.length+1;
var vt1,vt2:Vector.<String>;
var itemset:ItemSet;
//归并
for(i=0;i<Fk.length-1;i++)
{
for(j=i;j<Fk.length;j++)
{
vt1=Fk[i].Item.slice(0,Fk[i].Item.length);

顶一下
(1)
100%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):FLASH FLASH实例教程 flash技能 flash源代码 flash根本教程
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣