数据挖掘Java——KNN算法的实现

news2024/9/20 20:41:07

一、KNN算法的前置知识

k-近邻(kNN, k-NearestNeighbor)是在训练集中选取离输入的数据点最近的k个邻居,根据这个k个邻居中出现次数最多的类别(最大表决规则),作为该数据点的类别。

分类在数据挖掘中是一项非常重要的任务。分类的目的是学会一个分类函数或分类模型(也常常称作分类器),该模型能把数据库中的数据项映射到给定类型中的某一个类别。分类可用于预测。预测的目的是从历史数据记录中自动推导出对给定数据的趋势描述,从而能对未来数据进行预测。统计学中常用的预测方法是回归。数据挖掘中的分类和统计学中的回归方法是一对相互联系又有区别的概念。一般地,分类的输出是离散的类别值,而回归的输出则是连续数值。

相似性:给定一个数据库D={t1,t2,…,tn}和一组类C={C1,C2,…,Cm}。对于任意的元组ti={ti1,ti2,…,tik}∈D,如果存在一个Cj∈C,使得sim(ti,Cj)≥sim(ti,Cp),存在Cp∈C,Cp≠Cj,则ti被分配到类Cj中,其中sim(ti,Cj)称为相似性。在实际的计算中往往用距离来表征,距离越近,相似性越大,距离越远,相似性越小。

为了计算相似性,需要首先得到表示每个类的向量。计算方法有多种,例如代表每个类的向量可以通过计算每个类的中心来表示。另外,在模式识别中,一个预先定义的图像用于代表每个类,分类就是把待分类的样例与预先定义的图像进行比较。

二、KNN算法的基本思想

KNN算法的思想比较简单。假定每个类包含多个训练数据,且每个训练数据都有一个唯一的类别标记,KNN算法的主要思想就是计算每个训练数据到待分类元组的距离,取和待分类元组距离最近的k个训练数据,k个数据中哪个类别的训练数据占多数,则待分类元组就属于哪个类别。

三、KNN算法和强关联规则挖掘的例子

KNN算法例子
在这里插入图片描述
在这里插入图片描述

四、KNN算法的实现过程

实验内容
某班有14个同学,已登记身高及等级,新同学易昌,身高174cm,等级是什么。请用knn算法进行分类识别,其中k=5。
在这里插入图片描述

实验思路
(1)定义学生类Student,学生类中定义姓名,身高,等级等属性,利用lombok依赖的@Data注解对Student类的get和set方法进行注入。定义初始数据集,定义14个实体学生类,将14个实体Student类添加到初始数据集dataList中。
(2)调用initData()方法对数据集进行初始化,定义一个Student类stuV0并对其姓名和身高进行实例化作为输入,调用Knn()方法,得到含有等级的Student类对象student,将对象student进行输出。
(3)在Knn()方法体内部,初始时将数据集的前5项加入到categoryList集合中,categoryList集合用于存放距离stuV0最近的k个学生,只是最初存放数据集的前5项而已。遍历数据集dataList,计算stuV0距离从数据集的第6项开始的每一项的距离v0Tod,另外调用getCalculate()方法计算出stuV0距离categoryList集合中最远的学生对象stuU,若stuU距离stuV0的身高距离uToV0大于v0Tod,则在categoryList中去除掉stuU,将数据集中的该项加入到categoryList集合中来。
(4)在getCalculate()方法体内部,定义变量maxHeight用于存放stuV0与类别集合categoryList的最远距离,定义Student类对象resultStu用于存放要返回的学生,即stuV0与类别集合categoryList距离最远的学生。遍历categoryList集合,若stuU与stuV0之间的距离大于maxHeight,则将v0ToU赋值给maxHeight,将stuU赋值给resultStu,最终将Student类对象resultStu返回。
(5)调用getCategoryStudent()方法找出categoryList中同等级占比最多的学生等级rank,最终用rank实例化stuV0的rank属性,返回stuV0。
(6)在getCategoryStudent()方法体内部,遍历categoryList,找出同等级占比最多的学生等级,其实就是找等级“高”、等级“中等”,等级“矮”的学生哪个类别的学生数量最多,并将学生数量最多的那个类别返回。

实现源码

