面试完面试官笑了,山东大学数据结构课程设计 ,想进BTAJ

  1. 使用Java构建通用的KNN算法框架、K-D Tree;

  2. 使用JavaScript完成KD树插入、K近邻搜索的可视化;

  3. 控制变量法研究不同因素的对分类器效率的影响;

  4. 鸢尾花数据集的分类;

  5. 手写字体分类

系统开发平台

======================================================================

架构概述


本次应用程序设计采用了BS(Browser-Server)架构,即浏览器-服务器架构。

理由如下:

  1. 考虑众多机器学习的模型的训练需要一个强大的计算环境,所以本次项目将算法模型的实现数据的处理样本数据集的训练均放在了服务端。

  2. 将项目部署到Linux系统之后,方便向其他人展示功能,其他人也可以实时参与系统的测试使用。

  3. 本次数据结构课设,不适合采用CS(Customer-Server)架构,因为项目本身不大,将项目部署到云服务器之后,用户使用浏览器访问即可。

开发平台、技术栈


开发语言:Java、JavaScript

其中算法设计、数据结构实现使用Java, 数据可视化、图形化编程使用JavaScript;

后端:SpringBoot、SpringMVC;

前端:vue、canvas、echarts;

服务器: 云服务器实例、Ubuntu镜像、服务器Nginx;

IDE:IntelliJ IDEA、WebStorm

算法设计

====================================================================

KNN(K nearest neighbors)


这部分内容,放在了这篇博客详细介绍了。

点击传送门

交叉验证法优化超参数K的取值


交叉验证(Cross-validation)主要用于建模应用中,例如PCR、PLS回归建模中。在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预报,并求这小部分样本的预报误差,记录它们的平方加和。

交叉验证法的思想

交叉验证(Cross Validation),有的时候也称作循环估计(Rotation Estimation),是一种统计学上将数据样本切割成较小子集的实用方法,该理论是由Seymour Geisser提出的。

交叉验证的基本思想, 把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),

首先用训练集对分类器进行训练, 再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。

在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预报,并求这小部分样本的预报误差,记录它们的平方的和。这个过程一直进行,直到所有的样本都被预报了一次而且仅被预报一次。把每个样本的预报误差平方求和,称为PRESS(predicted Error Sum of Squares)

K-fold cross-validation

K-fold cross-validation

K折交叉验证,初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10折交叉验证是最常用的。

如下图:

在这里插入图片描述

K折验证的一种特殊形式 —— 留一验证正如名称所建议, 留一验证(LOOCV)意指只使用原本样本中的一项来当做验证资料, 而剩余的则留下来当做训练资料。

这个步骤一直持续到每个样本都被当做一次验证资料。 事实上,这等同于和K-fold 交叉验证是一样的,其中K为原本样本个数。

在某些情况下是存在有效率的演算法,如使用kernel regression 和Tikhonov regularization。

K折验证法选取超参数 k

为了选取最优的超参数k,在构造KNN分类器时,我们可以使用上文提及的10折交叉验证法,

这个算法流程如下图。

在这里插入图片描述

值得一提的是,k的迭代步长如何确定。

在上面的分析中:

K的选取一般来源于经验,一般选取一个较小的大于1的奇数,一般在 ( 1 , n ) (1,\sqrt n) (1,n ​)。

  1. n较小时,n取 ( 1 , 10 ) (1,10) (1,10)中的奇数;
  1. n较大时,n取 ( 1 , n / 2 ) (1,\sqrt n/2) (1,n ​/2)中的奇数;

并且考虑到,k的值对预测结果的敏感程度,所以在k较小的时候,步数尽可能小;在 k取值较大的时候,步数可以适量增大。

假定样本容量为 n n n, n n n的量级大概在 1 0 6 10^6 106自由,

所以 k k k不超过 n / 2 \sqrt n/2 n ​/2,也就是500。

所以,k的步长可以这样设计,

从3开始,为了保证k的取值是偶数,

  1. 1~10内,步长为2;

  2. 10~30内,步长为4;

  3. 30~60,步长为6;

  4. 60~100,步长为8;

  5. 100~500, 步长为40;

如此,既减少了模型训练、测试样本的时间,又在一定程度上表现了随着k的变化,对分类正确率的影响

图像特征的数字化


本次实现的KNN分类器的最终目标是实现一个建议的手写字体识别器。

因此,对图像数字特征的提取工作就变得尤为关键。

下面介绍几个常见的 图像特征提取算法

暴力算法

将图像的每一个像素点都作为特征向量的一个维度,很明显。

这样做的缺点是非常明显的,甚至可以说毫无优点。

  • 特征维度提取不精确

有一些并属于图像的像素也被作为特征维度,相当于成了噪声点 —— 也 就是说并没有很好的体现图像的拓扑学关系。

  • 维度太高

向量的维度太高,会带来一系列问题。内存占用太多,计算量迅速增大,并且对于高维向量的检索KD树表现的很差(几乎接近暴力的线性扫描的复杂度)。

以下内容均来自这篇文章

SIFT

SIFT:Scale-Invariant Feature Taransform,尺度不变特征变换

  • 尺度空间的极值检测:搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和旋转鲁棒性较强的点。

  • 特征点定位:在每个候选位置上,通过一个拟合精细模型(尺度空间DoG函数进行曲线拟合)来确定位置尺度,关键点的选取依据他们的稳定程度。

特征方向赋值:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性。

  • 特征点描述:在每个特征点周围的领域内,在选定的尺度上测量图像的局部梯度,计算块内梯度直方图,生成具有独特性的向量。

HOG

HOG:Histogram of Oriented Gradient,方向梯度直方图

  • 颜色空间归一化:为了减少光照因素的影响, 首先需要将整个图像归一化。因为颜色信息作用不大,通常先转化为灰度图。

  • 梯度计算:计算图像横坐标和纵坐标方向的梯度,并据此计算每个像素位置的梯度+ 方向值;求导操作不仅能捕获轮廓,还能进一步弱化光照的影响。

  • 梯度方向直方图:将图像分成若干个cell,对cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度直方图。

将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。

组成特征:将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor。

LBP

LBP:Local Binary Pattern,局部二值模式

原始的LBP算子定义在像素3_3的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3_3邻域内的8个点经过比较可产生8位二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值,LBP值共有28种可能,因此LBP值有256种。中心像素的LBP值反映了该像素周围区域的纹理信息。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

image

image

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值