在本系列前面的文章中,简单介绍了一下Ignite的线性回归算法,下面会尝试另一个机器学习算法,即k-最近邻(k-NN)分类。该算法基于对象k个最近邻中最常见的类来对对象进行分类,可用于确定类成员的关系。
  
  一个适合k-NN分类的数据集是鸢尾花数据集,它可以很容易地通过UCI网站获得。
  
  鸢尾花数据集由150个样本组成,来自3种不同种类的鸢尾花各有50朵(Iris Setosa, Iris Versicolour和Iris Virginica)。以下四个特征可供每个样本使用:
  
  萼片长度(cm)
  
  萼片宽度(cm)
  
  花瓣长度(cm)
  
  花瓣宽度(cm)
  
  下面会创建一个模型,利用这四个特征区分不同的物种。
  
  首先,要获取原始数据并将其拆分成训练数据(60%)和测试数据(40%)。然后再次使用Scikit-learn来执行这个任务,下面修改一下前一篇文章中使用的代码,如下:
  
  from sklearn import datasets
  
  import pandas as pd
  
  # Load Iris dataset.
  
  iris_dataset = datasets.load_iris()
  
  x = iris_dataset.data
  
  y = iris_dataset.target
  
  # Split it into www.trgj888.com/ train and test subsets.
  
  from sklearn.model_selection import train_test_split
  
  x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4, random_state=23)
  
  # Save train set.
  
  train_ds = pd.DataFrame(x_train, columns=iris_dataset.feature_names)
  
  train_ds["TARGET"] = y_train
  
  train_ds.to_csv("iris-train.csv", index=False, header=None)
  
  # Save test set.
  
  test_ds = pd.DataFrame(x_test, columns=iris_dataset.feature_names)
  
  test_ds["TARGET"] = y_test
  
  test_ds.to_csv("iris-test.csv", index=False, header=None)
  
  当训练和测试数据准备好之后,就可以写应用了,本文的算法是:
  
  读取训练数据和测试数据;
  
  在Ignite中保存训练数据和测试数据;
  
  使用训练数据拟合k-NN模型;
  
  将模型应用于测试数据;
  
  确定模型的准确性。
  
  读取训练数据和测试数据
  
  需要读取两个有5列的CSV文件,一个是训练数据,一个是测试数据,5列分别为:
  
  萼片长度(cm)
  
  萼片宽度(cm)
  
  花瓣长度(cm)
  
  花瓣宽度(cm)
  
  花的种类(0:Iris Setosa,1:Iris Versicolour,2:Iris Virginica)
  
  通过下面的代码,可以从CSV文件中读取数据:
  
  private static void loadData(String fileName, IgniteCache<Integer, IrisObservation> cache)
  
  throws FileNotFoundException {
  
  Scanner scanner =www.mingcheng178.com/ new Scanner(new File(fileName));
  
  int cnt www.gcyL157.com= 0;
  
  while (scanner.hasNextLine()) {
  
  String row = scanner.nextLine();
  
  String[] cells = row.split(",");
  
  double[] features = new double[cells.length - 1];
  
  for (int i = 0;www.mhylpt.com i www.yigouyule2.cn< cells.length - 1; i++)
  
  features[i] = Double.valueOf(cells[i]);
  
  double flowerClass = Double.valueOf(cells[cells.length - 1]);
  
  cache.put(cnt++, new IrisObservation(features, flowerClass));
  
  }
  
  }
  
  该代码简单地一行行的读取数据,然后对于每一行,使用CSV的分隔符拆分出字段,每个字段之后将转换成double类型并且存入Ignite。
  
  将训练数据和测试数据存入Ignite
  
  前面的代码将数据存入Ignite,要使用这个代码,首先要创建Ignite存储,如下:
  
  IgniteCache<Integer, IrisObservation> trainData = getCache(ignite, "IRIS_TRAIN");
  
  IgniteCache<Integer, IrisObservation> testData = getCache(ignite, "IRIS_TEST");
  
  loadData("src/main/resources/iris-train.csv", trainData);
  
  loadData("src/main/resources/iris-test.csv", testData);
  
  getCache()的实现如下:
  
  private static IgniteCache<Integer, IrisObservation> getCache(Ignite ignite, String cacheName) {
  
  CacheConfiguration<Integer, IrisObservation> cacheConfiguration = new CacheConfiguration<>();
  
  cacheConfiguration.setName(cacheName);
  
  cacheConfiguration.setAffinity(new RendezvousAffinityFunction(false, 10));
  
  IgniteCache<Integer, IrisObservation> cache = ignite.createCache(cacheConfiguration);
  
  return cache;
  
  }
  
  使用训练数据拟合k-NN分类模型
  
  数据存储之后,可以像下面这样创建训练器:
  
  KNNClassificationTrainer trainer = new KNNClassificationTrainer();
  
  然后拟合训练数据,如下:
  
  KNNClassificationModel mdl = trainer.fit(
  
  ignite,
  
  trainData,
  
  (k, v) -> v.getFeatures(),
  
  // Feature extractor.
  
  (k, v) -> v.getFlowerClass())
  
  // Label extractor.
  
  .withK(3)
  
  .withDistanceMeasure(new EuclideanDistance())
  
  .withStrategy(KNNStrategy.WEIGHTED);
  
  Ignite将数据保存为键-值(K-V)格式,因此上面的代码使用了值部分,目标值是Flower类,特征在其它列中。将k的值设为3,代表3种。对于距离测量,可以有几个选择,如欧几里德、汉明或曼哈顿,在本例中使用欧几里德。最后要指定是使用SIMPLE算法还是使用WEIGHTED k-NN算法,在本例中使用WEIGHTED。
  
  将模型应用于测试数据
  
  下一步,就可以用训练好的分类模型测试测试数据了,可以这样做:
  
  int amountOfErrors = 0;
  
  int totalAmount = 0;
  
  try (QueryCursor<Cache.Entry<Integer, IrisObservation>> cursor = testData.query(new ScanQuery<>())) {
  
  for (Cache.Entry<Integer, IrisObservation> testEntry : cursor) {
  
  IrisObservation observation = testEntry.getValue();
  
  double groundTruth = observation.getFlowerClass();
  
  double prediction = mdl.apply(new DenseLocalOnHeapVector(observation.getFeatures()));
  
  totalAmount++;
  
  if (groundTruth != prediction)
  
  amountOfErrors++;
  
  System.out.printf(">>> | %.0f\t\t\t | %.0f\t\t\t|\n", prediction, groundTruth);
  
  }
  
  System.out.println(">>> -----------------------------");
  
  System.out.println("\n>>> Absolute amount of errors " + amountOfErrors);
  
  System.out.printf("\n>>> Accuracy %.2f\n", (1 - amountOfErrors / (double) totalAmount));
  
  }
  
  确定模型的准确性
  
  下面,就可以通过对测试数据中的真实分类和模型进行的分类进行对比,来确认模型的真确性。
  
  代码运行之后,总结如下:
  
  >>> Absolute amount of errors 2
  
  >>> Accuracy 0.97
  
  因此,Ignite能够将97%的测试数据正确地分类为3个不同的种类。
  
  总结
  
  Apache Ignite提供了一个机器学习算法库。通过k-NN分类示例,可以看到创建模型、测试模型和确定准确性的简单性。
  
  在机器学习系列的下一篇中,将研究另一种机器学习算法。敬请期待!

 

