⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataclustering.java

📁 数据挖掘算法的实现
💻 JAVA
字号:
import java.util.LinkedList;
import java.awt.Button;
import java.awt.Font;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

import java.util.Date;

public class DataClustering 
{
     public static int kindOfAttack;    //攻击类型
     public static String []stringAttack;    //攻击类型存放的数组
     private float [][]matrix = new float[1500][1500];   //距离矩阵
     public static float wrongNumber = 0;      //误报个数
     public static float lostNumber = 0;      //漏报个数
     public static float attackAll = 0;      //数据中总的攻击条数
     public static float normalAll = 0;     //数据中总的正常条数

 	private JFrame f;
	private MenuBar mb;
	private Menu mSystem,mGuide,mHelp,mIntroduce;
	private MenuItem mIDSIntroduce,mArithmetic,mExit,mFunction,mHowToUse,mAbout;
	private Button mReadDataButton,mNextButton;
	public static TextArea mOutput;
	
     public DataClustering()
     {   f = new JFrame("入侵检测系统 谢松林 ");
		mb = new MenuBar();
		mSystem = new Menu("系统");
		mGuide = new Menu("指南");
		
		mHelp = new Menu("帮助");
		mIntroduce = new Menu("简介");
		
		mExit = new MenuItem("退出");
		mIDSIntroduce = new MenuItem("IDS简介");
		mArithmetic = new MenuItem("算法简介");
		mFunction = new MenuItem("功能指南");
		mHowToUse = new MenuItem("使用指南");
		mAbout = new MenuItem("关于");
		
		mExit.addActionListener(new MenuActionController());
		mIDSIntroduce.addActionListener(new MenuActionController());
		mArithmetic.addActionListener(new MenuActionController());
		mFunction.addActionListener(new MenuActionController());
		mHowToUse.addActionListener(new MenuActionController());
		mHowToUse.addActionListener(new MenuActionController());
		mAbout.addActionListener(new MenuActionController());
	
		f.setLayout(null);
		f.setMenuBar(mb);
		mb.add(mSystem);
		mb.add(mGuide);
		mb.add(mHelp);
	
		mSystem.add(mIntroduce);
		mIntroduce.add(mIDSIntroduce);
		mIntroduce.add(mArithmetic);
		mSystem.add(mExit);
		mSystem.addSeparator();
		
		mGuide.add(mFunction);
		mGuide.add(mHowToUse);
		mGuide.addSeparator();
		
		mHelp.add(mAbout);
		mHelp.addSeparator();
				    
	    mReadDataButton = new Button("开始聚类");
	    mReadDataButton.setFont(new Font("Simsun",Font.PLAIN,20));
	    mReadDataButton.addActionListener(new MenuActionController());
        mReadDataButton.setBounds(10,310,150,50);
	    f.add(mReadDataButton);
	    
	    mNextButton = new Button("下一步");
	    mNextButton.setName("下一步");
	    mNextButton.setFont(new Font("Simsun",Font.PLAIN,20));
	    mNextButton.addActionListener(new MenuActionController());
	    //mNextButton.setLocation(400,400);
	    mNextButton.setBounds(260,310,100,50);
	    f.add(mNextButton);
	    
	    mOutput = new TextArea();
	    mOutput.append("相关信息输出区\n");
	    mOutput.setBounds(0,0,400,300);
	    f.add(mOutput);
	    
		f.setSize(420,450);
		f.setLocation(200,200);
		f.setVisible(true);
				
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(1);
			}
		});				
     }
     private class MenuActionController implements ActionListener
 	{
 		public MenuActionController()
 		{
 			
 		}
 		
 		public void actionPerformed(ActionEvent e) 
 		{ 
 			String label = e.getActionCommand();
 			if (label.equals("IDS简介"))
 			{
 				IDSIntroduceFace iif = new IDSIntroduceFace(); 
 			}
 			else if (label.equals("算法简介"))
 			{
 				ArithmeticFace af = new ArithmeticFace();
 			}
 			else if (label.equals("退出"))
 			{
 				System.exit(1);
 			}
 			else if (label.equals("功能指南"))
 			{
 				FunctionFace ff = new FunctionFace();
 			}
 			else if (label.equals("使用指南"))
 			{
 				UseFace uf = new UseFace();
 			}
 			else if (label.equals("关于"))
 			{
 				AboutFace abf = new AboutFace();
 			}
 			else if (label.equals("开始聚类"))
 			{
 		    	 GetAboutNumber();
 		    	 System.out.println("GetAboutNumber OK!!!");
 		    	 mOutput.append("GetAboutNumber OK!!!\n");
 		    	 GetMatrix();
 		    	 System.out.println("GetMatrix OK!!!");
 		    	 mOutput.append("GetMatrix OK!!!\n");
 		    	 Clustering();
 		    	 System.out.println("Clustering OK!!!");
 		    	 mOutput.append("Clustering OK!!!\n");
 			}
 			else if(label.equals("下一步"))
 			{
 				System.out.println("测试新数据");
 				mOutput.append("测试新数据\n");
 				f.dispose();
 				DataTest dc = new DataTest();
 			}
 		}
 	}
     public void GetAboutNumber()
     {
    	System.out.println("正在获取相关参数~~~~");
    	mOutput.append("正在获取相关参数~~~~\n");
        LinkedList linklist = new LinkedList();
        String s = new String();
         s = ReadData.dataArray[0].type;
         linklist.addLast(s);
    	 for(int k = 1;k < ReadData.noSameNumber;k++)
    	 {
              s = ReadData.dataArray[k].type;
              if(linklist.contains(s))
            	  continue;
              else
                 linklist.addLast(s);
    	 }
   	 
         kindOfAttack = linklist.size();
     	 System.out.println("数据类型一共有"+kindOfAttack+"种");	
     	 mOutput.append("数据类型一共有"+kindOfAttack+"种\n");
    	 for(int j = 0;j < linklist.size();j++)
    	 {
            System.out.println(linklist.get(j));
            mOutput.append(linklist.get(j).toString()+"\n");
    	 }
     	 stringAttack = new String[kindOfAttack];
    	 for(int j = 0;j < kindOfAttack;j++)
    	 {
    		stringAttack[j] = (String) linklist.getFirst();
    		linklist.removeFirst();
    	 }
     }
     public void GetMatrix()
     {
    	 System.out.println("正在生成距离矩阵~~~~");
    	 mOutput.append("正在生成距离矩阵~~~~\n");
    	 for(int i = 0;i < ReadData.noSameNumber;i++)
    	 {
    		 for(int j = 0;j <= i;j++)
    		 {   
    			 matrix[i][j] = GetValue(i,j);
    			 //System.out.print(matrix[i][j]+" ");
    		 }
    		// System.out.println();
    	 }
     }
     public float GetValue(int m,int n)     //求相似度
     {
    	 double value = 0;
    	 double x = 0;
    	 double y = 0;
    	 for(int i = 0;i < DealData.attribute;i++)
    	 {
    		 x = ReadData.dataArray[m].data[i];  //消除单个属性的影响
    		 y = ReadData.dataArray[n].data[i];
    		 
             if(x > 1)                          //数据归一化处理
            	 x = 1 - 1/x;
             if(y > 1)
            	 y = 1 - 1/y;
    		 
    		 double temp = x - y;
    		 //double temp = (ReadData.dataArray[m].data[i] - ReadData.dataArray[n].data[i]);
    		 value += Math.pow(temp,2);  
    		 //value += temp; 
    	 }    	 
    	 return (float)value;
    		 
     }
     public float GetNamedValue(int mun)//取第m小的数据
     {
    	 float temp = 100 ;
         float []array = new float[1500*750];
         array[0] = matrix[0][0];
    	 int count = 1;   //一维数据计数
         for(int i = 0;i < ReadData.noSameNumber;i++)
         {
        	 for(int j = 0;j <= i;j++)
        	 {
        		 if(!contain(array,count,matrix[i][j]))
        		 {
        			 array[count] = matrix[i][j];
        			 count++;
        		 }
        	 }
         }
/*         for(int i = 0;i < count;i++)    //起泡排序
         {
        	 for(int j = i+1;j < count;j++)
        		 if(array[j] < array[i])
        		 {
        			 float t = array[i];
        			 array[i] = array[j];
        			 array[j] = t;
        		 }
         }*/
         
         int gap = count/2;      //shell排序,gap为增量初值
         float x;
         while(gap > 0)
         {
        	 for(int m = gap + 1;m <= count;m++)
        	 {
        		 int n = m - gap;
        		 while(n > 0)
        		 {
        			 if(array[n] > array[n + gap])
        			 {
        				 x = array[n];
        				 array[n] = array[n + gap];
        				 array[n + gap] = x;
        				 n = n - gap;
        			 }
        			 else n = 0;
        		 }
        	 }
        	 gap = gap/2;
         }
         
         temp = array[mun];
    	 return temp;
     }
     public boolean contain(float a[],int m,float n)
     {
    	 boolean flag = false;
    	 for(int i = 0;i < m;i++)
    	 {
    		 if(a[i] == n)
    		 {
    			 flag = true;
    			 break;
    		 }
    	 }   	 
    	 return flag;
     }
     public static void UnitTwoLink(LinkedList list[],int n)
     {
     	for(int i = 0;i < n-1;i++)
     	{
     		for(int j = 0;j < list[i].size();j++)
     		{
     		  Object object = list[i].get(j);
               if(list[n-1].contains(object))
                 {
             	  list[i].addAll(list[n-1]);
             	  list[n-1].clear();
             	  n--;
             	  for(int a = 0;a < list[i].size()-1;a++)  //合并相同数据
             	  {
             		  for(int b = a+1;b < list[i].size();b++)
             		  {
             			  if(list[i].get(a).equals(list[i].get(b)))
             				  list[i].remove(b);
             		  }
             	  }
             	  return ;
                 }
     		  }   		
     		}
     }
     public void Clustering()
     {
    	 Date firstDate = new Date();
    	 long startTime = firstDate.getTime();
    	 System.out.println("开始聚类");
    	 mOutput.append("开始聚类\n");
    	 LinkedList []list = new LinkedList[1500];
    	 int n = 0;   //记录list的数目
    	 float bigvalue = GetNamedValue(12665);//124665为测试出来的分界值,1665
    	 //float bigvalue = 1.0f;  //2100为测试出来的分界值
    	 System.out.println("分界值="+bigvalue);
    	 mOutput.append("分界值="+bigvalue+"\n");
    	 boolean flag = true;   //是否创建list
    	  for(int i = 0;i < ReadData.noSameNumber;i++)
    	 {
    	    	 if(i == 0)
    	    	 {
        	    	list[n] = new LinkedList();
     		        for(int j = i;j < ReadData.noSameNumber;j++)
    		        {
    		    	   if(matrix[j][i] < bigvalue)   //否则取<
    		    	    {
    		    		 list[n].add(new Integer(j));
    		    	    }
    		        } 
     		        n++;
     		        //continue;
    	    	 }
    	    	 else
    	    	 {   	    
    		     for(int m = 0;m < n;m++)
    		      {
    			    if(list[m].contains(new Integer(i)))
    			     {
    			    	flag = false;   
    			    	break;
    			     } 
    			    flag = true;
    		      }
                   if(flag)                	   
                   {
    		    	list[n] = new LinkedList(); 		    	 
    		        for(int j = i;j < ReadData.noSameNumber;j++)
    		        {
    		    	   if(matrix[j][i] < bigvalue)    //否则取<
    		    	    {
    		    		 list[n].add(new Integer(j));
    		    	    }
    		        }  
  		    	     n++;
   		    	     UnitTwoLink(list,n);
                   }
    	    	 }
    	 }
     	 ClusteringResult cr = new ClusteringResult();
    	 for(int j = 0,k = 0;j < n;j++)
    	 {
    		 if(!list[j].isEmpty())
    		 {  			
    		     k++;
    		     System.out.println("第"+k+"类"+":"+list[j]);
    		     //mOutput.append("第"+k+"类"+":"+list[j]);
    		     cr.mOutputFace.append("第"+k+"类"+":"+list[j]+"\n");
		    	 int y = 0;
    		     for(int m = 0;m < list[j].size();m++)
    		     {
    		    	 int z = Integer.parseInt(list[j].get(y).toString());
    		    	 y++;
    		    	 cr.mOutputFace.append("数据");
       		    	 for(int x = 0;x < DealData.attribute;x++)
       		    	 {      		    		 
    		    		 System.out.print(ReadData.dataArray[z].data[x]);
    		    		// mOutput.append(Double.toString(ReadData.dataArray[z].data[x])+" ");
    		    		 cr.mOutputFace.append(Double.toString(ReadData.dataArray[z].data[x])+"  ");
       		    	 }
    		    		
       		    	 if(k == 1)     //第一个list中计划装正常的
    		    	  {
    		    		 if(ReadData.dataArray[z].type.startsWith("normal")) //normal\n,不用equals
    		    			normalAll++;      
    		    		 else 
    		    			lostNumber++;    	//计算漏报个数	    
    		    		 System.out.println("  "+ReadData.dataArray[z].type);
        		    	 //mOutput.append("   "+ReadData.dataArray[z].type+"\n");
        		    	 cr.mOutputFace.append("   "+ReadData.dataArray[z].type+"\n");
    		    	  }
    		    	else 
    		    	 {
    		    		if(ReadData.dataArray[z].type.startsWith("normal"))
    		    		 {
    		    			wrongNumber++;     //计算误报个数
    		    			normalAll++;
    		    		 }
       		    	 System.out.println("  "+ReadData.dataArray[z].type);
    		    	 //mOutput.append("  "+ReadData.dataArray[z].type+"\n");
    		    	 cr.mOutputFace.append("攻击,类型为:"+ReadData.dataArray[z].type+"\n");
    		    	 }
       		    	       		    	 
    		     }
    		 }
    	 }
    	 attackAll = ReadData.noSameNumber - normalAll;
    	 //System.out.println(wrongNumber);
    	 //System.out.println(lostNumber);
    	 //System.out.println(normalAll);
    	 
    	 System.out.println("误报率="+(wrongNumber/normalAll)*100+"%");
    	 mOutput.append("误报率="+(wrongNumber/normalAll)*100+"%\n");
    	 cr.mOutputFace.append("误报率="+(wrongNumber/normalAll)*100+"%\n");
    	 System.out.println("漏报率="+(lostNumber/attackAll)*100+"%");
    	 mOutput.append("漏报率="+(lostNumber/attackAll)*100+"%\n");
    	 cr.mOutputFace.append("漏报率="+(lostNumber/attackAll)*100+"%\n");
    	 System.out.println("聚类完毕");
    	 mOutput.append("聚类完毕\n");
    	 
    	 Date secondDate = new Date();
    	 long endTime = secondDate.getTime();
    	 long runTime = endTime - startTime;
    	 System.out.println("运行时间:"+runTime+"s");
    	 mOutput.append("运行时间:"+runTime+"s\n");
     }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -