spark 機器學習 knn原理(一)

来源:https://www.cnblogs.com/xiguage119/archive/2019/05/06/10820484.html
-Advertisement-
Play Games

1.knnK最近鄰(k-Nearest Neighbor,KNN)分類演算法,在給定一個已經做好分類的數據集之後,k近鄰可以學習其中的分類信息,並可以自動地給未來沒有分類的數據分好類。我們可以把用戶分為兩類:“高信譽用戶”和“低信譽用戶”,酒店則可以分為:“五星”,“四星”,“三星”,“兩星”,“一星 ...


1.knn
K最近鄰(k-Nearest  Neighbor,KNN)分類演算法,在給定一個已經做好分類的數據集之後,k近鄰可以學習其中的分類信息,並可以自動地給未來沒有分類的數據分好類。
我們可以把用戶分為兩類:“高信譽用戶”和“低信譽用戶”,酒店則可以分為:“五星”,“四星”,“三星”,“兩星”,“一星”。
這些可以使用線性回歸做分類嗎?
答案:能做,但不建議使用,線性模型的輸出值是連續性的實數值,而分類模型的任務要求是得到分類型的模型輸出結果。從這一點上看,線性模型不適合用於分類問題。
我們換一個思路,這裡用“閾值”概念,也就是將連續性數值離散化,比如信譽預測中,我們可以把閾值定為700,高於700的為高信譽用戶,低於700的為低信譽用戶,這裡我們把連續性變數轉換成一個“二元變數”,當然也可以使用更多“閾值”,比如可以分為,低信譽,中等信譽,高信譽。

###############################################################
回歸與分類的不同
1.回歸問題的應用場景(預測的結果是連續的,例如預測明天的溫度,23,24,25度)
回歸問題通常是用來預測一個值,如預測房價、未來的天氣情況等等,例如一個產品的實際價格為500元,通過回歸分析預測值為499元,我們認為這是一個比較好的回歸分析。一個比較常見的回歸演算法是線性回歸演算法(LR)。另外,回歸分析用在神經網路上,其最上層是不需要加上softmax函數的,而是直接對前一層累加即可。回歸是對真實值的一種逼近預測。
2.分類問題的應用場景(預測的結果是離散的,例如預測明天天氣-陰,晴,雨)
分類問題是用於將事物打上一個標簽,通常結果為離散值。例如判斷一幅圖片上的動物是一隻貓還是一隻狗,分類通常是建立在回歸之上,分類的最後一層通常要使用softmax函數進行判斷其所屬類別。分類並沒有逼近的概念,最終正確結果只有一個,錯誤的就是錯誤的,不會有相近的概念。最常見的分類方法是邏輯回歸,或者叫邏輯分類。
############################################################

如下圖所示,我們想要知道綠色點要被決定賦予哪個類,是紅色三角形還是藍色正方形?我們利用KNN思想,如果假設K=3,選取三個距離最近的類別點,由於紅色三角形所占比例為2/3,因此綠色點被賦予紅色三角形類別。如果假設K=5,由於藍色正方形所占比例為3/5,因此綠色點被賦予藍色正方形類別。

從上面實例,我們可以總結下KNN演算法過程
   1.1. 計算測試數據與各個訓練數據之間的距離。
   1.2. 按照距離的遞增關係進行排序,選取距離最小的K個點。
   1.3. 確定前K個點所在類別的出現頻率,返回前K個點中出現頻率最高的類別作為測試數據的預測分類。
從KNN演算法流程中,我們也能夠看出KNN演算法三個重要特征,即距離度量方式、K值的選取和分類決策規則。
1.1距離:
KNN演算法常用歐式距離度量方式,當然我們也可以採用其他距離度量方式,如曼哈頓距離
歐氏距離是最容易直觀理解的距離度量方法,兩個點在空間中的距離一般都是指歐氏距離。



1.2 K值的選取: KNN演算法決策結果很大程度上取決於K值的選擇。選擇較小的K值相當於用較小領域中的訓練實例進行預測,訓練誤差會減小,但同時整體模型變得複雜,容易過擬合。選擇較大的K值相當於用較大領域中訓練實例進行預測,可以減小泛化誤差,但同時整體模型變得簡單,預測誤差會增大。
1.3 分類決策規則:k值中對象們“投票”,哪類對象“投票”數多就屬於哪類,如果“投票”數一樣多,那麼隨機抽選出一個類。

2.1knn KD樹
我們舉例來說明KD樹構建過程,假如有二維樣本6個,分別為{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},KD樹過程構建過程如下
2.1.1尋找劃分特征: 6個數據點在x,y維度上方差分別為6.97,5.37,x軸上方差更大,用x軸特征建樹。
######################################################


方差或表達為:

######################################################
2.1.2Node-data = (7,2)。具體是:根據x維上的值將數據排序,6個數據的中值(所謂 中值,即中間大小的值)為7,所以Node-data域位數據點(7,2)。這樣,該節點的分割超平面就是通過(7,2)並垂直於:split=x軸的直線x=7
2.1.3左子空間和右子空間。具體是:分割超平面x=7將整個空間分為兩部分:x<=7的部分為左子空間,包含3個節點={(2,3),(5,4),(4,7)};另一部分為右子空間,包含2個節點={(9,6),(8,1)};

2.1.4遞歸構建KD樹:用同樣的方法劃分左子樹{(2,3),(5,4),(4,7)}和右子樹{(9,6),(8,1)},最終得到KD樹。
 如左子樹{(2,3),(5,4),(4,7)} x軸方差 2.3,y軸方差4.3,所有使用y軸進行分割
 重覆上面2.1,2.2,2.3 步驟 ,中值為5.4


首先,粗黑線將空間一分為二,然後在兩個子空間中,細黑直線又將整個空間劃分為四部分,最後虛黑直線將這四部分進一步劃分。

2.2 KD樹搜索最近鄰
當我們生成KD樹後,就可以預測測試樣本集裡面的樣本目標點。
   1 二叉搜索:對於目標點,通過二叉搜索,能夠很快在KD樹裡面找到包含目標點的葉子節點。
    2回溯:為找到最近鄰,還需要進行回溯操作,演算法沿搜索路徑反向查找是否有距離查詢點更近的數據點。以目標點為圓心,目標點到葉子節點的距離為半徑,得到一個超球體,最鄰近點一定在這個超球體內部。
    3更新最近鄰:返回葉子節點的父節點,檢查另一葉子節點包含的超矩形體是否和超球體相交,如果相交就到這個子節點中尋找是否有更近的最近鄰,有的話就更新最近鄰。如果不相交就直接返回父節點的父節點,在另一子樹繼續搜索最近鄰。當回溯到根節點時,演算法結束,此時保存的最近鄰節點就是最終的最近鄰。

2.3KD樹預測
根據KD樹搜索最近鄰的方法,我們能夠得到第一個最近鄰數據點,然後把它置為已選。然後忽略置為已選的樣本,重新選擇最近鄰,這樣運行K次,就能得到K個最近鄰。如果是KNN分類,根據多數表決法,預測結果為K個最近鄰類別中有最多類別數的類別。如果是KNN回歸,根據平均法,預測結果為K個最近鄰樣本輸出的平均值。




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • python django uwsgi nginx安裝 已安裝完成python/django的情況下安裝 pip install uwsgi cd /usr/share/nginx/html/ vim uwsgi.ini輸入以下內容 #uwsgi.ini file [uwsgi] # Django- ...
  • 1.去官網下載適用於linux的jdk包,如jdk-8u162-linux-x64.tar.gz 2.創建目錄,將jdk包拷貝到該目錄下,如home/haha/user/java 3.在控制臺中進入該目錄,執行tar zxvf jdk-8u162-linux-x64.tar.gz 進行解壓 4.配置 ...
  • 一、前言 1、簡介 回顧上一篇UART發送當中,已經講解瞭如何實現UART的發送操作了,接下來這一篇將會繼續講解如何實現UART的接收操作。 2、UART簡介 嵌入式開發中,UART串口通信協議是我們常用的通信協議之一,全稱叫做通用非同步收發傳輸器(Universal Asynchronous Rec ...
  • 一、說明 sdhci msm是指高通的mmc host,其使用了標準SDHC標準。故可以使用前面說的《host(第二章)——sdhci》和《host(第三章)——sdhci pltfm說明》的介面。 後續代碼以msm8916平臺的host實現以及linux 4.6.0版本中的sdhci msm的實現 ...
  • 一、sdhci pltfm說明 sdhci pltfm並不是實際某個host的driver。 sdhci pltfm是指在sdhci core的基礎上,提供了統一對sdhci_host的必要屬性進行解析和設置的方法。 但是,對於sdhci類的host driver來說,使用sdhci pltfm並不 ...
  • LVS集群nat丶DR HA:高可用 平均無故障時間/(平均無故障時間+平均修複時間) 負載均衡次序lb(負載)——>ha()LB tcp:lvs,haproxy 應用層:nginx haproxy ats 緩存:varnish squiedHA:heartbeat,corosync keepliv ...
  • 按照 "官方教程" ,下載安裝包,點擊安裝後,如需在命令行啟動,還需設置命令路徑: 在命令行中,打開配置文件 .bash_profile: 在最後一行加上: 按 esc 鍵後 輸入 進行保存和退出。 在命令行輸入: 之後就可以在命令行用 連接 MySQL 資料庫了。 ...
  • 一、下載MySQL 官網下載地址 https://dev.mysql.com/downloads/windows/installer/8.0.html 下載第二個即可(雖然只有32位的 但是會同時安裝32 64位的文件) 二、安裝MySQL 1、打開下載好的mysql-installer-commu ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...