日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

机器学习算法总结--K近邻

發(fā)布時(shí)間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习算法总结--K近邻 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考文章:

  • 《統(tǒng)計(jì)學(xué)習(xí)方法》
  • 機(jī)器學(xué)習(xí)常見(jiàn)算法個(gè)人總結(jié)(面試用)
  • 機(jī)器學(xué)習(xí)系列(9)_機(jī)器學(xué)習(xí)算法一覽(附Python和R代碼)

簡(jiǎn)介

k近鄰(KNN)是一種基本分類(lèi)與回歸方法。

其思路如下:給一個(gè)訓(xùn)練數(shù)據(jù)集和一個(gè)新的實(shí)例,在訓(xùn)練數(shù)據(jù)集中找出與這個(gè)新實(shí)例最近的k個(gè)訓(xùn)練實(shí)例,然后統(tǒng)計(jì)最近的k個(gè)訓(xùn)練實(shí)例中所屬類(lèi)別計(jì)數(shù)最多的那個(gè)類(lèi),就是新實(shí)例的類(lèi)。其流程如下所示:

  • 計(jì)算訓(xùn)練樣本和測(cè)試樣本中每個(gè)樣本點(diǎn)的距離(常見(jiàn)的距離度量有歐式距離,馬氏距離等);
  • 對(duì)上面所有的距離值進(jìn)行排序;
  • 選前k個(gè)最小距離的樣本;
  • 根據(jù)這k個(gè)樣本的標(biāo)簽進(jìn)行投票,得到最后的分類(lèi)類(lèi)別;
  • KNN的特殊情況是k=1的情況,稱(chēng)為最近鄰算法。對(duì)輸入的實(shí)例點(diǎn)(特征向量)x,最近鄰法將訓(xùn)練數(shù)據(jù)集中與x最近鄰點(diǎn)的類(lèi)作為其類(lèi)別。

    三要素

  • k值的選擇
  • 距離的度量(常見(jiàn)的距離度量有歐式距離,馬氏距離)
  • 分類(lèi)決策規(guī)則(多數(shù)表決規(guī)則)
  • k值的選擇

  • k值越小表明模型越復(fù)雜,更加容易過(guò)擬合
  • 但是k值越大,模型越簡(jiǎn)單,如果k=N的時(shí)候就表明無(wú)論什么點(diǎn)都是訓(xùn)練集中類(lèi)別最多的那個(gè)類(lèi)
  • 所以一般k會(huì)取一個(gè)較小的值,然后用過(guò)交叉驗(yàn)證來(lái)確定
    這里所謂的交叉驗(yàn)證就是將樣本劃分一部分出來(lái)為預(yù)測(cè)樣本,比如95%訓(xùn)練,5%預(yù)測(cè),然后k分別取1,2,3,4,5之類(lèi)的,進(jìn)行預(yù)測(cè),計(jì)算最后的分類(lèi)誤差,選擇誤差最小的k

    距離的度量

    KNN算法使用的距離一般是歐式距離,也可以是更一般的Lp距離或者馬氏距離,其中Lp距離定義如下:

    Lp(xi,xj)=(l=1n|x(l)i?x(l)j|p)1p
    這里xi=(x(1)i,x(2)i,...x(n)i)T,xj=(x(1)j,x(2)j,...,x(n)j)T,然后p1

    當(dāng)p=2,稱(chēng)為歐式距離,即

    L2(xi,xj)=(l=1n|x(l)i?x(l)j|2)12
    當(dāng)p=1,稱(chēng)為曼哈頓距離,即
    L1(xi,xj)=l=1n|x(l)i?x(l)j|
    當(dāng)p=,它是各個(gè)坐標(biāo)距離的最大值,即
    L(xi,xj)=maxl|x(l)i?x(l)j|

    馬氏距離如下定義:

    KNN的回歸

    在找到最近的k個(gè)實(shí)例之后,可以計(jì)算這k個(gè)實(shí)例的平均值作為預(yù)測(cè)值。或者還可以給這k個(gè)實(shí)例添加一個(gè)權(quán)重再求平均值,這個(gè)權(quán)重與度量距離成反比(越近權(quán)重越大)。

    優(yōu)缺點(diǎn)

    優(yōu)點(diǎn)

  • 思想簡(jiǎn)單,理論成熟,既可以用來(lái)做分類(lèi)也可以用來(lái)做回歸;
  • 可用于非線性分類(lèi);
  • 訓(xùn)練時(shí)間復(fù)雜度為O(n)

    • 準(zhǔn)確度高,對(duì)數(shù)據(jù)沒(méi)有假設(shè),對(duì)異常值不敏感;
    • 缺點(diǎn)

    • 計(jì)算量大;
    • 樣本不平衡問(wèn)題(即有些類(lèi)別的樣本數(shù)量很多,而其它樣本的數(shù)量很少);
    • 需要大量的內(nèi)存;
    • KD樹(shù)

      KD樹(shù)是一個(gè)二叉樹(shù),表示對(duì)K維空間的一個(gè)劃分,可以進(jìn)行快速檢索(那KNN計(jì)算的時(shí)候不需要對(duì)全樣本進(jìn)行距離的計(jì)算了)

      構(gòu)造KD樹(shù)

      在k維的空間上循環(huán)找子區(qū)域的中位數(shù)進(jìn)行劃分的過(guò)程。
      假設(shè)現(xiàn)在有K維空間的數(shù)據(jù)集T=x1,x2,x3,xn,xi=a1,a2,a3..ak

    • 首先構(gòu)造根節(jié)點(diǎn),以坐標(biāo)a1的中位數(shù)b為切分點(diǎn),將根結(jié)點(diǎn)對(duì)應(yīng)的矩形局域劃分為兩個(gè)區(qū)域,區(qū)域1中a1<b,區(qū)域2中a1>b
    • 構(gòu)造葉子節(jié)點(diǎn),分別以上面兩個(gè)區(qū)域中a2的中位數(shù)作為切分點(diǎn),再次將他們兩兩劃分,作為深度1的葉子節(jié)點(diǎn),(如果數(shù)a2=數(shù),則a2的實(shí)例落在切分面)
    • 不斷重復(fù)2的操作,深度為j的葉子節(jié)點(diǎn)劃分的時(shí)候,索取的aii=j,直到兩個(gè)子區(qū)域沒(méi)有實(shí)例時(shí)停止
    • KD樹(shù)的搜索

    • 首先從根節(jié)點(diǎn)開(kāi)始遞歸往下找到包含x的葉子節(jié)點(diǎn),每一層都是找對(duì)應(yīng)的xi
    • 將這個(gè)葉子節(jié)點(diǎn)認(rèn)為是當(dāng)前的“近似最近點(diǎn)
    • 遞歸向上回退,如果以x圓心,以“近似最近點(diǎn)”為半徑的球與根節(jié)點(diǎn)的另一半子區(qū)域邊界相交,則說(shuō)明另一半子區(qū)域中存在與x更近的點(diǎn),則進(jìn)入另一個(gè)子區(qū)域中查找該點(diǎn)并且更新”近似最近點(diǎn)“
    • 重復(fù)3的步驟,直到另一子區(qū)域與球體不相交或者退回根節(jié)點(diǎn)
    • 最后更新的”近似最近點(diǎn)“與x真正的最近點(diǎn)
    • KD樹(shù)進(jìn)行KNN查找

      通過(guò)KD樹(shù)的搜索找到與搜索目標(biāo)最近的點(diǎn),這樣KNN的搜索就可以被限制在空間的局部區(qū)域上了,可以大大增加效率。

      KD樹(shù)搜索的復(fù)雜度

      當(dāng)實(shí)例隨機(jī)分布的時(shí)候,搜索的復(fù)雜度為log(N)N<script type="math/tex" id="MathJax-Element-47">N</script>為實(shí)例的個(gè)數(shù),KD樹(shù)更加適用于實(shí)例數(shù)量遠(yuǎn)大于空間維度的KNN搜索,如果實(shí)例的空間維度與實(shí)例個(gè)數(shù)差不多時(shí),它的效率基于等于線性掃描

      代碼實(shí)現(xiàn)

      使用sklearn的簡(jiǎn)單代碼例子:

      #Import Library from sklearn.neighbors import KNeighborsClassifier#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create KNeighbors classifier object model KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5# Train the model using the training sets and check score model.fit(X, y)#Predict Output predicted= model.predict(x_test)

      最后,在用KNN前你需要考慮到:

      • KNN的計(jì)算成本很高
      • 所有特征應(yīng)該標(biāo)準(zhǔn)化數(shù)量級(jí),否則數(shù)量級(jí)大的特征在計(jì)算距離上會(huì)有偏移。
      • 在進(jìn)行KNN前預(yù)處理數(shù)據(jù),例如去除異常值,噪音等。

    總結(jié)

    以上是生活随笔為你收集整理的机器学习算法总结--K近邻的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。