An implementation of the ID3 Decision Tree algorithm in Java from scratch.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

439 lines
11 KiB

package com.AI;
import com.DBpackage.MyDatabase;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Set;
class MySwing extends JFrame
{
private MyDatabase myDatabase;
private ID3 id3;
private NaryTree decisionTree;
MySwing(MyDatabase myDatabase)
{
this.myDatabase = myDatabase;
this.myDatabase.connectDatabase();
id3 = new ID3();
decisionTree = new NaryTree();
}
private class InsertPanel extends JPanel //means panel for insert pane, not inserting a panel
{
private JLabel label_roll;
private JLabel label_fname;
private JLabel label_lname;
private JLabel label_marks;
private JLabel c;
InsertPanel()
{
setLayout(new FlowLayout());
c = new JLabel();
label_roll =new JLabel();
label_fname =new JLabel();
label_lname =new JLabel();
label_marks =new JLabel();
JTextField roll = new JTextField(10);
JTextField fname = new JTextField(10);
JTextField lname = new JTextField(10);
JTextField marks = new JTextField(10);
c.setText("Hello");
label_roll.setText("Roll Number: ");
label_fname.setText("First Name: ");
label_lname.setText("Last Name: ");
label_marks.setText("Marks: ");
JButton submit = new JButton();
JButton reset = new JButton();
submit.setText("Submit");
reset.setText("Reset");
add(label_roll);
add(roll);
add(label_fname);
add(fname);
add(label_lname);
add(lname);
add(label_marks);
add(marks);
//add(ps);
add(submit);
add(reset);
add(c);
submit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int r,m;
String fn,ln;
c.setText("Button clicked!");
/*preparedStatement.setString(1, "Gary");
preparedStatement.setString(2, "Larson");
preparedStatement.setLong (3, 123);*/
//myDatabase.insertValues(sql);
r = Integer.parseInt(roll.getText());
m = Integer.parseInt(marks.getText());
fn = fname.getText();
ln = lname.getText();
myDatabase.insertValues(r,fn,ln,m);
//myDatabase.deleteValues(107);
//myDatabase.updateValues("Henry",106);
}
});
reset.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
roll.setText("");
fname.setText("");
lname.setText("");
marks.setText("");
c.setText("Cleared!");
}
});
}
}
private class UpdatePanel extends JPanel
{
UpdatePanel()
{
JButton upd = new JButton();
JLabel new_fname_label = new JLabel();
JLabel id_label = new JLabel();
JTextField new_fname = new JTextField(10);
JTextField id = new JTextField(10);
upd.setText("Update");
new_fname_label.setText("New first name: ");
id_label.setText("Enter the id of the record to be updated: ");
add(new_fname_label);
add(new_fname);
add(id_label);
add(id);
add(upd);
upd.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
String name = new_fname.getText();
int i = Integer.parseInt(id.getText());
myDatabase.updateValues(name, i);
}
});
}
}
private class DeletePanel extends JPanel // panel for delete not deleting a panel
{
DeletePanel()
{
JLabel id_label = new JLabel();
JTextField id = new JTextField(10);
JButton delete_but = new JButton();
id_label.setText("Enter id of the record to be deleted");
delete_but.setText("Delete");
add(id_label);
add(id);
add(delete_but);
delete_but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int i = Integer.parseInt(id.getText());
myDatabase.deleteValues(i);
}
});
}
}
private class DisplayPanel extends JPanel
{
private JButton show;
private JLabel show_label;
DisplayPanel()
{
setLayout(new FlowLayout());
show = new JButton();
show_label = new JLabel();
show.setText("Display");
show_label.setText("Click to display table");
add(show_label);
add(show);
show.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
myDatabase.displayValues();
}
});
}
}
private class StorePanel extends JPanel
{
private JButton store;
private JLabel store_label;
StorePanel()
{
store = new JButton();
store_label = new JLabel();
store.setText("Store");
store_label.setText("Click to store and display table");
add(store_label);
add(store);
store.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try
{
JTable table = new JTable();
Row climate;
ArrayList<Row> climateArrayList = myDatabase.storeValues();
id3 = new ID3();
// id3.setTableData(climateArrayList);
//id3.createNode();
// for (Row c : climateArrayList) {
// System.out.println(c.getDay() + " " +
// c.getWeather() + " " + c.getTemperature() + " " +
// c.getHumidity() + " " + c.getWind());
// }
}
catch(SQLException se)
{
se.printStackTrace();
}
}
});
}
}
private class DecisionTreePanel extends JPanel
{
private static final int DISTANCE_X = 4;
private static final int DISTANCE_Y = 65;
private static final int radius = 20;
private static final int diameter = radius * 2;
private int treeArity = 3;
private int treeDepth = 3;
private int childDistanceX;
private JPanel treeDisplayPanel;
char status;
private NaryTree createDecisionTree()
{
NaryTree tree = new NaryTree();
try {
ArrayList<Row> examples = myDatabase.storeValues();
for (Row row : examples) {
for (Cell cell : row.getCellsList()) {
System.out.print(cell.getAttributeName() + " " + cell.getValue() + ", ");
}
System.out.println();
}
Set<String> attributesSet = id3.getUniqueAttributes("Play", "Day", examples);
id3.setAttributesNew(examples);
id3.setModeAndPN(examples);
id3.createDecisionTree(tree, attributesSet, examples);
tree.displayTree();
myDatabase.deleteTree();
tree.dbTest(myDatabase);
} catch (SQLException se) {
se.printStackTrace();
}
return tree;
}
DecisionTreePanel()
{
// setLayout(new FlowLayout());
// setSize(800,600);
status = 'n';
JButton displayButton = new JButton();
JButton clearButton = new JButton();
JButton createTreeButton = new JButton();
displayButton.setText("Display Tree");
clearButton.setText("Clear");
createTreeButton.setText("Create Tree");
displayButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
status = 'y';
repaint();
}
});
clearButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
status = 'n';
repaint();
}
});
createTreeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
decisionTree = createDecisionTree();
}
});
add(displayButton);
add(clearButton);
add(createTreeButton);
childDistanceX = 100;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
// System.out.println("Inside paintcomponent");
Dimension size = getSize();
int x = size.width / 2;
int y = ( treeDepth * DISTANCE_Y) / 2;
// drawTree(g, x, y, treeArity, treeDepth);
if(status == 'y')
{
// g.drawOval(x,y,diameter,diameter);
System.out.println("Inside if");
// drawMyTree(g, x, y);
displayTree(g,x,y);
}
}
// public void drawTree(Graphics g, int x, int y, int arity, int depth) {
// if (depth > 0) {
// int childDistanceX = (int) (Math.pow(arity, depth) * DISTANCE_X);
// int childX = x - (arity - 1) * childDistanceX / 2;
// int childY = y - DISTANCE_Y;
//
// for (int child = 0; child < arity; child++) {
// g.drawLine(x, y, childX, childY);
// drawTree(g, childX, childY, arity, depth - 1);
// childX += childDistanceX;
// }
// }
// }
public void drawMyTree(Graphics g, int x, int y)
{
System.out.println("Inside drawmytree");
g.drawOval(x,y,diameter,diameter);
int childX = x - childDistanceX / 2;
int childY = y + DISTANCE_Y;
g.drawLine(x + radius ,y + diameter,childX + childDistanceX + radius,childY);
g.drawLine(x + radius ,y + diameter,childX + radius,childY);
g.drawOval(childX,childY,diameter,diameter);
g.drawOval(childX+childDistanceX,childY,diameter,diameter);
}
//////////////////////////////////////////////////////////////////////////////////
private void traverse(Node node, Graphics g, int x, int y, int i)
{
if(node == null)
{
System.out.println();
return;
}
int childX = x - childDistanceX;
int childY = y + DISTANCE_Y;
i++;
g.drawOval(x,y,diameter,diameter);
if(node.getAttributeName().equalsIgnoreCase("Yes") ||
node.getAttributeName().equalsIgnoreCase("No"))
if(node.getValuesList() == null) {
return;
}
for(Node.Value v: node.getValuesList())
{
// g.drawOval(childX,y,diameter,diameter);
g.drawLine(x+radius, y + diameter,childX + radius, childY);
traverse(v.getNext(), g, childX, childY, i);
childX = childX + childDistanceX;
}
}
void displayTree(Graphics g, int x, int y)
{
System.out.println("Displaying tree");
if(decisionTree.getHead()!=null) {
int i = 0;
traverse(decisionTree.getHead(), g, x, y, i);
}
else
{
System.out.println("Head node not created/initialized");
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
}
public void start()
{
JTabbedPane jtp = new JTabbedPane();
//This creates the template on the windowed application that we will be using
jtp.setBounds(10,10,1030,640);
InsertPanel insertPanel = new InsertPanel();
com.AI.MySwing.UpdatePanel updatePanel = new com.AI.MySwing.UpdatePanel();
com.AI.MySwing.DeletePanel deletePanel = new com.AI.MySwing.DeletePanel();
com.AI.MySwing.DisplayPanel displayPanel = new com.AI.MySwing.DisplayPanel();
com.AI.MySwing.StorePanel storePanel = new com.AI.MySwing.StorePanel();
DecisionTreePanel decisionTreePanel = new DecisionTreePanel();
//This adds the first and second tab to our tabbed pane object and names it
jtp.addTab("Insert", insertPanel);
jtp.addTab("Update", updatePanel);
jtp.addTab("Delete", deletePanel);
jtp.addTab("Display", displayPanel);
jtp.addTab("Store", storePanel);
jtp.addTab("Decision-Tree", decisionTreePanel);
getContentPane().add(jtp);
setLayout(null);
setVisible(true);
setSize(1050,700);
addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
System.out.println("Closing");
myDatabase.closeConnection();
dispose();
}
});
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
}
}