日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript機器學習之KNN算法

瀏覽:178日期:2023-11-12 17:12:34

JavaScript機器學習之KNN算法

上圖使用 plot.ly 所畫。

上次我們用JavaScript實現了 線性規劃 ,這次我們來聊聊KNN算法。

KNN是 k-Nearest-Neighbours 的縮寫,它是一種監督學習算法。KNN算法可以用來做分類,也可以用來解決回歸問題。

GitHub倉庫: machine-learning-with-js

KNN算法簡介

簡單地說, KNN算法由那離自己最近的K個點來投票決定待分類數據歸為哪一類 。

如果待分類的數據有這些鄰近數據, NY : 7 , NJ : 0 , IN : 4 ,即它有7個 NY 鄰居,0個 NJ 鄰居,4個 IN 鄰居,則這個數據應該歸類為 NY

假設你在郵局工作,你的任務是為郵遞員分配信件,目標是最小化到各個社區的投遞旅程。不妨假設一共有7個街區。這就是一個實際的分類問題。你需要將這些信件分類,決定它屬于哪個社區,比如 上東城曼哈頓下城 等。

最壞的方案是隨意分配信件分配給郵遞員,這樣每個郵遞員會拿到各個社區的信件。

最佳的方案是根據信件地址進行分類,這樣每個郵遞員只需要負責鄰近社區的信件。

也許你是這樣想的:”將鄰近3個街區的信件分配給同一個郵遞員”。這時,鄰近街區的個數就是 k 。你可以不斷增加 k ,直到獲得最佳的分配方案。這個 k 就是分類問題的最佳值。

KNN代碼實現

像 上次 一樣,我們將使用 mljs 的 KNN 模塊 ml-knn 來實現。

每一個機器學習算法都需要數據,這次我將使用 IRIS數據集 。其數據集包含了150個樣本,都屬于 鳶尾屬 下的三個亞屬,分別是 山鳶尾 、 變色鳶尾 和 維吉尼亞鳶尾 。四個特征被用作樣本的定量分析,它們分別是 花萼 和 花瓣 的長度和寬度。

1. 安裝模塊

$npm install ml-knn@2.0.0 csvtojson prompt

ml-knn : k-Nearest-Neighbours 模塊,不同版本的接口可能不同,這篇博客使用了2.0.0

csvtojson : 用于將CSV數據轉換為JSON

prompt : 在控制臺輸入輸出數據

2. 初始化并導入數據

IRIS數據集 由加州大學歐文分校提供。

curl https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data > iris.csv

假設你已經初始化了一個NPM項目,請在 index.js 中輸入以下內容:

const KNN = require(’ml-knn’);const csv = require(’csvtojson’);const prompt = require(’prompt’);var knn;const csvFilePath = ’iris.csv’; // 數據集const names = [’sepalLength’, ’sepalWidth’, ’petalLength’, ’petalWidth’, ’type’];let seperationSize; // 分割訓練和測試數據let data = [], X = [], y = [];let trainingSetX = [], trainingSetY = [], testSetX = [], testSetY = []; seperationSize 用于分割數據和測試數據

使用csvtojson模塊的fromFile方法加載數據:

