数据挖掘分类算法--KNN

实验中使用的数据依然是UCI上的Iris,实验中分别有样本数据和测试使用的数据,分别如下:

样本数据是分别算则iris中三类数据各30个:

5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
5.0,3.4,1.5,0.2,Iris-setosa
4.4,2.9,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.4,3.7,1.5,0.2,Iris-setosa
4.8,3.4,1.6,0.2,Iris-setosa
4.8,3.0,1.4,0.1,Iris-setosa
4.3,3.0,1.1,0.1,Iris-setosa
5.8,4.0,1.2,0.2,Iris-setosa
5.7,4.4,1.5,0.4,Iris-setosa
5.4,3.9,1.3,0.4,Iris-setosa
5.1,3.5,1.4,0.3,Iris-setosa
5.7,3.8,1.7,0.3,Iris-setosa
5.1,3.8,1.5,0.3,Iris-setosa
5.4,3.4,1.7,0.2,Iris-setosa
5.1,3.7,1.5,0.4,Iris-setosa
4.6,3.6,1.0,0.2,Iris-setosa
5.1,3.3,1.7,0.5,Iris-setosa
4.8,3.4,1.9,0.2,Iris-setosa
5.0,3.0,1.6,0.2,Iris-setosa
5.0,3.4,1.6,0.4,Iris-setosa
5.2,3.5,1.5,0.2,Iris-setosa
5.2,3.4,1.4,0.2,Iris-setosa
4.7,3.2,1.6,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.9,3.1,4.9,1.5,Iris-versicolor
5.5,2.3,4.0,1.3,Iris-versicolor
6.5,2.8,4.6,1.5,Iris-versicolor
5.7,2.8,4.5,1.3,Iris-versicolor
6.3,3.3,4.7,1.6,Iris-versicolor
4.9,2.4,3.3,1.0,Iris-versicolor
6.6,2.9,4.6,1.3,Iris-versicolor
5.2,2.7,3.9,1.4,Iris-versicolor
5.0,2.0,3.5,1.0,Iris-versicolor
5.9,3.0,4.2,1.5,Iris-versicolor
6.0,2.2,4.0,1.0,Iris-versicolor
6.1,2.9,4.7,1.4,Iris-versicolor
5.6,2.9,3.6,1.3,Iris-versicolor
6.7,3.1,4.4,1.4,Iris-versicolor
5.6,3.0,4.5,1.5,Iris-versicolor
5.8,2.7,4.1,1.0,Iris-versicolor
6.2,2.2,4.5,1.5,Iris-versicolor
5.6,2.5,3.9,1.1,Iris-versicolor
5.9,3.2,4.8,1.8,Iris-versicolor
6.1,2.8,4.0,1.3,Iris-versicolor
6.3,2.5,4.9,1.5,Iris-versicolor
6.1,2.8,4.7,1.2,Iris-versicolor
6.4,2.9,4.3,1.3,Iris-versicolor
6.6,3.0,4.4,1.4,Iris-versicolor
6.8,2.8,4.8,1.4,Iris-versicolor
6.7,3.0,5.0,1.7,Iris-versicolor
6.0,2.9,4.5,1.5,Iris-versicolor
5.7,2.6,3.5,1.0,Iris-versicolor
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
7.1,3.0,5.9,2.1,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginica
6.5,3.0,5.8,2.2,Iris-virginica
7.6,3.0,6.6,2.1,Iris-virginica
4.9,2.5,4.5,1.7,Iris-virginica
7.3,2.9,6.3,1.8,Iris-virginica
6.7,2.5,5.8,1.8,Iris-virginica
7.2,3.6,6.1,2.5,Iris-virginica
6.5,3.2,5.1,2.0,Iris-virginica
6.4,2.7,5.3,1.9,Iris-virginica
6.8,3.0,5.5,2.1,Iris-virginica
5.7,2.5,5.0,2.0,Iris-virginica
5.8,2.8,5.1,2.4,Iris-virginica
6.4,3.2,5.3,2.3,Iris-virginica
6.5,3.0,5.5,1.8,Iris-virginica
7.7,3.8,6.7,2.2,Iris-virginica
7.7,2.6,6.9,2.3,Iris-virginica
6.0,2.2,5.0,1.5,Iris-virginica
6.9,3.2,5.7,2.3,Iris-virginica
5.6,2.8,4.9,2.0,Iris-virginica
7.7,2.8,6.7,2.0,Iris-virginica
6.3,2.7,4.9,1.8,Iris-virginica
6.7,3.3,5.7,2.1,Iris-virginica
7.2,3.2,6.0,1.8,Iris-virginica
6.2,2.8,4.8,1.8,Iris-virginica
6.1,3.0,4.9,1.8,Iris-virginica
6.4,2.8,5.6,2.1,Iris-virginica
7.2,3.0,5.8,1.6,Iris-virginica