学生类
package com.data.mining.entity;

import lombok.Data;

@Data
public class Student {
    private String name;
    private int height;
    private String rank;

    public Student(){}

    public Student(String n, int h){
        name = n;
        height = h;
    }

    public Student(String n, int h, String r){
        name = n;
        height = h;
        rank = r;
    }
}

KNN算法实现代码
package com.data.mining.main;

import com.data.mining.entity.Student;

import java.util.ArrayList;
import java.util.List;

public class Knn {
    //定义初始数据集
    public static List<Student> dataList = new ArrayList<>();

    public static void main(String[] args) {
        initData();
        Student stuV0 = new Student("易昌", 174);
        Student student = Knn(stuV0);
        System.out.println(student.toString());
    }

    /**
     * 找出同等级占比最多的学生等级
     * @param categoryList
     * @return
     */
    public static String getCategoryStudent(List<Student> categoryList){
        int tallCount = 0;
        int midCount = 0;
        int smallCount = 0;
        for (Student stuU : categoryList) {
            if (stuU.getRank().equals("高")) tallCount++;
            else if (stuU.getRank().equals("中等")) midCount++;
            else smallCount++;
        }
        int max = 0;
        max = tallCount > midCount ? tallCount : midCount;
        max = smallCount > max ? smallCount : max;
        if (smallCount == max) return "矮";
        else if (tallCount == max) return "高";
        else return "中等";
    }

    /**
     * 计算出stuV0距离categoryList集合中最远的学生对象
     * @param stuV0
     * @param categoryList
     * @return
     */
    public static Student getCalculate(Student stuV0, List<Student> categoryList) {
        int maxHeight = 0; //存放stuV0与类别集合categoryList的最远距离
        Student resultStu = new Student(); //存放要返回的学生,即stuV0与类别集合categoryList距离最远的学生
        for (Student stuU : categoryList) {
            int v0ToU = Math.abs(stuV0.getHeight() - stuU.getHeight()); //stuV0与stuU的距离
            if (v0ToU > maxHeight){ //stuV0与stuU的距离大于maxHeight,则对maxHeight和resultStu进行更新
                maxHeight = v0ToU;
                resultStu = stuU;
            }
        }
        return resultStu;
    }

    /**
     * 对输入学生类进行Knn算法实例化该学生的等级后,将该学生返回
     * @param stuV0
     * @return
     */
    public static Student Knn(Student stuV0){
        List<Student> categoryList = new ArrayList<>(); //存放距离stuV0最近的k个学生,最初存放数据集的前5项
        for (int i = 0; i < dataList.size(); i++) {
            if (i < 5) categoryList.add(dataList.get(i));
            else {
                //stuV0距离剩下数据集中某项的距离
                int v0Tod = Math.abs(stuV0.getHeight() - dataList.get(i).getHeight());
                Student stuU =  getCalculate(stuV0, categoryList); //存放stuV0距离类别集合中最远的学生
                int uToV0 = Math.abs(stuU.getHeight() - stuV0.getHeight());
                if (uToV0 > v0Tod){
                    categoryList.remove(stuU); //在集合列表中去除stuU
                    categoryList.add(dataList.get(i));
                }
            }
        }
        System.out.println(categoryList.toString());
        String rank = getCategoryStudent(categoryList);
        stuV0.setRank(rank);

        return stuV0;
    }


    /**
     * 初始化数据
     */
    public static void initData(){
        Student s1 = new Student("李丽", 150, "矮");
        Student s2 = new Student("吉米", 192, "高");
        Student s3 = new Student("马大华", 170, "中等");
        Student s4 = new Student("王晓华", 173, "中等");
        Student s5 = new Student("刘敏", 160, "矮");
        Student s6 = new Student("张强", 175, "中等");
        Student s7 = new Student("李秦", 160, "矮");
        Student s8 = new Student("王壮", 190, "高");
        Student s9 = new Student("刘冰", 168, "中等");
        Student s10 = new Student("张喆", 178, "中等");
        Student s11 = new Student("杨毅", 170, "中等");
        Student s12 = new Student("徐田", 168, "中等");
        Student s13 = new Student("高杰", 165, "矮");
        Student s14 = new Student("张晓", 178, "中等");

        dataList.add(s1);
        dataList.add(s2);
        dataList.add(s3);
        dataList.add(s4);
        dataList.add(s5);
        dataList.add(s6);
        dataList.add(s7);
        dataList.add(s8);
        dataList.add(s9);
        dataList.add(s10);
        dataList.add(s11);
        dataList.add(s12);
        dataList.add(s13);
        dataList.add(s14);
    }
}

