KNN:
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
本项目将图像进行二值化处理,将得到的数据转化成向量,形成训练数据集。再将待识别的图片二值化,利用欧氏距离求相似度,最相似的即为识别结果。
欧氏距离:
具体步骤:
1.把训练数据(已经识别的数据)二值化。
2.把第一步得到的数据转化成向量,形成训练数据集。
3.把待识别的图片二值化。
4.把二值化后类似矩阵的数据转化为向量。
5.把待识别数据向量和训练数据向量进行求相似度运算,利用欧氏距离。
6.选取最相似的K个,根据标签统计个数,且计算平均相似度。
材料准备:
待识别图像集合:数字0~9 每个数字取100张。
具体代码实施:
1.图像二值化
package KNN;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Arrays;
//
public class ImageDemo {
public void arrayImage() throws IOException {
for (int sum = 1; sum <=20; sum++) {
File file = new File("D:\\idea\\BD1803_hadoop\\target\\test\\7_31.png");
//读入20*20像素的图像
BufferedImage image = ImageIO.read(file);
File file1 = new File("D:\\idea\\BD1803_hadoop\\target\\test\\7.txt");
FileWriter out = new FileWriter(file1);
//转化为向量写入文件中
int width = image.getWidth();
int height = image.getHeight();
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int rgb = image.getRGB(i, j);
Color gray = new Color(105, 105, 105);
int rgb_gray = gray.getRGB();
if (rgb > rgb_gray) {
out.write("1");//颜色比灰色深设为1
out.flush();
} else {
out.write("0");//颜色比灰色浅设为0