测试数据为剩余的60条数据:

4.8,3.1,1.6,0.2,Iris-setosa
5.4,3.4,1.5,0.4,Iris-setosa
5.2,4.1,1.5,0.1,Iris-setosa
5.5,4.2,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.0,3.2,1.2,0.2,Iris-setosa
5.5,3.5,1.3,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
4.4,3.0,1.3,0.2,Iris-setosa
5.1,3.4,1.5,0.2,Iris-setosa
5.0,3.5,1.3,0.3,Iris-setosa
4.5,2.3,1.3,0.3,Iris-setosa
4.4,3.2,1.3,0.2,Iris-setosa
5.0,3.5,1.6,0.6,Iris-setosa
5.1,3.8,1.9,0.4,Iris-setosa
4.8,3.0,1.4,0.3,Iris-setosa
5.1,3.8,1.6,0.2,Iris-setosa
4.6,3.2,1.4,0.2,Iris-setosa
5.3,3.7,1.5,0.2,Iris-setosa
5.0,3.3,1.4,0.2,Iris-setosa
5.5,2.4,3.8,1.1,Iris-versicolor
5.5,2.4,3.7,1.0,Iris-versicolor
5.8,2.7,3.9,1.2,Iris-versicolor
6.0,2.7,5.1,1.6,Iris-versicolor
5.4,3.0,4.5,1.5,Iris-versicolor
6.0,3.4,4.5,1.6,Iris-versicolor
6.7,3.1,4.7,1.5,Iris-versicolor
6.3,2.3,4.4,1.3,Iris-versicolor
5.6,3.0,4.1,1.3,Iris-versicolor
5.5,2.5,4.0,1.3,Iris-versicolor
5.5,2.6,4.4,1.2,Iris-versicolor
6.1,3.0,4.6,1.4,Iris-versicolor
5.8,2.6,4.0,1.2,Iris-versicolor
5.0,2.3,3.3,1.0,Iris-versicolor
5.6,2.7,4.2,1.3,Iris-versicolor
5.7,3.0,4.2,1.2,Iris-versicolor
5.7,2.9,4.2,1.3,Iris-versicolor
6.2,2.9,4.3,1.3,Iris-versicolor
5.1,2.5,3.0,1.1,Iris-versicolor
5.7,2.8,4.1,1.3,Iris-versicolor
7.4,2.8,6.1,1.9,Iris-virginica
7.9,3.8,6.4,2.0,Iris-virginica
6.4,2.8,5.6,2.2,Iris-virginica
6.3,2.8,5.1,1.5,Iris-virginica
6.1,2.6,5.6,1.4,Iris-virginica
7.7,3.0,6.1,2.3,Iris-virginica
6.3,3.4,5.6,2.4,Iris-virginica
6.4,3.1,5.5,1.8,Iris-virginica
6.0,3.0,4.8,1.8,Iris-virginica
6.9,3.1,5.4,2.1,Iris-virginica
6.7,3.1,5.6,2.4,Iris-virginica
6.9,3.1,5.1,2.3,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
6.8,3.2,5.9,2.3,Iris-virginica
6.7,3.3,5.7,2.5,Iris-virginica
6.7,3.0,5.2,2.3,Iris-virginica
6.3,2.5,5.0,1.9,Iris-virginica
6.5,3.0,5.2,2.0,Iris-virginica
6.2,3.4,5.4,2.3,Iris-virginica
5.9,3.0,5.1,1.8,Iris-virginica

