📄 dataclustering.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 + -