Flask接口签名sign原理与实例代码浅析
425
2023-01-28
Java实现的KNN算法示例
本文实例讲述了java实现的KNN算法。分享给大家供大家参考,具体如下:
提起KNN算法大家应该都不会陌生,对于数据挖掘来说算是十大经典算法之一。
算法的思想是:对于训练数据集中已经归类的分组,来对于未知的数据进行分组归类。其中是根据该未知点与其训练数据中的点计算距离,求出距离最短的点,并将其归入该点的那一类。
看看算法的工程吧:
1. 准备数据,对数据进行预处理
2. 选用合适的数据结构存储训练数据和测试元组
3. 设定参数,如k
4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列
5. 遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L 与优先级队列中的最大距离Lmax
6. 进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L < Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队 列。
7. 遍历完毕,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别。
8. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值。
根据算法的过程我们进行java语言实现:
package KNN;
/**
* 点的坐标 x 、y
* @author Administrator
*
*/
public class PointBean {
int x;
int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public PointBean(int x, int y) {
super();
this.x = x;
this.y = y;
}
public PointBean() {
super();
}
@Override
public String toString() {
return "PointBean [x=" + x + ", y=" + y + "]";
}
}
KNN算法
package KNN;
import java.util.ArrayList;
/**
* KNN实现的方法
* @author Administrator
*
*/
public class KnnMain {
public double getPointLength(ArrayList
int bxWEweMTJKK_x=bb.getX();
int b_y=bb.getY();
double temp=(b_x -list.get(0).getX())*(b_x -list.get(0).getX())+
(b_y -list.get(0).getY())*(b_y -list.get(0).getY());
// 找出最小的距离
for(int i=1;i if(temp<((b_x -list.get(i).getX())*(b_x -list.get(i).getX())+ (b_y -list.get(i).getY())*(b_y -list.get(i).getY()))){ temp=(b_x -list.get(i).getX())*(b_x -list.get(i).getX())+ http:// (b_y -list.get(i).getY())*(b_y -list.get(i).getY()); } } return Math.sqrt(temp); } /** * 获取长度,找出最小的一个进行归类 * @param list1 * @param list2 * @param list3 * @param bb */ public void getContent(ArrayList ArrayList double A=getPointLength(list1,bb); double B=getPointLength(list2,bb); double C=getPointLength(list3,bb); //做出比较 if(A>B){ if(B>C){ System.out.println("这个点:"+bb.getX()+" , "+bb.getY()+" " +"属于C"); }else { System.out.println("这个点:"+bb.getX()+" , "+bb.getY()+" " +"属于B"); } }else { if(A>C){ System.out.println("这个点:"+bb.getX()+" , "+bb.getY()+" " +"属于C"); }else { System.out.println("这个点:"+bb.getX()+" , "+bb.getY()+" " +"属于A"); } } } } 主函数 package KNN; import java.util.ArrayList; /* * 主函数 KNN */ public class TestJava { static ArrayList< PointBean> listA; static ArrayList< PointBean> listB; static ArrayList< PointBean> listC; static ArrayList< PointBean> listD; public static void main(String[] args) { //创佳Arraylist listA=new ArrayList listB=new ArrayList listC=new ArrayList listD=new ArrayList //写入数据 setDate(); getTestResult(); } /** * 得到结果 */ private static void getTestResult() { //创建对象 KnnMain km=new KnnMain(); for(int i=0;i km.getContent(listA, listB, listC, listD.get(i)); } } /** * 写入数据 */ private static void setDate() { //A的坐标点 int A_x[]={1,1,2,2,1}; int A_y[]={0,1,1,0,2}; //B的坐标点 int B_x[]={2,3,3,3,4}; int B_y[]={4,4,3,2,3}; //C的坐标点 int C_x[]={4,5,5,6,6}; int C_y[]={1,2,0,2,1}; // 测试数据 //B的坐标点 int D_x[]={3,3,3,0,5}; int D_y[]={0,1,5,0,1}; // PointBean bA; for(int i=0;i<5;i++){ bA=new PointBean(A_x[i], A_y[i]); listA.add(bA); } // PointBean bB ; for(int i=0;i<5;i++){ bB=new PointBean(B_x[i], B_y[i]); listB.add(bB); } // PointBean bC ; for(int i=0;i<5;i++){ bC=new PointBean(C_x[i], C_y[i]); listC.add(bC); } // PointBean bD ; for(int i=0;i<5;i++){ bD=new PointBean(D_x[i], D_y[i]); listD.add(bD); } } } 测试的结果: 这个点:3 , 1 属于A 这个点:3 , 5 属于B 这个点:0 , 0 属于A 这个点:5 , 1 属于C 到此简单的KNN算法已经实现对于未知点的划分,有助于大家对于KNN算法的理解。对于改进KNN的一些算法JAVA实现会在后面进行贴出。共同学习共同进步! 更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》 希望本文所述对大家java程序设计有所帮助。
if(temp<((b_x -list.get(i).getX())*(b_x -list.get(i).getX())+
(b_y -list.get(i).getY())*(b_y -list.get(i).getY()))){
temp=(b_x -list.get(i).getX())*(b_x -list.get(i).getX())+
http:// (b_y -list.get(i).getY())*(b_y -list.get(i).getY());
}
}
return Math.sqrt(temp);
}
/**
* 获取长度,找出最小的一个进行归类
* @param list1
* @param list2
* @param list3
* @param bb
*/
public void getContent(ArrayList
ArrayList
double A=getPointLength(list1,bb);
double B=getPointLength(list2,bb);
double C=getPointLength(list3,bb);
//做出比较
if(A>B){
if(B>C){
System.out.println("这个点:"+bb.getX()+" , "+bb.getY()+" " +"属于C");
}else {
System.out.println("这个点:"+bb.getX()+" , "+bb.getY()+" " +"属于B");
}
}else {
if(A>C){
System.out.println("这个点:"+bb.getX()+" , "+bb.getY()+" " +"属于C");
}else {
System.out.println("这个点:"+bb.getX()+" , "+bb.getY()+" " +"属于A");
}
}
}
}
主函数
package KNN;
import java.util.ArrayList;
/*
* 主函数 KNN
*/
public class TestJava {
static ArrayList< PointBean> listA;
static ArrayList< PointBean> listB;
static ArrayList< PointBean> listC;
static ArrayList< PointBean> listD;
public static void main(String[] args) {
//创佳Arraylist
listA=new ArrayList
listB=new ArrayList
listC=new ArrayList
listD=new ArrayList
//写入数据
setDate();
getTestResult();
}
/**
* 得到结果
*/
private static void getTestResult() {
//创建对象
KnnMain km=new KnnMain();
for(int i=0;i km.getContent(listA, listB, listC, listD.get(i)); } } /** * 写入数据 */ private static void setDate() { //A的坐标点 int A_x[]={1,1,2,2,1}; int A_y[]={0,1,1,0,2}; //B的坐标点 int B_x[]={2,3,3,3,4}; int B_y[]={4,4,3,2,3}; //C的坐标点 int C_x[]={4,5,5,6,6}; int C_y[]={1,2,0,2,1}; // 测试数据 //B的坐标点 int D_x[]={3,3,3,0,5}; int D_y[]={0,1,5,0,1}; // PointBean bA; for(int i=0;i<5;i++){ bA=new PointBean(A_x[i], A_y[i]); listA.add(bA); } // PointBean bB ; for(int i=0;i<5;i++){ bB=new PointBean(B_x[i], B_y[i]); listB.add(bB); } // PointBean bC ; for(int i=0;i<5;i++){ bC=new PointBean(C_x[i], C_y[i]); listC.add(bC); } // PointBean bD ; for(int i=0;i<5;i++){ bD=new PointBean(D_x[i], D_y[i]); listD.add(bD); } } } 测试的结果: 这个点:3 , 1 属于A 这个点:3 , 5 属于B 这个点:0 , 0 属于A 这个点:5 , 1 属于C 到此简单的KNN算法已经实现对于未知点的划分,有助于大家对于KNN算法的理解。对于改进KNN的一些算法JAVA实现会在后面进行贴出。共同学习共同进步! 更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》 希望本文所述对大家java程序设计有所帮助。
km.getContent(listA, listB, listC, listD.get(i));
}
}
/**
* 写入数据
*/
private static void setDate() {
//A的坐标点
int A_x[]={1,1,2,2,1};
int A_y[]={0,1,1,0,2};
//B的坐标点
int B_x[]={2,3,3,3,4};
int B_y[]={4,4,3,2,3};
//C的坐标点
int C_x[]={4,5,5,6,6};
int C_y[]={1,2,0,2,1};
// 测试数据
//B的坐标点
int D_x[]={3,3,3,0,5};
int D_y[]={0,1,5,0,1};
//
PointBean bA;
for(int i=0;i<5;i++){
bA=new PointBean(A_x[i], A_y[i]);
listA.add(bA);
}
//
PointBean bB ;
for(int i=0;i<5;i++){
bB=new PointBean(B_x[i], B_y[i]);
listB.add(bB);
}
//
PointBean bC ;
for(int i=0;i<5;i++){
bC=new PointBean(C_x[i], C_y[i]);
listC.add(bC);
}
//
PointBean bD ;
for(int i=0;i<5;i++){
bD=new PointBean(D_x[i], D_y[i]);
listD.add(bD);
}
}
}
测试的结果:
这个点:3 , 1 属于A
这个点:3 , 5 属于B
这个点:0 , 0 属于A
这个点:5 , 1 属于C
到此简单的KNN算法已经实现对于未知点的划分,有助于大家对于KNN算法的理解。对于改进KNN的一些算法JAVA实现会在后面进行贴出。共同学习共同进步!
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~