算法代码如下:

  1 package neugle.knn;
  2
  3 import java.io.BufferedReader;
  4 import java.io.FileReader;
  5 import java.util.ArrayList;
  6 import java.util.HashMap;
  7 import java.util.LinkedHashMap;
  8 import java.util.List;
  9 import java.util.Map.Entry;
 10 import java.util.Set;
 11
 12 public class KNN {
 13     private List<Iris> irisList = new ArrayList<KNN.Iris>();
 14
 15     class Iris {
 16         public double Sep_len;
 17         public double Sep_wid;
 18         public double Pet_len;
 19         public double Pet_wid;
 20         public String Iris_type;
 21     }
 22
 23     // 读取数据
 24     public List<Iris> ReadFile(String filePath) {
 25         FileReader fr = null;
 26         BufferedReader br = null;
 27         List<Iris> irisList = new ArrayList<KNN.Iris>();
 28         try {
 29             fr = new FileReader(filePath);
 30             br = new BufferedReader(fr);
 31             String line = null;
 32             while ((line = br.readLine()) != null) {
 33                 Iris iris = new Iris();
 34                 String[] agrs = line.split(",");
 35                 iris.Sep_len = Double.parseDouble(agrs[0]);
 36                 iris.Sep_wid = Double.parseDouble(agrs[1]);
 37                 iris.Pet_len = Double.parseDouble(agrs[2]);
 38                 iris.Pet_wid = Double.parseDouble(agrs[3]);
 39                 iris.Iris_type = agrs[4];
 40                 irisList.add(iris);
 41             }
 42         } catch (Exception e) {
 43             e.printStackTrace();
 44         } finally {
 45             try {
 46                 br.close();
 47             } catch (Exception e) {
 48                 e.printStackTrace();
 49             }
 50         }
 51         return irisList;
 52     }
 53
 54     // 计算测试数据和样本点中每个点的距离
 55     public LinkedHashMap<Integer, Double> GetDistance(Iris iris) {
 56         LinkedHashMap<Integer, Double> irisMap = new LinkedHashMap<Integer, Double>();
 57         for (int i = 0; i < this.irisList.size(); i++) {
 58             double d = this.DistanceCalculate(iris, this.irisList.get(i));
 59             irisMap.put(i, d);
 60         }
 61         return irisMap;
 62     }
 63
 64     private double DistanceCalculate(Iris iris1, Iris iris2) {
 65         double sum = Math.sqrt(Math.pow((iris1.Sep_len - iris2.Sep_len), 2)
 66                 + Math.pow((iris1.Sep_wid - iris2.Sep_wid), 2)
 67                 + Math.pow((iris1.Pet_len - iris2.Pet_len), 2)
 68                 + Math.pow((iris1.Pet_wid - iris2.Pet_wid), 2));
 69         return sum;
 70     }
 71
 72     // 找出前k个数据
 73     public List<Iris> FindKData(int k, LinkedHashMap<Integer, Double> irisMap) {
 74         List<Integer> iList = new ArrayList<Integer>();
 75         List<Iris> rList = new ArrayList<KNN.Iris>();
 76         Set<Entry<Integer, Double>> set = irisMap.entrySet();
 77         for (int i = 0; i < k; i++) {
 78             int key = 0;
 79             double value = 0;
 80             boolean flag = true;
 81             for (Entry<Integer, Double> e : set) {
 82                 if (flag == true) {
 83                     key = e.getKey();
 84                     value = e.getValue();
 85                     flag = false;
 86                     continue;
 87                 }
 88                 if (e.getValue() < value) {
 89                     key = e.getKey();
 90                     value = e.getValue();
 91                 }
 92             }
 93             iList.add(key);
 94             irisMap.remove(key);
 95         }
 96
 97         for (int i = 0; i < iList.size(); i++) {
 98             rList.add(this.irisList.get(iList.get(i)));
 99         }
100         return rList;
101     }
102
103     // 找出该测试数据应属于哪一类
104     public String FindClass(List<Iris> iList) {
105         HashMap<String, Integer> map = new HashMap<String, Integer>();
106         for (int i = 0; i < iList.size(); i++) {
107             String s = iList.get(i).Iris_type;
108             if (map.containsKey(s)) {
109                 map.put(s, map.get(s) + 1);
110             } else {
111                 map.put(s, 1);
112             }
113         }
114
115         String key = null;
116         int value = 0;
117         for (Entry<String, Integer> e : map.entrySet()) {
118             if (e.getValue() > value) {
119                 value = e.getValue();
120                 key = e.getKey();
121             }
122         }
123         return key;
124     }
125
126     // 操控方法
127     public void Calc(String filePath1, String filePath2, int k) {
128         this.irisList = this.ReadFile(filePath1);
129         List<Iris> fList = this.ReadFile(filePath2);
130         System.out.println("测试数据展示:");
131         System.out.println("-----------------------");
132         for (int i = 0; i < fList.size(); i++) {
133             Iris iris = fList.get(i);
134             System.out.println(iris.Pet_len + " " + iris.Pet_wid + " "
135                     + iris.Sep_len + " " + iris.Sep_wid + " " + iris.Iris_type);
136         }
137         System.out.println("-----------------------");
138         System.out.println("测试结果为:");
139         System.out.println("-----------------------");
140         for (int i = 0; i < fList.size(); i++) {
141             Iris iris = fList.get(i);
142             LinkedHashMap<Integer, Double> dMap = this.GetDistance(iris);
143             List<Iris> iList = this.FindKData(k, dMap);
144             String type = this.FindClass(iList);
145             System.out.println(iris.Pet_len + " " + iris.Pet_wid + " "
146                     + iris.Sep_len + " " + iris.Sep_wid + " " + type);
147         }
148         System.out.println("-----------------------");
149     }
150
151     public static void main(String[] args) {
152         KNN knn = new KNN();
153         String filePath1 = "D:\\data\\KNN\\iris.data";// 样本数据位置
154         String filePath2 = "D:\\data\\KNN\\firis.data";// 测试数据位置
155         int k = 3;
156         knn.Calc(filePath1, filePath2, k);
157     }
158 }