在Ignite中使用k-最近邻(k-NN)分类算法的更多相关文章

  1. 【cs231n】图像分类 k-Nearest Neighbor Classifier(K最近邻分类器)【python3实现】

    [学习自CS231n课程] 转载请注明出处:http://www.cnblogs.com/GraceSkyer/p/8763616.html k-Nearest Neighbor(KNN)分类器 与其 ...

  2. 转载: scikit-learn学习之K最近邻算法(KNN)

    版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...

  3. K最近邻算法

    K最近邻(K-Nearest-Neighbour,KNN)算法是机器学习里简单易掌握的一个算法.通过你的邻居判断你的类型,“近朱者赤,近墨者黑”表达了K近邻的算法思想. 一.算法描述: 1.1 KNN ...

  4. 分类算法——k最近邻算法(Python实现)(文末附工程源代码)

    kNN算法原理 k最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样 ...

  5. kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法

    一.KNN算法概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它 ...

  6. 机器学习---K最近邻(k-Nearest Neighbour,KNN)分类算法

    K最近邻(k-Nearest Neighbour,KNN)分类算法 1.K最近邻(k-Nearest Neighbour,KNN) K最近邻(k-Nearest Neighbour,KNN)分类算法, ...

  7. k最近邻算法(kNN)

    from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k): d ...

  8. 图说十大数据挖掘算法(一)K最近邻算法

    如果你之前没有学习过K最近邻算法,那今天几张图,让你明白什么是K最近邻算法. 先来一张图,请分辨它是什么水果 很多同学不假思索,直接回答:“菠萝”!!! 仔细看看同学们,这是菠萝么?那再看下边这这张图 ...

  9. 《算法图解》——第十章 K最近邻算法

    第十章    K最近邻算法 1 K最近邻(k-nearest neighbours,KNN)——水果分类 2 创建推荐系统 利用相似的用户相距较近,但如何确定两位用户的相似程度呢? ①特征抽取 对水果 ...

  10. [笔记]《算法图解》第十章 K最近邻算法

    K最近邻算法 简称KNN,计算与周边邻居的距离的算法,用于创建分类系统.机器学习等. 算法思路:首先特征化(量化) 然后在象限中选取目标点,然后通过目标点与其n个邻居的比较,得出目标的特征. 余弦相似 ...