实验结果
在这里插入图片描述
另外,除了输出题目要求的学生身高等级外,笔者还输出了输入学生所在的簇,以对照题目确保结果正确。
在这里插入图片描述

五、实验总结

本实验结果笔者并不保证一定是正确的,笔者仅仅是提供一种使用Java语言实现KNN算法的思路。因为实验并没有给答案,笔者已将网络上有答案的实验数据输入程序后,程序输出的结果和答案一致,所以问题应该不大。若有写的不到位的地方,还请各位多多指点!
笔者主页还有其他数据挖掘算法的总结,欢迎各位光顾!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

底层网络知识详解:陌生的数据中心-第18讲-DNS协议:网络世界的地址簿

前面我们讲了平时常见的看新闻、支付、直播、下载等场景,现在网站的数目非常多,常用的网站就有二三十个,如果全部用IP地址进行访问,恐怕很难记住。于是,就需要一个地址簿,根据名称,就可以查看具体的地址。 例如,我要去西湖边的“外婆家”,这就是名称,然后通过地址簿…

Linux运维巡检流程工作总结

文章目录一 执行脚本获取数据二 登陆巡检环境2.1 将数据放在特定目录下2.2 在网页浏览器输入 ip:端口号/linux三 生成报告3.1 点击执行按钮&#xff0c;等待报告3.2 点击生成html文档&#xff0c;等待四 编写巡检文档4.1 提取所有检查的服务器IP、主机名、操作系统4.2 提取某些…

js实现放大镜效果

在我们平时见到很多购物网站都会有放大镜效果的出现&#xff0c;当我们将鼠标放在一个商品图片的上面&#xff0c;就会在旁边出现对应的放大效果。 效果图 实现步骤 实现原理是非常简单的&#xff0c;实际上是两张图片&#xff0c;一张原图和一张更大尺寸的图片。一开始通过c…

如何mount到网络为NAT方式的虚拟机

VMware Workstation我们一般两种虚拟机上网方式&#xff0c;一种bridge,一种NAT。bridge可以获得公网地址需要指定静态IP&#xff0c;而NAT是动态分配的内网地址了。设置bridge方式时往往指定的IP为内网IP&#xff0c;则无法正常上网&#xff1b;而设置NAT方式时共享本地网络可…

计算机毕业设计 HTML+CSS+JavaScript食品餐饮行业网站(10页)

&#x1f4c2;文章目录一、&#x1f468;‍&#x1f393;网站题目二、✍️网站描述三、&#x1f4da;网站介绍四、&#x1f310;网站效果五、&#x1fa93; 代码实现&#x1f9f1;HTML结构代码&#x1f492;CSS样式代码六、&#x1f947; 如何让学习不再盲目七、&#x1f381;更…

【人脸识别】PCA人脸二维码识别(带面板)【含GUI Matlab源码 754期】

⛄一、人脸识别技术简介 0 引言 这个高速发展的时代&#xff0c;一切事物都将与“快”相联系。人脸识别技术的发展成熟保证了人们的信息安全&#xff0c;二维码的飞速发展成为了现如今信息传递的新媒介。“慢”就会被淘汰&#xff0c;因此减少现如今人脸识别过程的 时间仍是目…

数据结构和算法(四)--高级排序

目录 二、高级排序 2.1、希尔排序 2.2、归并排序 2.2.1、递归 2.2.2、归并排序 数据结构和算法(三)--排序 二、高级排序 冒泡排序&#xff0c;选择排序&#xff0c;插入排序&#xff0c;最坏的时间复杂度都是O(N^2)&#xff0c;而平方阶&#xff0c;随着输入规模的增大&…

想掌握日志分析系统的看过来

日志分析系统&#xff08;ELK&#xff09; 什么是ELK ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Filebeat占用资源…