实验结果如下:

1.6 0.2 4.8 3.1 Iris-setosa
1.5 0.4 5.4 3.4 Iris-setosa
1.5 0.1 5.2 4.1 Iris-setosa
1.4 0.2 5.5 4.2 Iris-setosa
1.5 0.1 4.9 3.1 Iris-setosa
1.2 0.2 5.0 3.2 Iris-setosa
1.3 0.2 5.5 3.5 Iris-setosa
1.5 0.1 4.9 3.1 Iris-setosa
1.3 0.2 4.4 3.0 Iris-setosa
1.5 0.2 5.1 3.4 Iris-setosa
1.3 0.3 5.0 3.5 Iris-setosa
1.3 0.3 4.5 2.3 Iris-setosa
1.3 0.2 4.4 3.2 Iris-setosa
1.6 0.6 5.0 3.5 Iris-setosa
1.9 0.4 5.1 3.8 Iris-setosa
1.4 0.3 4.8 3.0 Iris-setosa
1.6 0.2 5.1 3.8 Iris-setosa
1.4 0.2 4.6 3.2 Iris-setosa
1.5 0.2 5.3 3.7 Iris-setosa
1.4 0.2 5.0 3.3 Iris-setosa
3.8 1.1 5.5 2.4 Iris-versicolor
3.7 1.0 5.5 2.4 Iris-versicolor
3.9 1.2 5.8 2.7 Iris-versicolor
5.1 1.6 6.0 2.7 Iris-virginica
4.5 1.5 5.4 3.0 Iris-versicolor
4.5 1.6 6.0 3.4 Iris-versicolor
4.7 1.5 6.7 3.1 Iris-versicolor
4.4 1.3 6.3 2.3 Iris-versicolor
4.1 1.3 5.6 3.0 Iris-versicolor
4.0 1.3 5.5 2.5 Iris-versicolor
4.4 1.2 5.5 2.6 Iris-versicolor
4.6 1.4 6.1 3.0 Iris-versicolor
4.0 1.2 5.8 2.6 Iris-versicolor
3.3 1.0 5.0 2.3 Iris-versicolor
4.2 1.3 5.6 2.7 Iris-versicolor
4.2 1.2 5.7 3.0 Iris-versicolor
4.2 1.3 5.7 2.9 Iris-versicolor
4.3 1.3 6.2 2.9 Iris-versicolor
3.0 1.1 5.1 2.5 Iris-versicolor
4.1 1.3 5.7 2.8 Iris-versicolor
6.1 1.9 7.4 2.8 Iris-virginica
6.4 2.0 7.9 3.8 Iris-virginica
5.6 2.2 6.4 2.8 Iris-virginica
5.1 1.5 6.3 2.8 Iris-virginica
5.6 1.4 6.1 2.6 Iris-virginica
6.1 2.3 7.7 3.0 Iris-virginica
5.6 2.4 6.3 3.4 Iris-virginica
5.5 1.8 6.4 3.1 Iris-virginica
4.8 1.8 6.0 3.0 Iris-virginica
5.4 2.1 6.9 3.1 Iris-virginica
5.6 2.4 6.7 3.1 Iris-virginica
5.1 2.3 6.9 3.1 Iris-virginica
5.1 1.9 5.8 2.7 Iris-virginica
5.9 2.3 6.8 3.2 Iris-virginica
5.7 2.5 6.7 3.3 Iris-virginica
5.2 2.3 6.7 3.0 Iris-virginica
5.0 1.9 6.3 2.5 Iris-virginica
5.2 2.0 6.5 3.0 Iris-virginica
5.4 2.3 6.2 3.4 Iris-virginica
5.1 1.8 5.9 3.0 Iris-virginica
时间: 2024-08-09 18:12:57

