Categoria: data mining


Ottimo sito dove poter trovare interessanti tutorial avanazati su programmazione web.

Sito web: http://nettuts.com/

Share and Enjoy: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blinkbits
  • BlinkList
  • blogmarks
  • co.mments
  • del.icio.us
  • De.lirio.us
  • digg
  • Fark
  • feedmelinks
  • Furl
  • LinkaGoGo
  • Ma.gnolia
  • NewsVine
  • Reddit
  • scuttle
  • Smarking
  • Spurl
  • YahooMyWeb
  • DZone
  • Internetmedia
  • Snap2r
  • Technorati

Obiettivo
In questo articolo tratteremo come implementare l'algoritmo a priori in php per trovare coppie di articoli (prodotti)
che hanno alta frequenza tra un insieme di prodotti venduti.

L'algoritmo a priori
Questo algoritmo e' utilizzato per trovare coppie di insiemi frequenti in un insiemi di oggetti che possono essere
qualsiasi cosa. Ad esempio se analizziamo i carrelli della spesa per capire quali prodotti vengono comprati insieme,
questa informazione viene usata per posizionare i prodotti sugli scaffali ed ottimizzare i percorsi fatti.

Altre applicazioni del M-B problem:
Basket:documenti ,articoli: parole (frasi e concetti in relazione)
Basket: frasi, articoli: documenti (plagio, mirror sites su web)

Risultati del M-B Mining
Association Rules: regole del tipo se un cliente compra X1,X2,…,Xn allora compra anche Y con alta probabilita’. La probabilita’ minima che noi pretendiamo si chiama confidenza. Richiediamo che questa sia decisamente piu’ alta di quella attesa.
Ad esempio la regola latte,burro=>pane potrebbe derivare dal fatto che quasi tutti comprano pane. Mentre la regola pannolini=>birra vale con confidenza molto piu’ alta della percentuale di clienti che compra birra.

