我的decision实现

来源:互联网 发布:欧美女歌手 知乎 编辑:程序博客网 时间:2024/05/01 01:07
import java.io.*;
import java.util.*;


public class c{
public static void main(String args[]){
File f = new File("E:/DEV_S/data.txt");
if(!f.exists()||f.isDirectory())
{
System.out.println("Doesn't exists or is a Directory!");
return;
}


/* 高效读取
FileInputStream fis = new FileInputStream(f);

byte[] buf = new byte[1024];
StringBuffer sb = new StringBuffer();
while(-1 != (fis.read(buf))){
sb.append(new String(buf));
System.out.println(sb);
System.out.println("---");
}*/
/* 
逐行读取
*/
String line = "";
int recordCnt = 10;
int attriCnt[] = {3,3,2,2};

String[][] arr = new String[recordCnt][attriCnt.length];
try{
BufferedReader br = new BufferedReader(new FileReader(f));


String[] lines = new String[4];
int rowCnt = 0;
while(null != (line = br.readLine())){
lines = line.split(",");
for(int i=0; i<4; i++){
arr[rowCnt][i] = lines[i];
}
rowCnt++;
}

}catch(Exception e){
e.printStackTrace();
}



TreeNode nt = new TreeNode("root");

List<TreeNode> nl = 
parti(arr,attriCnt,nt);
nt.setNodeList(nl);
System.out.println();
System.out.println("打印....");
String space = "   ";
printNode(nt,space);


//getSon(arr,attriCnt,2,"no1");

//getGain(arr,attriCnt,0);

//System.out.println(getGain(arr,attriCnt,1));

//System.out.println(log2(2));

/*
//String[][] string = {{"s","no1","no"},{"l","yes1","yes"},{"s","yes1","no"}};
String[][] string = //{{"s","no1","no"},{"l","yes1","yes"},{"s","yes1","no"}};
//{{"m","yes1","yes" },{ "m","yes1","yes"},{ "m","no1","yes"}};
 {{"m","yes1","yes " },{ " l","no1","yes " },{ " s","no1","no " },{ " s","no1","yes "}};
String[][] string = {{"no1","no"},{"no1","yes"}};
//int[] in = {3,2,2};
//int[] in = {2,2};
List<TreeNode> n2 =  parti(string,in,nt);
nt.setNodeList(n2);
System.out.println();
System.out.println("打印....");
String space = "   ";
printNode(nt,space);*/
}

public static List<TreeNode> parti(String[][] arr, int[] attriCnt, TreeNode nt ){
if(attriCnt.length<2)
return null;
//System.out.println();
double gain = 0;
double minGain = 100;
double maxGain = 0;
int index = 0;
int index_max = 0;
String minKey = "";
String minClass = "";


double gainArr[] = new double[attriCnt.length-1];
Map<String,Integer> indOfAttiValue_index = new HashMap<String,Integer>();
Map<String,Integer> indOfClass_index = new HashMap<String,Integer>();

Map<Integer,Set<String>> indOfValues = new HashMap<Integer,Set<String>>();
/*
System.out.println();
System.out.println();

for(int i = 0; i<arr.length; i++){
String str = "";
for(int j=0; j<arr[0].length; j++){
str += arr[i][j]+",";
}
System.out.println(str);
str = "";
}
System.out.println("-----------上面是待处理数据 下面是期望--------");*/

int ind=0;
String matrix_index = "";
String matrix_index_max = "";
for(; ind<attriCnt.length-1;ind++){
//gain = getGain(arr,attriCnt,ind);
int ClassInd = attriCnt[attriCnt.length-1]+1;                            //类数目
int matrix[][] = new int[attriCnt[ind]][ClassInd];                     //曾毅


Map<String,Integer> indOfAttiValue = new HashMap<String,Integer>();
Map<String,Integer> indOfClass = new HashMap<String,Integer>();

for(int i=0; i<arr.length; i++){
if(null == arr[i][ind]){
break;
}
//System.out.println("i: "+i+", arr[0].length-1: "+ (arr[0].length-1));

Integer row = indOfAttiValue.get(arr[i][ind]);
Integer col = indOfClass.get(arr[i][arr[0].length-1]);

if(null == row){
row = indOfAttiValue.size();
indOfAttiValue.put(arr[i][ind],indOfAttiValue.size());

Set<String> set = indOfValues.get(ind);
if(null == set){
set = new HashSet<String>();
}
set.add(arr[i][ind]);

indOfValues.put(ind,set);
}
if(null == col){
col = indOfClass.size();
indOfClass.put(arr[i][arr[0].length-1],indOfClass.size());
}

/*System.out.println(row);
System.out.println(arr[i][ind]);
System.out.println(col);
System.out.println(arr[i][ClassInd]);*/



matrix[row][col]++;
matrix[row][ClassInd-1]++;

//System.out.println();

}


/*System.out.println(attriCnt[ind]);
System.out.println(ClassInd);*/

/*for(int i=0; i<attriCnt[ind]; i++){
for(int j=0; j<ClassInd; j++){
System.out.println(matrix[i][j]);
}
System.out.println();

}*/

float tmp = 0;
float cnt = 0;
//double g = 0;
for(int i=0; i<attriCnt[ind]; i++){
for(int j=0; j<ClassInd-1; j++){
//System.out.println(i+","+j+"--->"+matrix[i][ClassInd-1] +"," +matrix[i][j]);
cnt = matrix[i][ClassInd-1];
if((matrix[i][ClassInd-1] != matrix[i][j]) && (0 != matrix[i][j]) ){
//System.out.println(matrix[i][j]+", "+matrix[i][ClassInd-1]);
tmp = matrix[i][j];
float new_tmp = tmp/cnt;
//System.out.println(new_tmp);
gain -= new_tmp*log2(new_tmp);
}
}
}
//gain = getGain(arr,attriCnt,ind);


System.out.println(gain);


gainArr[ind]= gain;
if(minGain > gain){
minGain = gain;
index = ind;
indOfAttiValue_index = indOfAttiValue;
indOfClass_index =  indOfClass;

matrix_index = "";
for(int i= 0; i< attriCnt[ind];i++){
for(int j=0; j< ClassInd; j++){
matrix_index += matrix[i][j]+",";
//System.out.println(matrix[i][j]);
}
//System.out.println();
matrix_index += ";";
}

if((maxGain <gain)&&(attriCnt.length <= 2)){
maxGain = gain;
index_max = ind;


for(int i= 0; i< attriCnt[ind];i++){
for(int j=0; j< ClassInd; j++){
matrix_index_max += matrix[i][j]+",";
//System.out.println(matrix[i][j]);
}
//System.out.println();
matrix_index_max += ";";
}
}
}
//System.out.println(index);
//System.out.println(minGain);


System.out.println("gainArr.length"+gainArr.length);
System.out.println("index"+index);
System.out.println("haha: "+gainArr[index]);



List<TreeNode> nodeList = new ArrayList<TreeNode>();
/*if(gainArr[index] < Math.pow(10,-5))
{

System.out.println("孙子代到达---》");
System.out.println(index);
System.out.println(matrix_index);
TreeNode nt_index = new TreeNode(arr[0][index]);

nt_index.setParent(nt);
nt_index.setValue(arr[0][index]+"你到家了!");
nt_index.setClass1(arr[0][arr[0].length-1]);
nt_index.setNodeList(null);  
nodeList.add(nt_index);

//

if(attriCnt.length < 2){
return nodeList;
}
}*/

/*if((attriCnt.length <= 2) &&(gainArr[index] > Math.pow(10,-5))){
//List<TreeNode> nodeList = new ArrayList<TreeNode>();
TreeNode nt_index = new TreeNode(arr[0][index_max]);

nt_index.setParent(nt);
nt_index.setValue(arr[0][index_max]);
nt_index.setValue("我到家了~~~");
nt_index.setClass1(arr[0][arr[0].length-1]);
nt_index.setNodeList(null);  
nodeList.add(nt_index);
return nodeList;
}*/

List<TreeNode> nodeList_inv = new ArrayList<TreeNode>();
//List<TreeNode> nodeList = new ArrayList<TreeNode>();
String key = "";


System.out.println();
System.out.println(matrix_index);
// 每次完成计
int des = 0;;
for(Map.Entry<String,Integer> entry: indOfAttiValue_index.entrySet()){
des++;

int row = indOfAttiValue_index.get(entry.getKey());
//int col = indOfClass_index.get("类名");
int col = attriCnt.length-1;

System.out.println("其他节点");

/*
System.out.println("row is:"+row);
System.out.println("col-1 is:" + (matrix_index.split(";")[row].split(",").length-1));*/
String num = matrix_index.split(";")[row].split(",")[matrix_index.split(";")[row].split(",").length-1];

key = entry.getKey();

System.out.println(key);

/*for(int i=0;i<arr.length;i++){
String str = "";
for(int j=0;j<arr[0].length;j++){
str += arr[i][j] + ",";
}
System.out.println(str);
}
System.out.println(Arrays.toString(attriCnt));
System.out.println("arr.length: "+arr.length+",arr[0].length: "+arr[0].length);
System.out.println("num: "+num+",arr[0].length-1: "+ (arr[0].length-1));*/
//getSon(arr, attriCnt, index, entry.getKey());
String[][] arr_son = new String[new Integer(num)][arr[0].length-1] ;
int[] attriCnt_son = new int[attriCnt.length-1];

int m = 0;
for(int i=0; i< arr.length; i++){
if(key.equals(arr[i][index])){
int n = 0;
for(int j =0; j<arr[0].length; j++){
if( j != index){
//System.out.println("m: "+m+",n: "+n);
//System.out.println("i: "+i+",j: "+j);
arr_son[m][n++] = arr[i][j];
}
}
m++;
}
}

int temp = 0;
for(Map.Entry<Integer,Set<String>> entry1: indOfValues.entrySet()){
temp = entry1.getKey();
if(entry1.getValue().contains(key)){
break;
}
}

System.out.println("属性对应矩阵横坐标:"+temp);
int k = 0;
for(int i=0;i<attriCnt.length;i++){
if( i != temp){
attriCnt_son[k++] = attriCnt[i];
}
}
//System.out.println(Arrays.toString(attriCnt_son));
//getSon(arr, attriCnt, index, entry.getKey());
for(int i=0;i<arr_son.length;i++){
String str = "";
for(int j=0;j<arr_son[0].length;j++){
str += arr_son[i][j] + ",";
}
System.out.println(str);
}

System.out.println(Arrays.toString(attriCnt_son));
System.out.println("---------------------------处理子代中:" + des+" ---------------------------------------");



TreeNode nt_index_inv = new TreeNode(key);

nt_index_inv.setParent(nt);
//nt_index_inv.setValue("child "+des+" ");


nodeList_inv = parti(arr_son,attriCnt_son,nt_index_inv);

if(null == nodeList_inv){
nt_index_inv.setValue(key);
nt_index_inv.setClass1(arr_son[0][arr_son[0].length-1]);
}

nt_index_inv.setNodeList(nodeList_inv);

nodeList.add(nt_index_inv);
//clean(String[][] arr, int[] attriCnt, int ind);  //构建并digui
//parti(String[][] arr, int[] attriCnt);
}

return nodeList;
}

public static double getGain(String[][] arr, int[] attriCnt,int ind){       //数据、属性数目,计算曾毅列
int ClassInd = attriCnt[attriCnt.length-1]+1;                            //类数目
int matrix[][] = new int[attriCnt[ind]][ClassInd];                     //曾毅


Map<String,Integer> indOfAttiValue = new HashMap<String,Integer>();
Map<String,Integer> indOfClass = new HashMap<String,Integer>();

for(int i=0; i<arr.length; i++){
if(null == arr[i][ind]){
break;
}
Integer row = indOfAttiValue.get(arr[i][ind]);
Integer col = indOfClass.get(arr[i][ClassInd]);


if(null == row){
row = indOfAttiValue.size();
indOfAttiValue.put(arr[i][ind],indOfAttiValue.size());
}
if(null == col){
col = indOfClass.size();
indOfClass.put(arr[i][ClassInd],indOfClass.size());
}

/*System.out.println(row);
System.out.println(arr[i][ind]);
System.out.println(col);
System.out.println(arr[i][ClassInd]);*/



matrix[row][col]++;
matrix[row][ClassInd-1]++;

//System.out.println();

}


/*System.out.println(attriCnt[ind]);
System.out.println(ClassInd);*/

/*for(int i=0; i<attriCnt[ind]; i++){
for(int j=0; j<ClassInd; j++){
System.out.println(matrix[i][j]);
}
System.out.println();

}*/

float tmp = 0;
float cnt = 0;
double g = 0;
for(int i=0; i<attriCnt[ind]; i++){
for(int j=0; j<ClassInd-1; j++){
//System.out.println(i+","+j+"--->"+matrix[i][ClassInd-1] +"," +matrix[i][j]);
cnt = matrix[i][ClassInd-1];
if((matrix[i][ClassInd-1] != matrix[i][j]) && (0 != matrix[i][j]) ){
//System.out.println(matrix[i][j]+", "+matrix[i][ClassInd-1]);
tmp = matrix[i][j];
float new_tmp = tmp/cnt;
//System.out.println(new_tmp);
g -= new_tmp*log2(new_tmp);
}
}
}

return g;
}

public static void getSon(String[][] arr, int[] attriCnt, int index, String key){
String[][] arr_son = new String[arr[0].length][arr.length] ;
int[] attriCnt_son = new int[attriCnt.length-1];

for(int i=0; i< arr.length; i++){
if(key.equals(arr[i][index])){
int j = 0;
for(int k =0; k<arr[0].length; k++){
if( k != index){
arr_son[j++] = arr[k];
System.out.println(arr[i][k]+",");
}
}
System.out.println();
}
}

int k = 0;
for(int i=0;i<attriCnt.length;i++){
if( i != index){
attriCnt_son[k++] = attriCnt[i];
System.out.println(attriCnt[i]+",");
}
}

/*String[][] arr_son = new String[arr[0].length][arr.length-1] ;
int[] attriCnt_son = new int[attriCnt.length-1];

for(int i=0; i< arr.length; i++){
int j = 0;
for(int k =0; k<arr[0].length; k++){
if( k != index){
arr_son[j++] = arr[k];
System.out.println(arr[i][k]+",");
}
}
System.out.println();
}

int k = 0;
for(int i=0;i<attriCnt.length;i++){
if( i != index){
attriCnt_son[k++] = attriCnt[i];
System.out.println(attriCnt[i]+",");
}
}*/
}

public static double log2(float g){
double a = Math.log10(g);
double b = Math.log10(2.0);
double c =  a/b;
return c;
}

public static void printNode(TreeNode nt, String space){
if(null != nt){
String str = space;
str += "value is: "+nt.getValue();
if(!("".equals(nt.getClass1()))){
str += "; "+"class is: "+nt.getClass1();
}
System.out.println(str);
System.out.println();
List<TreeNode> tn = nt.getNodeList();
if(null != tn){
for(TreeNode n: tn){
printNode(n,space+space);
}
}
System.out.println();
}
}
}


class TreeNode{
TreeNode parent = null;
String value = "";
String Class = "";
List<TreeNode> nodeList = null;

TreeNode(String value){
this.value = value;
}

void setParent(TreeNode parent){
this.parent = parent;
}

void setValue(String value){
this.value = value;
}

void setClass1(String Class){
this.Class = Class;
}

void setNodeList(List<TreeNode> nodeList){
this.nodeList = nodeList;
}

TreeNode getParent(){
return this.parent ;
}

String getValue(){
return  this.value;
}

String getClass1(){
return  this.Class;
}

List<TreeNode> getNodeList(){
return this.nodeList;
}
}









































0 0
原创粉丝点击