基于聚类分析算法的数字化图书馆、图书馆管理系统
基于聚类分析算法的数字化图书馆、图书馆管理系统
本系统为大学生毕业设计程序,项目涉及技术为:springboot、mybatis、mysql、vue.js、javascript、html、k-means聚类算法、maven等等。
1.图书馆管理系统用户登录:
2.图书馆管理系统主页:
3.图书管理列表:
4.图书高级检索:
5.图书新增:
6.图书信息编辑:
7.用户借阅图书列表:
8.图书推荐排行榜:
k-means算法java实现
package com.bskf.modules.job.utils;import java.util.ArrayList;
import java.util.List;public class Kcluster {private int id;// 标识private Kpoint center;// 中心private List<Kpoint> members = new ArrayList<Kpoint>();// 成员public Kcluster(int id, Kpoint center) {this.id = id;this.center = center;}public Kcluster(int id, Kpoint center, List<Kpoint> members) {this.id = id;this.center = center;this.members = members;}public void addPoint(Kpoint newKpoint) {members.add(newKpoint);}public int getId() {return id;}public Kpoint getCenter() {return center;}public void setCenter(Kpoint center) {this.center = center;}public List<Kpoint> getMembers() {return members;}@Overridepublic String toString() {String toString = "Kcluster \n" + "Cluster_id=" + this.id + ", center:{" + this.center.toString() + "}";for (Kpoint kpoint : members) {toString += "\n" + kpoint.toString();}return toString + "\n";}
}
package com.bskf.modules.job.utils;import java.util.*;public class KmeansRunner {private int kNum; //簇的个数private int iterNum = 10; //迭代次数private int iterMaxTimes = 100000; //单次迭代最大运行次数private int iterRunTimes = 0; //单次迭代实际运行次数private float disDiff = (float) 0.01; //单次迭代终止条件,两次运行中类中心的距离差private Map<Long, float[]> original_data; //用于存放,原始数据集private static List<Kpoint> kpointList = null; //用于存放,原始数据集所构建的点集private int len = 0; //用于记录每个数据点的维度public KmeansRunner(int k, Map<Long, float[]> original_data) {this.kNum = k;this.original_data = original_data;this.len = original_data.values().iterator().next().length;//检查规范check();//初始化点集。init();}/*** 检查规范*/private void check() {if (kNum == 0) {throw new IllegalArgumentException("k must be the number > 0");}if (original_data == null) {throw new IllegalArgumentException("program can't get real data");}}/*** 初始化数据集,把数组转化为Point类型。*/private void init() {kpointList = new ArrayList<>();for (Long uid : original_data.keySet()) {kpointList.add(new Kpoint(Math.toIntExact(uid), original_data.get(uid)));}System.out.println(kpointList);}/*** 随机选取中心点,构建成中心类。*/private Set<Kcluster> chooseCenterCluster() {Set<Kcluster> kclusterSet = new HashSet<Kcluster>();Random random = new Random();for (int id = 0; id < kNum; ) {int anInt = random.nextInt(kpointList.size());Kpoint kpoint = kpointList.get(anInt);// 用于标记是否已经选择过该数据。boolean flag = true;for (Kcluster kcluster : kclusterSet) {if (kcluster.getCenter().equals(kpoint)) {flag = false;}}// 如果随机选取的点没有被选中过,则生成一个clusterif (flag) {Kcluster kcluster = new Kcluster(id, kpoint);kclusterSet.add(kcluster);id++;}}return kclusterSet;}/*** 为每个点分配一个类!*/public void cluster(Set<Kcluster> kclusterSet) {// 计算每个点到K个中心的距离,并且为每个点标记类别号for (Kpoint kpoint : kpointList) {float min_dis = Integer.MAX_VALUE;for (Kcluster kcluster : kclusterSet) {float tmp_dis = (float) Math.min(getEuclideanDis(kpoint, kcluster.getCenter()), min_dis);if (tmp_dis != min_dis) {min_dis = tmp_dis;kpoint.setClusterId(kcluster.getId());kpoint.setDist(min_dis);}}}// 新清除原来所有的类中成员。把所有的点,分别加入每个类别for (Kcluster kcluster : kclusterSet) {kcluster.getMembers().clear();for (Kpoint kpoint : kpointList) {if (kpoint.getClusterid() == kcluster.getId()) {kcluster.addPoint(kpoint);}}}}/*** 计算每个类的中心位置!*/public boolean calculateCenter(Set<Kcluster> kclusterSet) {boolean ifNeedIter = false;for (Kcluster kcluster : kclusterSet) {List<Kpoint> kpoint_list = kcluster.getMembers();float[] sumAll = new float[len];// 所有点,对应各个维度进行求和for (int i = 0; i < len; i++) {for (int j = 0; j < kpoint_list.size(); j++) {sumAll[i] += kpoint_list.get(j).getlocalArray()[i];}}// 计算平均值for (int i = 0; i < sumAll.length; i++) {sumAll[i] = (float) sumAll[i] / kpoint_list.size();}// 计算两个新、旧中心的距离,如果任意一个类中心移动的距离大于dis_diff则继续迭代。if (getEuclideanDis(kcluster.getCenter(), new Kpoint(sumAll)) > disDiff) {ifNeedIter = true;}// 设置新的类中心位置kcluster.setCenter(new Kpoint(sumAll));}return ifNeedIter;}/*** 运行 k-means*/public Set<Kcluster> run() {Set<Kcluster> kclusterSet = chooseCenterCluster();boolean ifNeedIter = true;while (ifNeedIter) {cluster(kclusterSet);ifNeedIter = calculateCenter(kclusterSet);iterRunTimes++;}return kclusterSet;}/*** 返回实际运行次数*/public int getIterTimes() {return iterRunTimes;}/*** 求欧式距离*/public static double getEuclideanDis(Kpoint p1, Kpoint p2) {double count_dis = 0;float[] p1_local_array = p1.getlocalArray();float[] p2_local_array = p2.getlocalArray();if (p1_local_array.length != p2_local_array.length) {throw new IllegalArgumentException("length of array must be equal!");}for (int i = 0; i < p1_local_array.length; i++) {count_dis += Math.pow(p1_local_array[i] - p2_local_array[i], 2);}return Math.sqrt(count_dis);}
}
package com.bskf.modules.job.utils;
public class Kpoint {private float[] localArray;private int id;private int clusterId; // 标识属于哪个类中心。private float dist; // 标识和所属类中心的距离。public Kpoint(int id, float[] localArray) {this.id = id;this.localArray = localArray;}public Kpoint(float[] localArray) {this.id = -1; //表示不属于任意一个类this.localArray = localArray;}public float[] getlocalArray() {return localArray;}public int getId() {return id;}public void setClusterId(int clusterId) {this.clusterId = clusterId;}public int getClusterid() {return clusterId;}public float getDist() {return dist;}public void setDist(float dist) {this.dist = dist;}@Overridepublic String toString() {String result = "Point_id=" + id + " [";for (int i = 0; i < localArray.length; i++) {result += localArray[i] + " ";}return result.trim() + "] clusterId: " + clusterId + " dist: " + dist;}@Overridepublic boolean equals(Object obj) {if (obj == null || getClass() != obj.getClass())return false;Kpoint kpoint = (Kpoint) obj;if (kpoint.localArray.length != localArray.length)return false;for (int i = 0; i < localArray.length; i++) {if (Float.compare(kpoint.localArray[i], localArray[i]) != 0) {return false;}}return true;}@Overridepublic int hashCode() {float x = localArray[0];float y = localArray[localArray.length - 1];long temp = x != +0.0d ? Double.doubleToLongBits(x) : 0L;int result = (int) (temp ^ (temp >>> 32));temp = y != +0.0d ? Double.doubleToLongBits(y) : 0L;result = 31 * result + (int) (temp ^ (temp >>> 32));return result;}}
代码太多了,就不详细列举了,有需要的可以联系我,拿代码。。。
基于聚类分析算法的数字化图书馆、图书馆管理系统相关推荐
- 基于Java的图书馆借阅管理系统的设计与实现--毕业开题报告
基于Java的图书馆借阅管理系统的设计与实现–开题报告 这个先写一版开题报告,后续有时间给大家提供论文 . 题目:基于Java的图书馆借阅管理系统的设计与实现 一.选题依据 1.国内外有关的研究动态 ...
- 基于JAVA校内图书馆智能管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
基于JAVA校内图书馆智能管理系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA校内图书馆智能管理系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S ...
- 基于java图书馆借阅管理系统获取(java毕业设计)
基于java图书馆借阅管理系统 图书馆借阅管理系统是基于java编程语言和mysql数据库设计,本系统分为读者用户和管理员两个角色,其中用户可以注册后登陆系统,查看图书信息,在线借阅图书,查看借阅历史 ...
- 基于javaweb的图书馆借阅管理系统(java+springboot+bootstrap+html+mysql)
基于javaweb的图书馆借阅管理系统(java+springboot+bootstrap+html+mysql) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse/idea/my ...
- 基于微信小程序的图书馆座位管理系统(论文设计)
摘要 在面对当今培育人才计划的压力,人们需要汲取更多的不同领域的知识来不断扩充自己的知识层面,因此他们对学习的欲望不断扩大,图书馆作为高校的学习宝地,有着不可替代的地位.但是在信息化时代,传统模式下的 ...
- 【JAVA程序设计】(C00067)基于SSM(非maven)图书馆座位预约管理系统
基于SSM(非maven)图书馆座位预约管理系统 项目简介 项目获取 开发环境 项目技术 运行截图 项目简介 基于ssm框架非maven开发的图书馆预约占座管理系统共分为三个角色:系统管理员.教师.学 ...
- 基于Python高校图书馆图书管理系统的设计与实现(PyCharm,MySQL)
随着时代和互联网的发展,高校师生们已经可以在网上浏览大量书籍,但是仍然有大量人群习惯于借阅传统书籍,并且随着受教育人数的增多,图书馆的工作在增加,管理难度也在不断增大,这时就需要一个功能齐全的.高效的 ...
- 基于PHP+MySQL的自习室图书馆座位管理系统
自习室和图书馆有安静的学习环境是大学生学习的圣地.但是,由于我国高校不断扩张但是相对你的教学资源没有跟上就出现了在自习室和图书馆一座难求的情况.尤其是在考试之前和考研期间这种情况更是明显,甚至很多大学 ...
- 基于JAVA柚子树数字化精准管理系统计算机毕业设计源码+系统+lw文档+部署
基于JAVA柚子树数字化精准管理系统计算机毕业设计源码+系统+lw文档+部署 基于JAVA柚子树数字化精准管理系统计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...
最新文章
- 使用wamp访问localhost时查看项目地址不对
- 二进制转换为八进制-栈方式实现
- php长轮询阻塞,ajax长轮询时php被阻塞
- linux apache 大文件,Apache下error.log文件太大的处理方法
- pytorch自动求梯度—详解
- PHP数组foreach后使用current取值的问题
- L1-016 查验身份证 (15 分) — 团体程序设计天梯赛
- jQuery中find和filter的区别
- 分页实体类:PageBean
- 问题解决之——未知usb设备设备描述符请求失败(Jlink驱动)
- 计算机动漫与游戏制作电脑配置,动漫与游戏设计该如何选电脑配置?
- wav是什么格式?怎么转成mp3?
- 2021辽宁省大学生程序设计竞赛(C、D、E、F、G、L)
- mongoDB数据库mong.conf配置文件的问题
- Java Web框架学习
- matlab中求立方根,matlab实现求复数立方根的函数代码怎么写
- 凯恩帝绝对坐标清零_数控凯恩帝相对和绝对坐标怎么切换切换,求师傅
- 快递100 https://m.kuaidi100.com/
- 【Java】一个Employee类的实际使用
- Java有没有多继承