将apriori php应用于CI
我从www.vtwo.org下载了php上的apriori算法,但我想将其应用于我的CI框架,但不会调用输入值。所以它无法显示结果。我的CI代码更改有问题吗?请帮忙 这是我的apriori控制器(apriori.php)将apriori php应用于CI,php,arrays,dataset,associations,apriori,Php,Arrays,Dataset,Associations,Apriori,我从www.vtwo.org下载了php上的apriori算法,但我想将其应用于我的CI框架,但不会调用输入值。所以它无法显示结果。我的CI代码更改有问题吗?请帮忙 这是我的apriori控制器(apriori.php) class-Apriori{ 私有$分隔符=','; 私人$minSup=2; 私有$minConf=50; private$rules=array(); private$table=array(); private$allthings=array(); 私有$allsups=
class-Apriori{
私有$分隔符=',';
私人$minSup=2;
私有$minConf=50;
private$rules=array();
private$table=array();
private$allthings=array();
私有$allsups=array();
private$keys=array();
私有$frequeitmsts=array();
私人$phase=1;
//最大相位>=2
私人$maxPhase=20;
私人$fiTime=0;
私人$arTime=0;
公共函数setDelimiter($char)
{
$this->delimiter=$char;
}
公共功能设置($int)
{
$this->minSup=$int;
}
公共函数setMinConf($int)
{
$this->minConf=$int;
}
公共函数setMaxScan($int)
{
$this->maxPhase=$int;
}
公共函数getDelimiter()
{
返回$this->delimiter;
}
公共函数getMinSup()
{
返回$this->minSup;
}
公共函数getMinConf()
{
返回$this->minConf;
}
公共函数getMaxScan()
{
返回$this->maxPhase;
}
/**
1. جدول آیتمها را می سازد
2. کلید دسترسی به هر آیتم را تولید می کند
3. تمامی آیتمها و تکرار آنها را محاسبه می کند - سطح 1
توجه: حداقل تکرار محاسبه میشود
**/
私有函数makeTable($db)
{
$table=array();
$array=array();
$counter=1;
如果(!是_数组($db))
{
$db=文件($db);
}
$num=计数($db);
对于($i=0;$idelimiter,$db[$i]);
$num1=计数($tmp);
$x=数组();
对于($j=0;$jkeys['v->k'][$x]))
{
$this->keys['v->k'][$x]=$counter;
$this->keys['k->v'][$counter]=$x;
$counter++;
}
如果(!isset($array[$this->keys['v->k'][$x]]))
{
$array[$this->keys['v->k'][$x]]=1;
$this->allsups[$this->keys['v->k'][$x]]=1;
}
其他的
{
$array[$this->keys['v->k'][$x]]++;
$this->allsups[$this->按键['v->k'][$x]]++;
}
$table[$i][$this->keys['v->k'][$x]]=1;
}
}
$tmp=array();
foreach($array as$item=>$sup)
{
如果($sup>=$this->minSup)
{
$tmp[]=数组($item);
}
}
$this->allthings[$this->phase]=$tmp;
$this->table=$table;
}
/**
1.مقدار سوپریموم را با توجه به ورودی شناسه آیتمها شمارش می کند
**/
专用函数扫描($arr,$infradearr='')
{
$cr=0;
如果($infradeArr)
{
如果(isset($this->allsups[$infradearr]))
{
返回$this->allsups[$introdearr];
}
}
其他的
{
排序($arr);
$IMPODEARR=内爆($this->delimiter,$arr);
如果(isset($this->allsups[$infradearr]))
{
返回$this->allsups[$introdearr];
}
}
$num=count($this->table);
$num1=计数($arr);
对于($i=0;$iallsups[$implodeArr]=$cr;
返回$cr;
}
/**
1. ترکیب دو آرایه و حذف مقادیر اضافی
**/
专用功能联合收割机($arr1,$arr2)
{
$result=array();
$num=计数($arr1);
$num1=计数($arr2);
对于($i=0;$ikeys['k->v'][$arr[$j]];
}
返回$result;
}
//1-2=>2-3:错误
//1-2=>5-6:正确
私有函数检查规则($a,$b)
{
$a_num=计数($a);
$b_num=计数($b);
对于($i=0;$iphase>=$this->maxPhase)
{
打破
}
$num=count($this->allthings[$this->phase]);
$cr=0;
对于($i=0;$IALLTINGS[$this->phase][$i],$this->allthings[$this->phase][$j]);
排序(项目);
$IMPODEARR=内爆($this->delimiter,$item);
如果(!isset($this->frequeitmsts[$infradearr]))
{
$sup=$this->scan($item,$inpudearr);
如果($sup>=$this->minSup)
{
$this->allthings[$this->phase+1][]=$item;
$this->frequeitmsts[$inpulodearr]=1;
$cr++;
}
}
}
}
如果($crphase++);
}
//زیر مجموعه های مربوط به مجموعه های بزرگتر را حذف می کند
foreach($this->frequeitmsts as$k=>v)
{
$arr=explode($this->delimiter,$k);
$num=计数($arr);
如果($num>=3)
{
$subsets=$this->subsets($arr);
$num1=计数(子集);
对于($i=0;$idelimiter,$subsets[$i]));
}
其他的
{
打破
}
}
}
}
$this->fiTime=$this->stopTimer($this->fiTime);
}
/**
1. قوانین نهایی را با توجه به مقدار حداقل کانفیندس محاسبه می کند
**/
公共职能流程($db)
{
$checked=$result=array();
$this->freqItemsets($db);
$this->arTime=$this->startTimer();
foreach($this->frequeitmsts as$k=>v)
{
$arr=explode($this->delimiter,$k);
$subsets=$this->subsets($arr);
$num=计数($subset);
对于($i=0;$irealName($i)子集);
$n2=$this->realName($j)子集);
class Apriori {
private $delimiter = ',';
private $minSup = 2;
private $minConf = 50;
private $rules = array();
private $table = array();
private $allthings = array();
private $allsups = array();
private $keys = array();
private $freqItmsts = array();
private $phase = 1;
//maxPhase>=2
private $maxPhase = 20;
private $fiTime = 0;
private $arTime = 0;
public function setDelimiter($char)
{
$this->delimiter = $char;
}
public function setMinSup($int)
{
$this->minSup = $int;
}
public function setMinConf($int)
{
$this->minConf = $int;
}
public function setMaxScan($int)
{
$this->maxPhase = $int;
}
public function getDelimiter()
{
return $this->delimiter;
}
public function getMinSup()
{
return $this->minSup;
}
public function getMinConf()
{
return $this->minConf;
}
public function getMaxScan()
{
return $this->maxPhase;
}
/**
1. جدول آیتمها را می سازد
2. کلید دسترسی به هر آیتم را تولید می کند
3. تمامی آیتمها و تکرار آنها را محاسبه می کند - سطح 1
توجه: حداقل تکرار محاسبه میشود
**/
private function makeTable($db)
{
$table = array();
$array = array();
$counter = 1;
if(!is_array($db))
{
$db = file($db);
}
$num = count($db);
for($i=0; $i<$num; $i++)
{
$tmp = explode($this->delimiter, $db[$i]);
$num1 = count($tmp);
$x = array();
for($j=0; $j<$num1; $j++)
{
$x = trim($tmp[$j]);
if($x==='')
{
continue;
}
if(!isset($this->keys['v->k'][$x]))
{
$this->keys['v->k'][$x] = $counter;
$this->keys['k->v'][$counter] = $x;
$counter++;
}
if(!isset($array[$this->keys['v->k'][$x]]))
{
$array[$this->keys['v->k'][$x]] = 1;
$this->allsups[$this->keys['v->k'][$x]] = 1;
}
else
{
$array[$this->keys['v->k'][$x]]++;
$this->allsups[$this->keys['v->k'][$x]]++;
}
$table[$i][$this->keys['v->k'][$x]] = 1;
}
}
$tmp = array();
foreach($array as $item => $sup)
{
if($sup>=$this->minSup)
{
$tmp[] = array($item);
}
}
$this->allthings[$this->phase] = $tmp;
$this->table = $table;
}
/**
1. مقدار سوپریموم را با توجه به ورودی شناسه آیتمها شمارش می کند
**/
private function scan($arr, $implodeArr = '')
{
$cr = 0;
if($implodeArr)
{
if(isset($this->allsups[$implodeArr]))
{
return $this->allsups[$implodeArr];
}
}
else
{
sort($arr);
$implodeArr = implode($this->delimiter, $arr);
if(isset($this->allsups[$implodeArr]))
{
return $this->allsups[$implodeArr];
}
}
$num = count($this->table);
$num1 = count($arr);
for($i=0; $i<$num; $i++)
{
$bool = true;
for($j=0; $j<$num1; $j++)
{
if(!isset($this->table[$i][$arr[$j]]))
{
$bool = false;
break;
}
}
if($bool)
{
$cr++;
}
}
$this->allsups[$implodeArr] = $cr;
return $cr;
}
/**
1. ترکیب دو آرایه و حذف مقادیر اضافی
**/
private function combine($arr1, $arr2)
{
$result = array();
$num = count($arr1);
$num1 = count($arr2);
for($i=0; $i<$num; $i++)
{
if(!isset($result['k'][$arr1[$i]]))
{
$result['v'][] = $arr1[$i];
$result['k'][$arr1[$i]] = 1;
}
}
for($i=0; $i<$num1; $i++)
{
if(!isset($result['k'][$arr2[$i]]))
{
$result['v'][] = $arr2[$i];
$result['k'][$arr2[$i]] = 1;
}
}
return $result['v'];
}
/**
1. نام آیتم را با توجه به شناسه آیتم یا آیتمها بر می گرداند
{1,2,3,4} => {A,B,C,D}
**/
private function realName($arr)
{
$result = '';
$num = count($arr);
for($j=0; $j<$num; $j++)
{
if($j)
{
$result .= $this->delimiter;
}
$result .= $this->keys['k->v'][$arr[$j]];
}
return $result;
}
//1-2=>2-3 : false
//1-2=>5-6 : true
private function checkRule($a, $b)
{
$a_num = count($a);
$b_num = count($b);
for($i=0; $i<$a_num; $i++)
{
for($j=0; $j<$b_num; $j++)
{
if($a[$i]==$b[$j])
{
return false;
}
}
}
return true;
}
private function confidence($sup_a, $sup_ab)
{
return round(($sup_ab / $sup_a) * 100, 2);
}
private function subsets($items)
{
$result = array();
$num = count($items);
$members = pow(2, $num);
for($i=0; $i<$members; $i++)
{
$b = sprintf("%0".$num."b", $i);
$tmp = array();
for($j=0; $j<$num; $j++)
{
if($b[$j]=='1')
{
$tmp[] = $items[$j];
}
}
if($tmp)
{
sort($tmp);
$result[] = $tmp;
}
}
return $result;
}
/**
1. آیتم ستهای تکراری را بر می گرداند
**/
private function freqItemsets($db)
{
$this->fiTime = $this->startTimer();
$this->makeTable($db);
while(1)
{
if($this->phase>=$this->maxPhase)
{
break;
}
$num = count($this->allthings[$this->phase]);
$cr = 0;
for($i=0; $i<$num; $i++)
{
for($j=$i; $j<$num; $j++)
{
if($i==$j)
{
continue;
}
$item = $this->combine($this->allthings[$this->phase][$i], $this->allthings[$this->phase][$j]);
sort($item);
$implodeArr = implode($this->delimiter, $item);
if(!isset($this->freqItmsts[$implodeArr]))
{
$sup = $this->scan($item, $implodeArr);
if($sup>=$this->minSup)
{
$this->allthings[$this->phase+1][] = $item;
$this->freqItmsts[$implodeArr] = 1;
$cr++;
}
}
}
}
if($cr<=1)
{
break;
}
$this->phase++;
}
//زیر مجموعه های مربوط به مجموعه های بزرگتر را حذف می کند
foreach($this->freqItmsts as $k => $v)
{
$arr = explode($this->delimiter, $k);
$num = count($arr);
if($num>=3)
{
$subsets = $this->subsets($arr);
$num1 = count($subsets);
for($i=0; $i<$num1; $i++)
{
if(count($subsets[$i])<$num)
{
unset($this->freqItmsts[implode($this->delimiter, $subsets[$i])]);
}
else
{
break;
}
}
}
}
$this->fiTime = $this->stopTimer($this->fiTime);
}
/**
1. قوانین نهایی را با توجه به مقدار حداقل کانفیندس محاسبه می کند
**/
public function process($db)
{
$checked = $result = array();
$this->freqItemsets($db);
$this->arTime = $this->startTimer();
foreach($this->freqItmsts as $k => $v)
{
$arr = explode($this->delimiter, $k);
$subsets = $this->subsets($arr);
$num = count($subsets);
for($i=0; $i<$num; $i++)
{
for($j=0; $j<$num; $j++)
{
if($this->checkRule($subsets[$i], $subsets[$j]))
{
$n1 = $this->realName($subsets[$i]);
$n2 = $this->realName($subsets[$j]);
$scan = $this->scan($this->combine($subsets[$i], $subsets[$j]));
$c1 = $this->confidence($this->scan($subsets[$i]), $scan);
$c2 = $this->confidence($this->scan($subsets[$j]), $scan);
if($c1>=$this->minConf)
{
$result[$n1][$n2] = $c1;
}
if($c2>=$this->minConf)
{
$result[$n2][$n1] = $c2;
}
$checked[$n1.$this->delimiter.$n2] = 1;
$checked[$n2.$this->delimiter.$n1] = 1;
}
}
}
}
$this->arTime = $this->stopTimer($this->arTime);
return $this->rules = $result;
}
public function printFreqItemsets()
{
echo 'Time: '.$this->fiTime.' second(s)<br />===============================================================================<br />';
foreach($this->freqItmsts as $k => $v)
{
$tmp = '';
$tmp1 = '';
$k = explode($this->delimiter, $k);
$num = count($k);
for($i=0; $i<$num; $i++)
{
if($i)
{
$tmp .= $this->delimiter.$this->realName($k[$i]);
$tmp1 .= $this->delimiter.$k[$i];
}
else
{
$tmp = $this->realName($k[$i]);
$tmp1 = $k[$i];
}
}
echo '{'.$tmp.'} = '.$this->allsups[$tmp1].'<br />';
}
}
public function saveFreqItemsets($filename)
{
$content = '';
foreach($this->freqItmsts as $k => $v)
{
$tmp = '';
$tmp1 = '';
$k = explode($this->delimiter, $k);
$num = count($k);
for($i=0; $i<$num; $i++)
{
if($i)
{
$tmp .= $this->delimiter.$this->realName($k[$i]);
$tmp1 .= $this->delimiter.$k[$i];
}
else
{
$tmp = $this->realName($k[$i]);
$tmp1 = $k[$i];
}
}
$content .= '{'.$tmp.'} = '.$this->allsups[$tmp1]."\n";
}
file_put_contents($filename, $content);
}
public function getFreqItemsets()
{
$result = array();
foreach($this->freqItmsts as $k => $v)
{
$tmp = array();
$tmp['sup'] = $this->allsups[$k];
$k = explode($this->delimiter, $k);
$num = count($k);
for($i=0; $i<$num; $i++)
{
$tmp[] = $this->realName($k[$i]);
}
$result[] = $tmp;
}
return $result;
}
public function printAssociationRules()
{
echo 'Time: '.$this->arTime.' second(s)<br />===============================================================================<br />';
foreach($this->rules as $a => $arr)
{
foreach($arr as $b => $conf)
{
echo "$a => $b = $conf%<br />";
}
}
}
public function saveAssociationRules($filename)
{
$content = '';
foreach($this->rules as $a => $arr)
{
foreach($arr as $b => $conf)
{
$content .= "$a => $b = $conf%\n";
}
}
file_put_contents($filename, $content);
}
public function getAssociationRules()
{
return $this->rules;
}
private function startTimer()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
private function stopTimer($start, $round=2)
{
$endtime = $this->startTimer()-$start;
$round = pow(10, $round);
return round($endtime*$round)/$round;
}} ?>
class Welcome extends CI_Controller {
function __construct() {
parent::__construct();
include 'class.apriori.php';
}
// input page
public function index() {
$this->load->view('welcome_message');
}
// minSup, minConf, maxScan value as input
public function ambilinput() {
$minSup = $this->input->post('minSup', true);
$minConf = $this->input->post('minConf', true);
$maxScan = $this->input->post('maxScan', true);
redirect("welcome/apriori/$minSup/$minConf/$maxScan");
}
//APRIORI on system
public function apriori($minSup, $minConf, $maxScan) {
$Apriori = new Apriori();
$Apriori->setMaxScan($maxScan);
$Apriori->setMinSup($minSup);
$Apriori->setMinConf($minConf);
$Apriori->setDelimiter(',');
$dataset = array();
$dataset[] = array('A', 'B', 'C', 'D');
$dataset[] = array('A', 'D', 'C');
$dataset[] = array('B', 'C');
$dataset[] = array('A', 'E', 'C');
$Apriori->process($dataset);
echo '<h1>Frequent Itemsets</h1>';
$Apriori->printFreqItemsets();
echo '<h3>Frequent Itemsets Array</h3>';
print_r($Apriori->getFreqItemsets());
//Association Rules
echo '<h1>Association Rules</h1>';
$Apriori->printAssociationRules();
echo '<h3>Association Rules Array</h3>';
print_r($Apriori->getAssociationRules());
}
}
<head>
<meta charset="utf-8">
<title>Input 1</title>
</head>
<body>
<div>
<form action="<?php echo base_url(); ?>index.php/welcome/ambilinput" method="post">
<input type="number" name="minSup" placeholder="Minimal Support dalam %"/></br></br>
<input type="number" name="minConf" placeholder="Minimal Coff dalam %"/></br></br>
<input type="number" name="maxScan" placeholder="Jumlah Transaksi"/></br></br>
<button type="submit" name="submit">Hitung Apriori</button>
</form>
</div>
</body>