csv( { noheader: true, headers: names }) .fromFile(csvFilePath) .on(’json’, (jsonObj) => { data.push(jsonObj); // 將數據集轉換為JS對象數組 }) .on(’done’, (error) => { seperationSize = 0.7 * data.length; data = shuffleArray(data); dressData(); });

我們將 seperationSize 設為樣本數目的0.7倍。注意,如果訓練數據集太小的話,分類效果將變差。

由于數據集是根據種類排序的,所以需要使用 shuffleArray 函數對數據進行混淆,這樣才能方便分割出訓練數據。這個函數的定義請參考StackOverflow的提問 How to randomize (shuffle) a JavaScript array? :

function shuffleArray(array){ for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } return array;} 3. 轉換數據

數據集中每一條數據可以轉換為一個JS對象:

{sepalLength: ‘5.1’,sepalWidth: ‘3.5’,petalLength: ‘1.4’,petalWidth: ‘0.2’,type: ‘Iris-setosa’ }

在使用 KNN 算法訓練數據之前,需要對數據進行這些處理:

將屬性(sepalLength, sepalWidth,petalLength,petalWidth)由字符串轉換為浮點數. ( parseFloat ) 將分類 (type)用數字表示

function dressData(){ let types = new Set(); data.forEach((row) => { types.add(row.type); }); let typesArray = [...types]; data.forEach((row) => { let rowArray, typeNumber; rowArray = Object.keys(row).map(key => parseFloat(row[key])).slice(0, 4); typeNumber = typesArray.indexOf(row.type); // Convert type(String) to type(Number) X.push(rowArray); y.push(typeNumber); }); trainingSetX = X.slice(0, seperationSize); trainingSetY = y.slice(0, seperationSize); testSetX = X.slice(seperationSize); testSetY = y.slice(seperationSize); train();} 4. 訓練數據并測試

function train(){ knn = new KNN(trainingSetX, trainingSetY, { k: 7 }); test();}

train方法需要2個必須的參數: 輸入數據,即 花萼 和 花瓣 的長度和寬度;實際分類,即 山鳶尾 、 變色鳶尾 和 維吉尼亞鳶尾 。另外,第三個參數是可選的,用于提供調整 KNN 算法的內部參數。我將 k 參數設為7,其默認值為5。

訓練好模型之后,就可以使用測試數據來檢查準確性了。我們主要對預測出錯的個數比較感興趣。

function test(){ const result = knn.predict(testSetX); const testSetLength = testSetX.length; const predictionError = error(result, testSetY); console.log(`Test Set Size = ${testSetLength} and number of Misclassifications = ${predictionError}`); predict();}

比較預測值與真實值,就可以得到出錯個數:

function error(predicted, expected){ let misclassifications = 0; for (var index = 0; index < predicted.length; index++) { if (predicted[index] !== expected[index]) { misclassifications++; } } return misclassifications;} 5. 進行預測(可選)

任意輸入屬性值,就可以得到預測值

function predict(){ let temp = []; prompt.start(); prompt.get([’Sepal Length’, ’Sepal Width’, ’Petal Length’, ’Petal Width’], function(err, result) { if (!err) { for (var key in result) { temp.push(parseFloat(result[key])); } console.log(`With ${temp} -- type = ${knn.predict(temp)}`); } });} 6. 完整程序

完整的程序 index.js 是這樣的:

const KNN = require(’ml-knn’);const csv = require(’csvtojson’);const prompt = require(’prompt’);var knn;const csvFilePath = ’iris.csv’; // 數據集const names = [’sepalLength’, ’sepalWidth’, ’petalLength’, ’petalWidth’, ’type’];let seperationSize; // 分割訓練和測試數據let data = [], X = [], y = [];let trainingSetX = [], trainingSetY = [], testSetX = [], testSetY = [];csv( { noheader: true, headers: names }) .fromFile(csvFilePath) .on(’json’, (jsonObj) => { data.push(jsonObj); // 將數據集轉換為JS對象數組 }) .on(’done’, (error) => { seperationSize = 0.7 * data.length; data = shuffleArray(data); dressData(); });function dressData(){ let types = new Set(); data.forEach((row) => { types.add(row.type); }); let typesArray = [...types]; data.forEach((row) => { let rowArray, typeNumber; rowArray = Object.keys(row).map(key => parseFloat(row[key])).slice(0, 4); typeNumber = typesArray.indexOf(row.type); // Convert type(String) to type(Number) X.push(rowArray); y.push(typeNumber); }); trainingSetX = X.slice(0, seperationSize); trainingSetY = y.slice(0, seperationSize); testSetX = X.slice(seperationSize); testSetY = y.slice(seperationSize); train();}// 使用KNN算法訓練數據function train(){ knn = new KNN(trainingSetX, trainingSetY, { k: 7 }); test();}// 測試訓練的模型function test(){ const result = knn.predict(testSetX); const testSetLength = testSetX.length; const predictionError = error(result, testSetY); console.log(`Test Set Size = ${testSetLength} and number of Misclassifications = ${predictionError}`); predict();}// 計算出錯個數function error(predicted, expected){ let misclassifications = 0; for (var index = 0; index < predicted.length; index++) { if (predicted[index] !== expected[index]) { misclassifications++; } } return misclassifications;}// 根據輸入預測結果function predict(){ let temp = []; prompt.start(); prompt.get([’Sepal Length’, ’Sepal Width’, ’Petal Length’, ’Petal Width’], function(err, result) { if (!err) { for (var key in result) { temp.push(parseFloat(result[key])); } console.log(`With ${temp} -- type = ${knn.predict(temp)}`); } });}// 混淆數據集的順序function shuffleArray(array){ for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } return array;}

在控制臺執行 node index.js

$ node index.js

輸出如下:

Test Set Size = 45 and number of Misclassifications = 2prompt: Sepal Length: 1.7prompt: Sepal Width: 2.5prompt: Petal Length: 0.5prompt: Petal Width: 3.4With 1.7,2.5,0.5,3.4 -- type = 2 參考鏈接 K NEAREST NEIGHBOR 算法 安德森鳶尾花卉數據集

歡迎加入 我們Fundebug 的 全棧BUG監控交流群: 622902485

JavaScript機器學習之KNN算法

來自:https://kiwenlau.com/2017/07/10/javascript-machine-learning-knn/

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美精品羞羞答答| 日韩成人在线看| 国产在线日韩精品| 中文字幕在线高清| 精品在线91| 视频一区二区三区在线| 日韩在线网址| 麻豆精品久久| 欧美香蕉视频| 黄色日韩在线| 日韩精品成人| 亚洲少妇一区| 日本亚洲不卡| 精品美女在线视频| 成人羞羞在线观看网站| 夜夜精品视频| 日韩av一区二区三区| 精品视频高潮| 1024精品一区二区三区| 亚洲永久精品唐人导航网址| 国产美女视频一区二区| 日韩在线观看一区| 久热综合在线亚洲精品| 国产欧美久久一区二区三区| 成人久久久久| 首页国产欧美日韩丝袜| 乱人伦精品视频在线观看| 欧美精品观看| 日韩在线欧美| 婷婷综合国产| 日本精品影院| 国产亚洲精品美女久久| 中文字幕系列一区| 日韩精品社区| 成人福利av| 国产模特精品视频久久久久| 欧美亚洲专区| 日韩久久一区二区三区| 亚洲欧美日本国产专区一区| 日韩精品a在线观看91| 成午夜精品一区二区三区软件| 精品亚洲美女网站| 国产日韩综合| 精品视频国内| 一级欧美视频| 国产一区二区三区四区五区传媒| 日韩成人亚洲| 欧美日韩调教| 国精品一区二区| 欧美激情日韩| 亚洲理论在线| av一区在线| 欧美在线看片| 一本色道精品久久一区二区三区| 精品欠久久久中文字幕加勒比| 一区二区三区四区日韩| 亚洲精品国产嫩草在线观看 | 野花国产精品入口| 精品国产一区二区三区性色av| 五月精品视频| 色综合狠狠操| 欧美日韩伊人| 自拍自偷一区二区三区| 久久精品国产亚洲夜色av网站| 国产福利一区二区三区在线播放| 午夜久久tv| 国产欧洲在线| 国产精品久久久久9999高清| 红桃视频欧美| 91精品国产调教在线观看| 国产精品久久久久久模特 | 国产午夜精品一区二区三区欧美 | 久久午夜精品| 久久视频国产| 欧美国产亚洲精品| 日韩有吗在线观看| 蜜臀久久99精品久久久画质超高清| 日韩精品中文字幕第1页| 日韩国产一区二| 亚洲国产日韩欧美在线| 久久中文字幕二区| 日韩欧美一区二区三区免费观看| 老牛国内精品亚洲成av人片 | 一区二区亚洲视频| 午夜在线视频观看日韩17c| 国产在线欧美| 99精品视频精品精品视频| 国产一区国产二区国产三区| 国产福利资源一区| 国产精品九九| 欧美精品99| 美腿丝袜在线亚洲一区| 国产精品99精品一区二区三区∴ | 久久国产精品99国产| 最新日韩欧美| 日韩中文字幕不卡| 亚洲精品福利| 香蕉久久一区| 欧美亚洲一级| 日韩专区视频网站| 91亚洲无吗| 国产精品入口久久| 美女精品一区二区| 国产一区二区久久久久| 鲁鲁在线中文| 国产综合亚洲精品一区二| 亚洲激情av| 免费精品视频在线| 中文字幕日韩高清在线| 欧美亚洲人成在线| 欧美aaaaaa午夜精品| 国产精品精品| 亚洲精品国产嫩草在线观看| 四虎影视精品| 亚洲网站视频| 亚洲综合婷婷| 麻豆精品在线| 美女亚洲一区| 日韩欧美久久| 精品国产亚洲一区二区在线观看| 成人片免费看| 亚洲少妇自拍| 国产精一区二区| se01亚洲视频 | 欧美日韩精品免费观看视完整| 欧美aa国产视频| 日韩精品国产欧美| 国产一区二区精品福利地址| av亚洲在线观看| 日韩av黄色在线| 亚洲黄色免费av| 免播放器亚洲一区| 国产成人精选| 石原莉奈一区二区三区在线观看| 欧美另类中文字幕| 国产不卡人人| 视频在线观看一区| 国产日韩欧美中文在线| 久久久夜夜夜| 一区二区亚洲视频| 久久av导航| 好吊日精品视频| 国产精品多人| 亚洲精品a级片| 国产精品入口久久| 天堂资源在线亚洲| 91精品一区| 鲁鲁在线中文| 日本电影久久久| 亚洲天堂久久| 欧美黄页在线免费观看| 国产视频一区欧美| 另类欧美日韩国产在线| 视频一区视频二区在线观看| 国产日韩欧美一区二区三区| 天堂网在线观看国产精品| 欧美极品中文字幕| 亚洲福利一区| 美日韩一区二区三区| 免播放器亚洲一区| 久久精品影视| 69堂精品视频在线播放| 欧美日韩精品一本二本三本| 麻豆久久一区| 日韩和欧美的一区| 99国产精品99久久久久久粉嫩| 精品国产精品国产偷麻豆 | 久久99国产精品视频| 99视频一区| a日韩av网址| 国产日韩一区二区三区在线| 国产精品免费看| 亚洲a一区二区三区| 里番精品3d一二三区| 亚洲免费毛片| 午夜久久久久| 久久久精品五月天| 久久久久免费| 麻豆精品视频在线| 国产一级成人av| 亚洲精品一二| 亚洲午夜精品久久久久久app| 久久亚州av| 国产精品一区二区99| 男女性色大片免费观看一区二区 | 麻豆视频一区| 欧美日韩一区二区三区在线电影| 蜜臀av亚洲一区中文字幕| 亚洲精品极品少妇16p| 群体交乱之放荡娇妻一区二区| 精品国产美女a久久9999| 国产精品日本一区二区不卡视频| 亚洲人成精品久久久| 99视频精品全国免费| 精品午夜视频| 捆绑调教美女网站视频一区| 久久国产人妖系列| 日本综合视频| 日本精品另类| 欧美亚洲tv|