随机推荐

  1. django连接mysql数据库配置,出现no module named mysqldb报错

    作为一个菜鸟运维也是要有梦想的,万一学会了python走向人生巅峰了呢.好吧,都是瞎想,今天主要介绍下django配置,最近也开始摸索这个牛b框架了,当然大佬肯定不屑一顾,都是照顾照顾我们这些菜鸟初学 ...

  2. scrapy--Cookies

    大家好,之前看到的关于cookies的应用,由于有段时间没看,再看的时候花了一些时间,来给大家总结下.本文是根据:"http://www.bubuko.com/infodetail-2233 ...

  3. python_字符串_常用处理

    1. 输出原序列的反向互补序列 in1 = open("brca1.fasta", "r") out1 = open("re_brca1.fasta& ...

  4. 单源次短路径:poj:3255-Roadblocks

    Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17521 Accepted: 6167 Descripti ...

  5. 笔记-docker-2安装(centos6.5环境)

    笔记-docker-2安装(centos6.5环境) 1.      centos6.5安装docker 1.1.    升级内核 安装docker,官方文档要求linux kernel至少3.8以上 ...

  6. K-均值聚类——电影类型

    K-均值聚类 K-均值算法试图将一系列样本分割成K个不同的类簇(其中K是模型的输入参数),其形式化的目标函数称为类簇内的方差和(within cluster sum of squared errors ...

  7. TouTiao开源项目 分析笔记7 加载数据的过程

    1.以新闻页中的段子数据显示为例 1.1.首先执行InitApp==>SplashActivity. 因为在AndroidManifest.xml中定义了一个<intent-filter& ...

  8. PHP.16-PDO

    PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口.实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能. 注意利用 PDO 扩展自身并不能实现任何数 ...

  9. Web性能测试问题,mysql分析之一

    在做性能测试执行中,发现性能很慢,顺藤摸瓜找一下是什么问题? 并发40个用XXX场景 1.运行过程中监控mysql数据库的CPU过高,达到65%: %CPU   %Mem  %Disk   %Net ...

  10. CodeForces 778D Parquet Re-laying 构造

    题意: 有两个\(n \times m\)的矩阵\(A,B\),都是由\(1 \times 2\)的砖块铺成,代表初始状态和结束状态 有一种操作可以把两个砖块拼成的\(2 \times 2\)的矩形旋 ...