Algoritmo A-Priori
Si procede a livelli:
Read( s ); /*soglia di supporto
L1:= {a | a appare con frequenza >= s };
L2:= {{a,b} | a,b L1,{a,b} appare con frequenza >= s };
L3:= {{a,b,c} | {a,b}, {a,c}, {b,c}, L2 {a,b,c} appare con frequenza >= s };
ETC….

Il database
Il database a cui ci riferiremo è mysql.Il nostro database è cosi composto:

CREATE TABLE `definitivo_analisi` (
`id` int(11) NOT NULL auto_increment,
`codice` varchar(100) default NULL,
`utente` varchar(255) default NULL,
`data` varchar(255) default NULL
PRIMARY KEY (`id`)
) TYPE=MyISAM;

dove "codice" e' il codice del prodotto, "utente" e' chi lo ha acquistato e "data" e' la data di acquisto.
Il codice php è il seguente:

<?
echo"<form action=apriori.php method=post>";
echo"inserisci soglia<input type=text name=s><input type=submit value=analizza>";
echo"</form>";
set_time_limit(500); //di default è 30 , questo setta limit off

echo"<center><table><tr bgcolor=orange>Spiegazione</tr><tr><td>";
echo"Questa utility ci permette di vedere quali prodotti acquistano insieme gli utenti,in modo da mettere questi prodotti vicini ";
echo".Il supporto è il numero di volte in cui i prodotti compaiono tra gli acquisti. La soglia è il numero di volte minime da considerare.";
echo"<br>";

$arrai = array();
$items = array();

//carica l'array con gli item venduti
$cnt=0;
connessione_al_db();
$dati=mysql_query("select distinct codice from definitivo_analisi");
$numero_righe=mysql_num_rows($dati);
while($array=mysql_fetch_array($dati)){
$arrai[$cnt]=$array[codice];
$cnt++;
}

$conta=0;
$soglia=$s;
//1 item
for($i=0;$i<=strlen($arrai)+1;$i++){
if(issolofrequente($arrai[$i],$soglia)==1){
$items[$conta]=$arrai[$i];
$conta++;
}
}

//2 item
for($i=0;$i<=strlen($arrai)+1;$i++){
for($j=0;$j<=strlen($arrai)+1;$j++){
if(isduefrequente($arrai[$i],$arrai[$j],$soglia)==1){}
}
}

//3 item
for($i=0;$i<=strlen($arrai)+1;$i++){
for($j=0;$j<=strlen($arrai)+1;$j++){
for($z=0;$z<=strlen($arrai)+1;$z++){
if(istrefrequente($arrai[$i],$arrai[$j],$arrai[$z],$soglia)==1){}
}
}
}

//calcola la frequenza di un solo item
function issolofrequente($uno,$due)
{
connessione_al_db();
$contatore=0;
$dati=mysql_query("select utente from definitivo_analisi where codice='$uno'");
$numero_righe=mysql_num_rows($dati);
while($array=mysql_fetch_array($dati)){
$contatore++;
}
if($contatore>=$due)
{
echo "codice: <b>".$uno."</b> supporto:";
echo "<b>".$contatore."</b><br>";
return 1;
}
else return 0;
}

//calcola la frequenza di due items
function isduefrequente($uno,$due,$tre)
{
if($uno!=$due)
{
connessione_al_db();
$contatore=0;
$dati=mysql_query("select utente from definitivo_analisi where codice='$uno'");
while($array=mysql_fetch_array($dati)){
$utente=$array[utente];
$dati2=mysql_query("select utente from definitivo_analisi where codice='$due'");
while($array2=mysql_fetch_array($dati2)){
if($utente==$array2[utente]) $contatore++;
}
}
if($contatore>=$tre)
{
echo "codice:<b>".$uno."</b>-<b>".$due."</b> supporto:";
echo "<b>".$contatore."</b><br>";
return 1;
}
else return 0;
}
else return 0;
}

//calcola la frequenza di tre items
function istrefrequente($uno,$due,$tre,$quattro)
{
if($uno!=$due)if($uno!=$tre)if($due!=$tre)
{
connessione_al_db();
$contatore=0;
$dati=mysql_query("select utente from definitivo_analisi where codice='$uno'");
while($array=mysql_fetch_array($dati)){
$utente=$array[utente];
$dati2=mysql_query("select utente from definitivo_analisi where codice='$due'");
while($array2=mysql_fetch_array($dati2)){
$utente2=$array2[utente];
$dati3=mysql_query("select utente from definitivo_analisi where codice='$tre'");
while($array3=mysql_fetch_array($dati3)){
$utente3=$array3[utente];
if($utente==$utente2)
if($utente==$array3[utente])
$contatore++;
}}}
if($contatore>=$quattro)
{
echo "codice:<b>".$uno."</b>-<b>".$due."</b>-<b>".$tre."</b> supporto:";
echo "<b>".$contatore."</b><br>";
return 1;
}
else return 0;
}
else return 0;
}
echo"</td></tr></table>";
?>

Share and Enjoy: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blinkbits
  • BlinkList
  • blogmarks
  • co.mments
  • del.icio.us
  • De.lirio.us
  • digg
  • Fark
  • feedmelinks
  • Furl
  • LinkaGoGo
  • Ma.gnolia
  • NewsVine
  • Reddit
  • scuttle
  • Smarking
  • Spurl
  • YahooMyWeb
  • DZone
  • Internetmedia
  • Snap2r
  • Technorati
27
04

Algoritmo a priori (parte 2)

posted di Administrator, in data mining, tutorials. No Commenti

Obiettivo
In questo articolo tratteremo come implementare l'algoritmo a priori in java per trovare coppie di articoli (prodotti)
che hanno alta frequenza tra un insieme di prodotti venduti.

Codice

import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.util.*;
import java.sql.*;
import java.io.*;
import javax.swing.table.*;
import java.lang.*;

public class apriori extends JInternalFrame
{
public Vector items=new Vector(); //tutti gli items
public int soglia;  //soglia
Vector frequenti=new Vector(); //items frequenti
Vector pergrafico=new Vector();
JLabel lab;
String ndatab,nus,npass;

public Vector generaItems(Vector list,int livello)
{
//inizializzazione connessione
Connection conn=null;
Vector temp=new Vector();
Vector auxv=new Vector();

try{
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
conn = DriverManager.getConnection ("jdbc:oracle:oci8:@" + ndatab,nus,npass);
}
catch(Exception ez){}

//livello=0
//ritorna una vettore avente come elementi 1-items
if(livello==0)
{
for(int i=0;i<items.size();i++)
{
Vector interno=new Vector();
int bau=issolofrequente(((String)items.elementAt(i)),conn,soglia);
if(bau>soglia)
{
interno.addElement(items.elementAt(i));
temp.addElement(interno);
}
}
}
//livello>0
//ritorna una vettore avente come elementi piu di 2-items
else if(livello!=0)
{
for(int i=0;i<list.size();i++) //per ogni elem di list
{
//prendo l'ultimo elemento dell'elemento corrente del vettore 
Object ultimo = ((Vector)list.elementAt(i)).lastElement();
//cosi calcolo l'indice da cui inserire l'item
int indice_ultimo=items.lastIndexOf(ultimo);
for(int j=indice_ultimo+1;j<items.size();j++) //per ogni items
{
Vector aux=new Vector();
Vector aux2=new Vector();
aux = (Vector) list.elementAt(i); //num di elem
for(int h=0;h<aux.size();h++)
{
aux2.addElement(aux.elementAt(h));
}
aux2.addElement(items.elementAt(j));
int bau=isfrequente(aux2,conn,soglia);
if(bau>soglia){
temp.addElement(aux2);
}
}
}
}
return temp;
}

//vede se è frequente un solo item
public int issolofrequente(String elem,Connection con,int soglia)
{
int contatore=0;
String QUERY="select SYSTEM.acquisti.transid from SYSTEM.acquisti where items='"+elem+"'";
try{
Statement stmt = con.createStatement ();
ResultSet rslt = stmt.executeQuery (QUERY);
ResultSetMetaData rsmd=rslt.getMetaData();
//fa il ciclo dei campi
while(rslt.next()){
contatore++;
}
stmt.close();
rslt.close();
}
catch(Exception ez){
System.out.println("fallita");
}
if(contatore>soglia)return contatore;
else return 0;
}

//vede se è frequente piu di un item
public int isfrequente(Vector list,Connection con,int soglia)
{
int contatore=0;
String QUERY="select SYSTEM.acquisti.transid from SYSTEM.acquisti where items='"+list.elementAt(0)+"'";
for(int i=1;i<list.size();i++){
QUERY+="intersect select SYSTEM.acquisti.transid due from SYSTEM.acquisti where items='"+list.elementAt(i)+"'";

try{
Statement stmt = con.createStatement ();
ResultSet rslt = stmt.executeQuery (QUERY);
ResultSetMetaData rsmd=rslt.getMetaData();
//fa il ciclo dei campi
while(rslt.next()){
contatore++;
}
stmt.close();
rslt.close();
}
catch(Exception ez){
System.out.println("fallita");
}
if(contatore>soglia)return contatore;
else return 0;
}

public void stampa(Vector vett)
{
Enumeration e = vett.elements();
while(e.hasMoreElements()){
System.out.println(""+(e.nextElement()).toString());
}
}

public double confidenza(int supporto_tutti,Vector vett,Connection con,int soglia)
{
Vector vettore=new Vector();
for(int i=0;i<vett.size()-1;i++)
vettore.add((String)vett.elementAt(i));

double conf=supporto_tutti*1.0F/isfrequente(vettore,con,soglia)*1.0F;
return conf;
}

public apriori()
{}

public apriori(String datab,String us,String pass,String so)
{
setSize(600,500);
setLocation(100,100);
setClosable(true);
setMaximizable(true);
setIconifiable(true);
setResizable(true);

ndatab=datab;
nus=us;
npass=pass;

String[] columnNames =

"items", "support", "confidence"
};

Object[][] cells =
{ };

setTitle("algoritmo a priori soglia by sandro stracuzzi:"+so);
DefaultTableModel model= new DefaultTableModel(cells, columnNames); 
JPanel pannello=new JPanel(new BorderLayout());
JTable tabella;
lab=new JLabel("");

soglia=Integer.parseInt(so);
System.out.println(soglia);

Vector due=new Vector(); //items frequenti
Vector pulito=new Vector(); //items frequenti
//apriori ist=new apriori();

//inizializzazione connessione
Connection conn=null;
try{
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
conn = DriverManager.getConnection ("jdbc:oracle:oci8:@" + ndatab,nus,npass);
}
catch(Exception ez){}

//calcolo tempo
long start = 0;
long end = 0;
start = System.currentTimeMillis( );

//carico items
String QUERY="select distinct SYSTEM.acquisti.items from SYSTEM.acquisti";
try{
Statement stmt = conn.createStatement ();
ResultSet rslt = stmt.executeQuery (QUERY);
ResultSetMetaData rsmd=rslt.getMetaData();
//fa il ciclo dei campi
while(rslt.next()){
items.addElement(""+rslt.getString("items"));
}
stmt.close();
rslt.close();
}
catch(Exception ez){
System.out.println("fallita");
}

//prova
for(int k=0;k<items.size();k++){
if(k==0){
frequenti=generaItems(items,k);
//stampa(frequenti);
//cicla il vettore per mettere nella tabella
for(int x=0;x<frequenti.size();x++){
String[] newCells = new String[3];
newCells[0] = ""+(frequenti.elementAt(x)).toString();
newCells[1] = ""+isfrequente(((Vector)frequenti.elementAt(x)),conn,soglia);
newCells[2] = "-";
model.addRow(newCells); 
}
due=frequenti;
}
else{
frequenti=generaItems(due,k);
for(int x=0;x<frequenti.size();x++){
String[] newCells = new String[3];
newCells[0] = ""+(frequenti.elementAt(x)).toString();
newCells[1] = ""+isfrequente((Vector)frequenti.elementAt(x),conn,soglia);
newCells[2] = ""+confidenza(Integer.parseInt(newCells[1]),(Vector)frequenti.elementAt(x),conn,soglia); //supporto tutti,items 
model.addRow(newCells); 
}
due=frequenti;
}
}

//System.out.println(pergrafico);

tabella=new JTable(model);
pannello.add(new JScrollPane(tabella)); 
getContentPane().add(pannello,BorderLayout.CENTER);
getContentPane().add(lab,BorderLayout.SOUTH);

TableChangeListener modelListener = new TableChangeListener ();
tabella.getModel().addTableModelListener(modelListener);
tabella.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

end = System.currentTimeMillis( );
lab.setText("elapsed time = " +(end - start)/8 + " milliseconds");
}

class TableChangeListener implements TableModelListener
{
public TableChangeListener (){}
public void tableChanged(TableModelEvent event)
{
int row = event.getFirstRow();
int column = event.getColumn();
//int rowcount= event.getRowCount();
//int columncount= event.getColumnCount();
TableModel model = (TableModel)event.getSource();
String columnName = model.getColumnName(column);
Object data = model.getValueAt(row, column);
//grafico a=new grafico((Vector)data);
//a.show();
}
}

}

Share and Enjoy: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blinkbits
  • BlinkList
  • blogmarks
  • co.mments
  • del.icio.us
  • De.lirio.us
  • digg
  • Fark
  • feedmelinks
  • Furl
  • LinkaGoGo
  • Ma.gnolia
  • NewsVine
  • Reddit
  • scuttle
  • Smarking
  • Spurl
  • YahooMyWeb
  • DZone
  • Internetmedia
  • Snap2r
  • Technorati
27
04

Algoritmo a priori (parte 1)

posted di Administrator, in data mining, tutorials. No Commenti

Obiettivo
In questo articolo tratteremo come implementare l'algoritmo a priori in java per trovare coppie di articoli (prodotti)
che hanno alta frequenza tra un insieme di prodotti venduti.

L'algoritmo a priori
Questo algoritmo e' utilizzato per trovare coppie di insiemi frequenti in un insiemi di oggetti che possono essere
qualsiasi cosa. Ad esempio se analizziamo i carrelli della spesa per capire quali prodotti vengono comprati insieme,
questa informazione viene usata per posizionare i prodotti sugli scaffali ed ottimizzare i percorsi fatti.

Altre applicazioni del M-B problem:
Basket:documenti ,articoli: parole (frasi e concetti in relazione)
Basket: frasi, articoli: documenti (plagio, mirror sites su web)

Risultati del M-B Mining
Association Rules: regole del tipo se un cliente compra X1,X2,…,Xn allora compra anche Y con alta probabilita’. La probabilita’ minima che noi pretendiamo si chiama confidenza. Richiediamo che questa sia decisamente piu’ alta di quella attesa.
Ad esempio la regola latte,burro=>pane potrebbe derivare dal fatto che quasi tutti comprano pane. Mentre la regola pannolini=>birra vale con confidenza molto piu’ alta della percentuale di clienti che compra birra.

Algoritmo A-Priori
Si procede a livelli:
Read( s ); /*soglia di supporto
L1:= {a | a appare con frequenza >= s };
L2:= {{a,b} | a,b L1,{a,b} appare con frequenza >= s };
L3:= {{a,b,c} | {a,b}, {a,c}, {b,c}, L2 {a,b,c} appare con frequenza >= s };
ETC….

Il database
Il database a cui ci riferiremo è oracle versione 9.

Il programma java è nella seconda parte.

La nostra tabella è cosi composta:

-- Create table
create table SYSTEM.ACQUISTI
(
TRANSID VARCHAR2(6),
ITEMS VARCHAR2(20),
MESE VARCHAR2(2),
ANNO VARCHAR2(2)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);

-- Create table
create table SYSTEM.CATEGORIE
(
NOMECAT VARCHAR2(20),
CODICECAT VARCHAR2(10)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);

-- Create table
create table SYSTEM.PRODOTTI
(
NOME VARCHAR2(20),
MARCA VARCHAR2(20),
MODELLO VARCHAR2(30),
QUANTITA NUMBER,
CODICECATEGORIA VARCHAR2(10),
CODICESOTTOCATEGORIA VARCHAR2(10),
IMMAGINE VARCHAR2(40),
CODICE VARCHAR2(10),
PREZZO NUMBER
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);

-- Create table
create table SYSTEM.SOTTOCATEGORIE
(
NOMESOTTOCATEGORIA VARCHAR2(20),
CODICESOTTOCATEGORIA VARCHAR2(10),
CODICECATEGORIA VARCHAR2(20)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);

Links
http://alpha.dmi.unict.it/DB2Vecchio/Datamining/dm-01-14-10-04.ppt

Share and Enjoy: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blinkbits
  • BlinkList
  • blogmarks
  • co.mments
  • del.icio.us
  • De.lirio.us
  • digg
  • Fark
  • feedmelinks
  • Furl
  • LinkaGoGo
  • Ma.gnolia
  • NewsVine
  • Reddit
  • scuttle
  • Smarking
  • Spurl
  • YahooMyWeb
  • DZone
  • Internetmedia
  • Snap2r
  • Technorati
web tracker