day23【代码随想录】翻转二叉树、对称二叉树、完全二叉树的结点个数

文章目录前言一、翻转二叉树&#xff08;力扣226&#xff09;1、递归法1、使用前序遍历2、使用后序遍历2、迭代法1、层序遍历二、对称二叉树&#xff08;力扣101&#xff09;三、完全二叉树的结点个数&#xff08;力扣222&#xff09;前言 1、翻转二叉树 2、对称二叉树 3、完全…

【图像处理】直方图均衡化

直方图均衡化 简介 直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将一副图像的直方图分布变成近似均匀分布,从而增强图像的对比度。 直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。…

RegNet:设计网络设计空间

文章目录摘要1. 介绍2. 相关工作3.设计空间设计3.1. 设计空间设计的工具3.2. AnyNet设计空间3.3. RegNet设计空间3.4. 设计空间概化4. 分析RegNetX设计空间5. 与现有网络的比较5.1. 最先进的比较:移动体系5.2. 标准基线比较:ResNe(X)t5.3. 最先进的比较:整个体系6. 结论附录A:测…

Kafka 核心源码解读【四】--状态机模块

文章目录1 TopicDeletionManager&#xff1a; Topic是怎么被删除的&#xff1f;1.1 课前导读1.2 TopicDeletionManager 概览1.3 DeletionClient 接口及其实现1.4 TopicDeletionManager 定义及初始化1.5 TopicDeletionManager 重要方法1.6 总结2 ReplicaStateMachine&#xff1a…

EEGLAB系列教程5:数据预处理2(ICA去伪迹)

EEGLAB系列教程5&#xff1a;数据预处理2&#xff08;ICA去伪迹&#xff09; 今天介绍EEG数据处理系列教程5&#xff0c;在前面的几期中&#xff0c;已经介绍了数据基本处理过程&#xff0c;可以参见以下链接: EEGLAB系列教程1&#xff1a;安装和启动 EEGLAB EEGLAB系列教程…

Java项目:SSM网上零食超市商城

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 用户角色包含以下功能&#xff1a; 提交订单,支付页面…

Axios异步通信

四.Axios异步通信 1 什么是Axios&#xff1f; Axios是一个类库&#xff0c;基于Promise管理的HTTP 库&#xff0c;是前端通信框架&#xff0c;可以用在浏览器和 node.js 中。axios实现了对ajax的封装&#xff0c;常用于Ajax请求。注解&#xff1a;promise是Java Script的一个…

(附源码)Springboot校园健康检测管理系统 毕业设计 151047

Springboot校园健康检测管理系统的设计 摘 要 亚健康低龄化和高职业压力使高校师生健康问题凸显&#xff0c;不及早进行干预和控制将严重影响师生健康。如何理解和应用健康管理的理论和方法&#xff0c;探索高校师生健康管理工作模式&#xff0c;是目前高校医院的重点工作 校园…

Thymeleaf 预处理表达式__${表达式}__使用案例

目录一. 前期准备1.1 国际化项目获取类1.2 国际化配置文件类1.3 项目配置文件1.4 国际化资源文件二. __${表达式}__预处理表达式2.1 在Thymeleaf中使用Spring的Bean2.2 通过#{}获取国际化资源2.3 预处理表达式__${表达式}__的使用三. 效果四. 表格案例一. 前期准备 1.1 国际化…

图神经网络 # GNN基础(干货版)

注意&#xff1a;本篇文章不是系统性的图神经网络或者图深度学习的入门教程&#xff0c;而是介绍如何入门图神经网络的学习指南以及相关的干货笔记&#xff0c;文中会列出一些视频和文章学习资料&#xff0c;并在本文作一些重点的摘要&#xff0c;读者需要自行前往文本超链接的…

【C语言】通讯录《信息写到文件版本》

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

非零基础自学Golang 第9章 结构体 9.5 结构体方法

非零基础自学Golang 文章目录非零基础自学Golang第9章 结构体9.5 结构体方法9.5.1 指针类型接收者9.5.2 值类型接收者第9章 结构体 9.5 结构体方法 Go语言中&#xff0c;一个方法就是一个包含了接收者的函数。 对于结构体方法&#xff0c;接收者可以是结构体类型的值或是指针…