离散数学最邻近算法实验报告.docx
- 文档编号:4337427
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:24
- 大小:102.90KB
离散数学最邻近算法实验报告.docx
《离散数学最邻近算法实验报告.docx》由会员分享,可在线阅读,更多相关《离散数学最邻近算法实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
离散数学最邻近算法实验报告
最邻近算法实验
1.实验题目:
编程实现P274页的最邻近法(可视化,并给出算法执行过程)。
2.源程序:
packagecom.knn;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.util.HashMap;
importjava.util.List;
importjava.util.ArrayList;
importjava.util.Comparator;
importjava.util.Map;
importjava.util.PriorityQueue;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.JTextField;
importjavax.swing.table.DefaultTableModel;
//KNN结点类,用来存储最近邻的k个元组相关的信息
classKNNNode
{
privateintindex;//元组标号
privatedoubledistance;//与测试元组的距离
privateStringc;//所属类别
publicKNNNode(intindex,doubledistance,Stringc)
{
super();
this.index=index;
this.distance=distance;
this.c=c;
}
publicintgetIndex()
{
returnindex;
}
publicvoidsetIndex(intindex)
{
this.index=index;
}
publicdoublegetDistance()
{
returndistance;
}
publicvoidsetDistance(doubledistance)
{
this.distance=distance;
}
publicStringgetC()
{
returnc;
}
publicvoidsetC(Stringc)
{
this.c=c;
}
}
//KNN算法主体类
classKNN
{
/**
*设置优先级队列的比较函数,距离越大,优先级越高
*/
privateComparator
{
publicintcompare(KNNNodeo1,KNNNodeo2)
{
if(o1.getDistance()>=o2.getDistance())
{
return-1;
}
else
{
return1;
}
}
};
/**
*获取K个不同的随机数
*@paramk随机数的个数
*@parammax随机数最大的范围
*@return生成的随机数数组
*/
publicList
{
List
for(inti=0;i { inttemp=(int)(Math.random()*max); if(! rand.contains(temp)) { rand.add(temp); } else { i--; } } returnrand; } /** *计算测试元组与训练元组之前的距离 *@paramd1测试元组 *@paramd2训练元组 *@return距离值 */ publicdoublecalDistance(List { doubledistance=0.00; for(inti=0;i { distance+=(d1.get(i)-d2.get(i))*(d1.get(i)-d2.get(i)); } returndistance; } /** *执行KNN算法,获取测试元组的类别 *@paramdatas训练数据集 *@paramtestData测试元组 *@paramk设定的K值 *@return测试元组的类别 */ publicStringknn(List { PriorityQueue List for(inti=0;i { intindex=randNum.get(i); List Stringc=currData.get(currData.size()-1).toString(); KNNNodenode=newKNNNode(index,calDistance(testData,currData),c); pq.add(node); } for(inti=0;i { List doubledistance=calDistance(testData,t); KNNNodetop=pq.peek(); if(top.getDistance()>distance) { pq.remove(); pq.add(newKNNNode(i,distance,t.get(t.size()-1).toString())); } } returngetMostClass(pq); } /** *获取所得到的k个最近邻元组的多数类 *@parampq存储k个最近近邻元组的优先级队列 *@return多数类的名称 */ privateStringgetMostClass(PriorityQueue { Map intpqsize=pq.size(); for(inti=0;i { KNNNodenode=pq.remove(); Stringc=node.getC(); if(classCount.containsKey(c)) { classCount.put(c,classCount.get(c)+1); } else { classCount.put(c,1); } } intmaxIndex=-1; intmaxCount=0; Object[]classes=classCount.keySet().toArray(); for(inti=0;i { if(classCount.get(classes[i])>maxCount) { maxIndex=i; maxCount=classCount.get(classes[i]); } } returnclasses[maxIndex].toString(); } } classKNNFrame { privateJFrameframe1=newJFrame("KNN最邻近算法"); privateJLabellabel1=newJLabel("为了方便显示算法可视化,请按照如下步骤操作完成! "); privateJLabellabel2=newJLabel("第一步: 请在表格中输入训练数据。 "); privateJLabellabel3=newJLabel("第二步: 请在表格中输入测试元组数据。 "); privateJLabellabel4=newJLabel("最后一步: 显示比较训练元组和测试元组的相似度类别。 "); privateJButtonbutton1=newJButton("现在去输入"); privateJButtonbutton2=newJButton("现在去输入"); privateJButtonbutton3=newJButton("立刻显示"); //错误窗口。 privateJFrameframe5=newJFrame("错误窗口! "); privateJLabellabel5=newJLabel(); publicstaticintbiaoji_1=0;//标记1。 publicstaticintbiaoji_2=0;//标记2。 publicKNNFrame() { frame1.setSize(700,500); frame1.setLocation(400,100); frame1.setVisible(true); frame1.setLayout(null); frame1.addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEventex) { System.exit (1); } }); label1.setFont(newFont("Serif",Font.BOLD,25)); label1.setBounds(30,1,670,50); label1.setForeground(Color.RED); frame1.add(label1); label2.setFont(newFont("Serif",Font.BOLD,20)); label2.setBounds(5,50,500,50); label2.setForeground(Color.BLUE); frame1.add(label2); button1.setBounds(100,100,150,50); frame1.add(button1); label3.setFont(newFont("Serif",Font.BOLD,20)); label3.setBounds(5,170,500,50); label3.setForeground(Color.BLUE); frame1.add(label3); button2.setBounds(100,220,150,50); frame1.add(button2); label4.setFont(newFont("Serif",Font.BOLD,20)); label4.setBounds(5,300,600,50); label4.setForeground(Color.BLUE); frame1.add(label4); button3.setBounds(100,350,150,50); frame1.add(button3); //按钮一监听表格中输入的训练数据。 button1.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventevt) { biaoji_1=1;//标记1。 newKNNFrame_1(); } }); //按钮二监听表格中输入测试元组的数据。 button2.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventevt) { biaoji_2=1;//标记2。 newKNNFrame_2(); } }); //按钮三显示比较训练元组和测试元组的相似度类别。 button3.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventevt) { if(biaoji_1==1&&biaoji_2==1) newKNNFrame_3(); else { //显示错误窗口。 frame5.setSize(600,150); frame5.setLocation(450,300); frame5.setVisible(true); frame5.setLayout(null); frame5.addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEventex) { frame5.dispose(); } }); label5.setFont(newFont("Serif",Font.BOLD,15)); label5.setForeground(Color.RED); label5.setBounds(5,50,595,20); label5.setText("请先完成以上操作,在表格中输入相关数据,确认数据后再确定相似度类别! ! "); frame5.add(label5); } } }); } } //按钮一窗口。 classKNNFrame_1 { privateJFrameframe2=newJFrame("KNN最邻近算法"); privateJLabellabel1=newJLabel("请先输入表格的相关信息。 "); privateJLabellabel2=newJLabel("表格的行数: "); privateJTextFieldtext1=newJTextField(); privateJLabellabel3=newJLabel("表格的列数: "); privateJTextFieldtext2=newJTextField(); privateJButtonbutton1=newJButton("确定"); privateJLabellabel4=newJLabel("请在表格中输入训练数据。 "); privateJButtonbutton2=newJButton("确定表格数据"); privateJScrollPanescrollPane1=null; privateJTabletable1=null; publicstaticintbiaoji_1=0;//标记1。 publicstaticdoubletraining_data[][];//存储训练数据。 publicKNNFrame_1() { frame2.setSize(600,540); frame2.setLocation(450,150); frame2.setVisible(true); frame2.setLayout(null); frame2.addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEventex) { frame2.dispose(); } }); label1.setFont(newFont("Serif",Font.BOLD,25)); label1.setBounds(150,1,500,50); label1.setForeground(Color.RED); frame2.add(label1); label2.setFont(newFont("Serif",Font.BOLD,15)); label2.setBounds(100,50,100,30); frame2.add(label2); text1.setBounds(200,50,50,30); frame2.add(text1); label3.setFont(newFont("Serif",Font.BOLD,15)); label3.setBounds(100,90,100,30); frame2.add(label3); text2.setBounds(200,90,50,30); frame2.add(text2); button1.setBounds(270,60,150,50); frame2.add(button1); label4.setFont(newFont("Serif",Font.BOLD,20)); label4.setBounds(150,130,500,30); label4.setForeground(Color.BLUE); frame2.add(label4); button2.setBounds(200,430,180,50); frame2.add(button2); button1.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventevt) { try { biaoji_1=1; //行数。 Stringrow=text1.getText(); introwi=Integer.parseInt(row); //列数。 Stringcolumn=text2.getText(); intcolumnj=Integer.parseInt(column); //用表格显示数据。 Stringtitles[]=newString[columnj]; for(intj=0;j titles[j]="训练数据"+(j+1); titles[columnj-1]="类别"; StringuserInfo[][]=newString[rowi][columnj]; DefaultTableModeltableModel=newDefaultTableModel(userInfo,titles); table1=newJTable(tableModel); scrollPane1=newJScrollPane(table1); scrollPane1.setBounds(10,170,580,250); frame2.add(scrollPane1); }catch(Exceptione) { e.printStackTrace(); } } }); button2.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventevt) { if(biaoji_1==1) { //设置表格为不可编辑。 table1.getCellEditor().stopCellEditing(); table1.setRowSelectionInterval(0,0); table1.setEnabled(false); //获取表格中的数据。 Stringrow=text1.getText(); introwi=Integer.parseInt(row); //列数。>datas,List
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 离散数学 邻近 算法 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)