起初以为手写识别仅与机器学习有关,做了这个才知道有KNN算法。
KNN:
概念摘自百度
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
为了判断距离最近,引入欧氏距离和余弦距离。(可以自己再查查)
欧氏距离:
将两点之间距离公式拓展到N维,即抽象出来两物体距离为两点间距离公式的延展....emmm公式打不出来了
余弦距离
个人觉得余弦距离与其说是距离不如理解为趋势,余弦距离是空间两个向量夹角的余弦值来作为比较依据。
IO流
按操作数据类型分为字符流和字节流
按流分为输入流和输出流
字符流处理文本数据,字节流处理媒体数据
FileInputStream FileOutputStream 纯文本输入输出最为方便,这里的输入输出参考于程序
流使用后一定关闭
思路
1.数据存储
数据存储分两类:“学习”样本数据的存储,识别样本的存储;
在我点击“学习”按钮后,在界面画数字“1”,它会被截图保存,然后转为灰度,保存在二维数组中,输出到文本文档。
在我点击“识别”按钮后,在界面画数字“1”,它会被截图保存,然后转为灰度,保存在二维数组中,输出到文本文档。
2.knn,计算欧氏距离
我们需要从学习群文档中得到所有的数组数据,在与得到的一组测试数据比较,欧氏距离最小的极为同类。输出就好
源代码(1.0版本,它的问题是每次识别前都要录入新的样本)
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
public class DrawFrame extends JFrame{
public static void main(String[] args) {
// TODO Auto-generated method stub
DrawFrame h=new DrawFrame();
h.show();
}
public void show(){
JFrame jf=new JFrame();
jf.setTitle("手写识别");
jf.setSize(400,400);
jf.getContentPane().setBackground(Color.white);
//jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setDefaultCloseOperation(3);