機械学習-KNNアルゴリズムの原理&& Sparkの実装

アルゴリズムを理解していないデータ開発者は、優れたアルゴリズムエンジニアではありません。大学院生のときにインストラクターが言ったデータマイニングアルゴリズムのいくつかを今でも覚えています。非常に興味がありましたが、仕事の後の連絡が少なかったのです。データエンジニアの軽蔑チェーン、モデル>リアルタイム>オフラインデータウェアハウス> ETLエンジニア> BIエンジニア(気に入らない場合)、現在行っている作業は主にオフラインデータウェアハウスです。もちろん、ETL作業もいくつか行っています。職業の長期的な発展のために、技術的な境界を広げます。リアルタイムとモデルを徐々に深める必要があるので、この記事から始めて、実際を学ぶためのFLAGもリストします。 -時間とモデル部分の詳細。

自分を変えるには、自分が苦手なことを改善することから始めます。

1.KNN-K最近傍アルゴリズムの概要

まず、KNNは、教師あり機械学習を使用してトレーニングセットのカテゴリにラベルを付ける分類アルゴリズムです。テストオブジェクトとトレーニングオブジェクトが完全に一致すると、分類できますが、テストオブジェクトとトレーニングオブジェクトには複数のラベルがあります。クラスマッチング方法?以前はテストオブジェクトの用語が特定のトレーニングオブジェクトであるかどうかを判断できますが、トレーニングオブジェクトのクラスが複数ある場合は、この問題を解決する方法があります。KNNがあります。KNNは異なる特徴値間で測定されます。分類されます。アイデアは次のとおりです。特徴空間内のサンプルのk個の最も類似した(つまり、特徴空間内の最近傍)サンプルのほとんどが特定のカテゴリに属する​​場合、サンプルもこのカテゴリに属します。Kは通常大きくありません。 20の整数より。KNNアルゴリズムでは、選択された近傍はすべて正しく分類されたオブジェクトです。この方法では、分類決定で最も近い1つまたは複数のサンプルのカテゴリに基づいて、分類するサンプルのカテゴリのみを決定します。

ファイルKNNアルゴリズムの中心的な考え方は、サンプルの特徴空間内のK最近傍サンプルのほとんどが特定のカテゴリに属している場合、サンプルもこのカテゴリに属し、このカテゴリのサンプルの特性を持っているということです。この方法は、分類決定を決定する際に、最も近い1つまたは複数のサンプルのカテゴリに基づいて分類されるサンプルのカテゴリのみを決定します。KNN法は、カテゴリを決定するときに、非常に少数の隣接するサンプルにのみ関連します。KNN法は、クラスドメインを識別してカテゴリを決定する方法ではなく、主に限られた周囲のサンプルに依存するため、KNN法は、クラスドメインのクロスまたはオーバーラップを増やしてサンプルセットを分割する他の方法よりも優れています。 。フィット感のために。

2.KNNアルゴリズムフロー

2.1データを準備し、データを前処理します。

2.2テストサンプルポイント(つまり、分類されるポイント)から他のサンプルポイントまでの距離を計算します。

2.3各距離を並べ替えてから、距離が最小のK点を選択します。

2.4 Kポイントが属するカテゴリを比較し、少数派が多数派に従うという原則に従って、テストサンプルポイントはKポイントの中で最も比率が高いものに分類されます。

3.KNNアルゴリズムの長所と短所

利点:理解しやすく、実装が非常に便利で、パラメーターを推定する必要がなく、トレーニングも不要です。

短所:データセット内の特定のクラスのデータ量が多い場合、これらのポイントに近づく可能性も高くなるため、必然的にこのクラスのテストセットが増えることになります。

4.KNNアルゴリズムSparkの実装

4.1データのダウンロードと説明

リンク:https://pan.baidu.com/s/1FmFxSrPIynO3udernLU0yQ抽出コード:地獄このコンテンツをコピーした後、Baidu Netdisk携帯電話アプリを開くと、操作がより便利になります

アイリスフラワーデータセット、データセットには3種類の150キーデータが含まれ、各タイプには50データが含まれ、各レコードには4つの特徴が含まれます:がくの長さ、がくの幅、花びらの長さ、花びらの幅

これらの4つの機能を使用して、アイリスの花が属する種を予測します(iris-setosa、iris-versicolour、iris-virginica)

4.2実装

package com.hoult.work

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object KNNDemo {
  def main(args: Array[String]): Unit = {

    //1.初始化
    val conf=new SparkConf().setAppName("SimpleKnn").setMaster("local[*]")
    val sc=new SparkContext(conf)
    val K=15

    //2.读取数据,封装数据
    val data: RDD[LabelPoint] = sc.textFile("data/lris.csv")
      .map(line => {
        val arr = line.split(",")
        if (arr.length == 6) {
          LabelPoint(arr.last, arr.init.map(_.toDouble))
        } else {
          println(arr.toBuffer)
          LabelPoint(" ", arr.map(_.toDouble))
        }
      })


    //3.过滤出样本数据和测试数据
    val sampleData=data.filter(_.label!=" ")
    val testData=data.filter(_.label==" ").map(_.point).collect()

    //4.求每一条测试数据与样本数据的距离
    testData.foreach(elem=>{
      val distance=sampleData.map(x=>(getDistance(elem,x.point),x.label))
      //获取距离最近的k个样本
      val minDistance=distance.sortBy(_._1).take(K)
      //取出这k个样本的label并且获取出现最多的label即为测试数据的label
      val labels=minDistance.map(_._2)
        .groupBy(x=>x)
        .mapValues(_.length)
        .toList
        .sortBy(_._2).reverse
        .take(1)
        .map(_._1)
      printf(s"${elem.toBuffer.mkString(",")},${labels.toBuffer.mkString(",")}")
      println()
    })
    sc.stop()

  }

  case class LabelPoint(label:String,point:Array[Double])

  import scala.math._

  def getDistance(x:Array[Double],y:Array[Double]):Double={
    sqrt(x.zip(y).map(z=>pow(z._1-z._2,2)).sum)
  }
}

完全なコード:https//github.com/hulichao/bigdata-spark/blob/master/src/main/scala/com/hoult/work/KNNDemo.scala Wu Xie、Xiao San Ye、バックグラウンドで混合、ビッグデータ、マニュアルインテリジェンスの分野の新人。もっと注意してくださいファイル

おすすめ

転載: blog.csdn.net/hu_lichao/article/details/113101236