不懂演算法的資料開發者不是一個好的演算法工程師,還記得研究生時候,導師講過的一些資料挖掘演算法,頗有興趣,但是無奈作業后接觸少了,資料工程師的鄙視鏈,模型>實時>離線數倉>ETL工程師>BI工程師(不喜勿噴哈),現在做的作業主要是離線數倉,當然前期也做過一些ETL的作業,為了職業的長遠發展,拓寬自己的技術邊界,有必要逐步深入實時和模型,所以從本篇文章開始,也是列個FLAG,深入學習實時和模型部分,
改變自己,從提升自己不擅長領域的事情開始,
1. KNN - K近鄰演算法簡介
首先,KNN是一種分類演算法,有監督的機器學習,將訓練集的類別打標簽,當測驗物件和訓練物件完全匹配時候,就可以對其進行分類,但是測驗物件與訓練物件的多個類,如何匹配呢,前面可以判別是否測驗物件術語某個訓練物件,但是如果是多個訓練物件類,那如何解決這種問題呢,所以就有了KNN,KNN是通過測量不同特征值之間的距離進行分類,它的思路是:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數屬于某一個類別,則該樣本也屬于這個類別,其中K通常是不大于20的整數,KNN演算法中,所選擇的鄰居都是已經正確分類的物件,該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別

KNN演算法的核心思想是,如果一個樣本在特征空間中的K個最相鄰的樣本中的大多數屬于某一個類別,則該樣本也屬于這個類別,并具有這個類別上樣本的特性,該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別,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提取碼:hell
復制這段內容后打開百度網盤手機App,操作更方便哦
鳶尾花資料集,資料集包含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=https://www.cnblogs.com/hulichao/archive/2021/01/25/data.filter(_.label!=" ")
val testData=https://www.cnblogs.com/hulichao/archive/2021/01/25/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
吳邪,小三爺,混跡于后臺,大資料,人工智能領域的小菜鳥,
更多請關注

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252003.html
標籤:其他
上一篇:機器學習-KMeans演算法原理 && Spark實作
下一篇:Android中的藍牙通信