数据挖掘分类算法--KNN的相关文章

数据挖掘之分类算法---knn算法(有matlab样例)

knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法. 注意,不是聚类算法.所以这样的分类算法必定包含了训练过程. 然而和一般性的分类算法不同,knn算法是一种懒惰算法.它并不是 像其它的分类算法先通过训练建立分类模型.,而是一种被动的分类 过程.它是边測试边训练建立分类模型. 算法的一般描写叙述步骤例如以下: 1.首先计算每一个測试样本点到其它每一个点的距离. 这个距离能够是欧氏距离,余弦距离等. 2. 然后取出距离小于设定的距离阈值的点. 这些点即为依

数据挖掘之分类算法---knn算法(有matlab例子)

knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法. 注意,不是聚类算法.所以这种分类算法必然包括了训练过程. 然而和一般性的分类算法不同,knn算法是一种懒惰算法.它并非 像其他的分类算法先通过训练建立分类模型.,而是一种被动的分类 过程.它是边测试边训练建立分类模型. 算法的一般描述过程如下: 1.首先计算每个测试样本点到其他每个点的距离. 这个距离可以是欧氏距离,余弦距离等. 2. 然后取出距离小于设定的距离阈值的点. 这些点即为根据阈值环绕在测试

阅读论文《基于神经网络的数据挖掘分类算法比较和分析研究》 安徽大学 工程硕士:常凯 (二)数据集的介绍

数据集的介绍 1."鲍鱼年龄"数据集(Abalone Data Set).是通过预测鲍鱼环,也就是鲍鱼的年轮,来推断鲍鱼寿命.该数据集来自于UCI(University of California,Irvine,UCI)提出的用于机器学习的数据库. 共有八个属性分别是:性别.长度.直径等 具体的属性的介绍 方法一:利用BP 方法使用ELM 方法三:使用SVM 我:通过Xmind函数发现其实对一种新的方法而言函数都是集成可以直接用的,我们要做的就是知道每个函数的具体的意义,以及知道大致的

数学建模:2.监督学习--分类分析- KNN最邻近分类算法

1.分类分析 分类(Classification)指的是从数据中选出已经分好类的训练集,在该训练集上运用数据挖掘分类的技术,建立分类模型,对于没有分类的数据进行分类的分析方法. 分类问题的应用场景:分类问题是用于将事物打上一个标签,通常结果为离散值.例如判断一副图片上的动物是一只猫还是一只狗,分类通常是建立在回归之上. 本文主要讲基本的分类方法 ----- KNN最邻近分类算法  KNN最邻近分类算法 ,简称KNN,最简单的机器学习算法之一. 核心逻辑:在距离空间里,如果一个样本的最接近的K个邻

K近邻分类算法实现 in Python

K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(curse of dimension) * Machine Learning的Python库很多,比如mlpy(更多packages),这里实现只是为了掌握方法 * MATLAB 中的调用,见<MATLAB分类器大全(svm,knn,随机森林等)> * KNN算法复杂度高(可用KD树优化,C中可以用

数据挖掘中分类算法小结

数据挖掘中分类算法小结 数据仓库,数据库或者其它信息库中隐藏着许多可以为商业.科研等活动的决策提供所需要的知识.分类与预测是两种数据分析形式,它们可以用来抽取能够描述重要数据集合或预测未来数据趋势的模型.分类方法(Classification)用于预测数据对象的离散类别(Categorical Label);预测方法(Prediction )用于预测数据对象的连续取值. 分类技术在很多领域都有应用,例如可以通过客户分类构造一个分类模型来对银行贷款进行风险评估;当前的市场营销中很重要的一个特点是强

KNN分类算法实现手写数字识别

需求: 利用一个手写数字"先验数据"集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ?数据维度比较大,样本数比较多. ? 数据集包括数字0-9的手写体. ?每个数字大约有200个样本. ?每个样本保持在一个txt文件中. ?手写体图像本身的大小是32x32的二值图,转换到txt文件保存后,内容也是32x32个数字,0或者1,如下: 数据集压缩包解压后有两个目录:(将这两个目录文件夹拷贝的项目路径下E:/KNNCase/digits/) ?目录trainingD

20151014_基于距离的分类算法之KNN

1.原理 通过计算每个训练数据到待分类元组的距离,取和待分类元组距离最近的K个训练数据,K个数据中哪个类别的训练数据占多数,则待分类元组就属于哪个类别. 训练样本用n维数值属性描述.每个样本代表n维空间的一个点.所有的训练样本都放在n维模式空间中.给定一个样本,k-最临近分类法搜索模式空间,找出最接近未知样本的k个训练样本. 2.需要的信息 训练集 距离计算值 要获取的最邻近的邻居的数目k 计算两点之间的距离 例如可采用欧几里得距离:d = sqrt((x1-x2)^2+(y1-y2)^2+..

KNN分类算法--python实现

一.kNN算法分析 K最近邻(k-Nearest Neighbor,KNN)分类算法可以说是最简单的机器学习算法了.它采用测量不同特征值之间的距离方法进行分类.它的思想很简单:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. KNN算法中,所选择的邻居都是已经正确分类的对象.该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别.由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别