KNN演算法例子(java,scala,python 程式碼實現)
java 版本
scala版本package com.fullshare.test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * @author huangjiangnan * @email [email protected] * @version 1.0 * @since 2017年12月14日 上午10:27:35 類說明 */ public class Knn { public static void main(String[] args) { // 電影名稱 搞笑鏡頭 擁抱鏡頭 打鬥鏡頭 電影型別 Object[][] sample = { { 1, "寶貝當家", 45, 2, 9, "喜劇片" }, { 2, "美人魚", 21, 17, 5, "喜劇片" }, { 3, "澳門風雲3", 54, 9, 11, "喜劇片" }, { 4, "功夫熊貓3", 39, 0, 31, "喜劇片" }, { 5, "諜影重重", 5, 2, 57, "動作片" }, { 6, "葉問3", 3, 2, 65, "動作片" }, { 7, "倫敦陷落", 2, 3, 55, "動作片" }, { 8, "我的特工爺爺", 6, 4, 21, "動作片" }, { 9, "奔愛", 7, 46, 4, "愛情片" }, { 10, "夜孔雀", 9, 39, 8, "愛情片" }, { 11, "代理情人", 9, 38, 2, "愛情片" }, { 12, "新步步驚心", 8, 34, 17, "愛情片" }, }; // 求唐人街辦案型別 Object[] movie = { 13, "唐人街探案", 23, 3, 17, null }; int length = sample.length; System.out.println("序號 名稱 距離"); List<MovieDis> movieDisList = new ArrayList<>(); for (int i = 0; i < length; i++) { Object[] mv = sample[i]; double distances = getDistance(mv, movie); MovieDis movieDis = new MovieDis((int) mv[0], (String) mv[1], distances, (String) mv[5]); // Object[] disInfo={}; System.out.println(String.format("%s %s %s", mv[0], mv[1], distances)); movieDisList.add(movieDis); } Collections.sort(movieDisList, new Comparator<MovieDis>() { @Override public int compare(MovieDis o1, MovieDis o2) { double sub = (o1.getDistance() - o2.getDistance()); if (sub == 0) { return 0; } if (sub > 0) { return 1; } return -1; } }); int k=5; System.out.println("按照歐式距離排序,取k=5"); movieDisList=movieDisList.subList(0,k); for (MovieDis movieDis : movieDisList) { System.out.println(movieDis); } } public static double getDistance(Object[] movie1, Object[] movie2) { double[] ps1 = { (Integer) movie1[2], (Integer) movie1[3], (Integer) movie1[4] }; double[] ps2 = { (Integer) movie2[2], (Integer) movie2[3], (Integer) movie2[4] }; return getDistance(ps1, ps2); } public static double getDistance(double[] ps1, double[] ps2) { if (ps1.length != ps1.length) { throw new RuntimeException("屬性數量不對應"); } int length = ps1.length; double total = 0; for (int i = 0; i < length; i++) { double sub = ps1[i] - ps2[i]; total = total + (sub * sub); } return Math.sqrt(total); } } class MovieDis { private int id; private String title; private double distance; private String type; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public double getDistance() { return distance; } public void setDistance(double distance) { this.distance = distance; } public MovieDis(int id, String title, double distance, String type) { super(); this.id = id; this.title = title; this.distance = distance; this.type = type; } @Override public String toString() { return "MovieDis [id=" + id + ", title=" + title + ", distance=" + distance + ", type=" + type + "]"; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
package com.test.api class KnnScala { } object KnnScala { def main(args: Array[String]): Unit = { var sample: Array[Array[Any]] = Array( Array(1, "寶貝當家", 45, 2, 9, "喜劇片"), Array(2, "美人魚", 21, 17, 5, "喜劇片"), Array(3, "澳門風雲3", 54, 9, 11, "喜劇片"), Array(4, "功夫熊貓3", 39, 0, 31, "喜劇片"), Array(5, "諜影重重", 5, 2, 57, "動作片"), Array(6, "葉問3", 3, 2, 65, "動作片"), Array(7, "倫敦陷落", 2, 3, 55, "動作片"), Array(8, "我的特工爺爺", 6, 4, 21, "動作片"), Array(9, "奔愛", 7, 46, 4, "愛情片"), Array(10, "夜孔雀", 9, 39, 8, "愛情片"), Array(11, "代理情人", 9, 38, 2, "愛情片"), Array(12, "新步步驚心", 8, 34, 17, "愛情片")) // 求唐人街辦案型別 var movie = Array(13, "唐人街探案", 23, 3, 17, null); var length = sample.length - 1; println("序號 名稱 距離"); var movieDisList = List[MovieDis](); for (i <- 0 to length) { var mv: Array[Any] = sample(i); var distances: Double = getDistance(mv, movie); var movieDis = new MovieDis(mv(0).asInstanceOf[Int], mv(1).asInstanceOf[String], distances, mv(5).asInstanceOf[String]); println(printf("%s %s %s", mv(0), mv(1), distances)); //列表新增跟java不一樣,坑 movieDisList = (movieDisList.+:(movieDis)) } movieDisList = movieDisList.sortWith((o1: MovieDis, o2: MovieDis) => (o1.distance < o2.distance)); var k: Int = 5; println("按照歐式距離排序,取k=5"); movieDisList = movieDisList take 5; movieDisList.foreach { o => println(o) } } def getDistance(movie1: Array[Any], movie2: Array[Any]): Double = { var ps1 = Array(movie1(2).asInstanceOf[Integer].doubleValue(), movie1(3).asInstanceOf[Integer].doubleValue(), movie1(4).asInstanceOf[Integer].doubleValue()); var ps2 = Array(movie2(2).asInstanceOf[Integer].doubleValue(), movie2(3).asInstanceOf[Integer].doubleValue(), movie2(4).asInstanceOf[Integer].doubleValue()); return getDistance(ps1, ps2); } def getDistance(ps1: Array[Double], ps2: Array[Double]): Double = { if (ps1.length != ps1.length) { throw new RuntimeException("屬性數量不對應"); } var length = ps1.length - 1; var total: Double = 0; for (i <- 0 to length) { var sub = ps1(i) - ps2(i); total = total + (sub * sub); } return Math.sqrt(total); } } class MovieDis extends Serializable { var id: Int = 0; var title: String = null; var distance: Double = 0; var movieType: String = null; def this(_id: Int, _title: String, _distance: Double, _movieType: String) { this(); this.id = _id; this.title = _title; this.distance = _distance; this.movieType = _movieType; } override def toString(): String = { return "MovieDis [id=" + id + ", title=" + title + ", distance=" + distance + ", movieType=" + movieType + "]"; } }
python版本
結果如下#!/usr/bin/env python3 # -*- coding: UTF-8 -*- # 給多個變數賦值 import math class MovieDis : # 序號 id = 0 # 電影標題 title = "" # 差距 distance = 0.0 # 電影型別 movieType = "" def __init__(self, id ,title,distance,movieType): self.id=id self.title=title self.distance=distance self.movieType=movieType def __str__(self): return "MovieDis [id=%s, title=%s, distance=%s, movieType=%s]" % (self.id,self.title,self.distance,self.movieType) def get_distance(ps1,ps2): if len(ps1) != len(ps2): raise Exception("陣列長度不匹配") ll = len(ps1) total=0 for i in range(0,ll): sub = ps1[i] - ps2[i] total = total + (sub * sub) return math.sqrt(total) sample = ((1, "寶貝當家", 45, 2, 9, "喜劇片"), (2, "美人魚", 21, 17, 5, "喜劇片"), (3, "澳門風雲3", 54, 9, 11, "喜劇片"), (4, "功夫熊貓3", 39, 0, 31, "喜劇片"), (5, "諜影重重", 5, 2, 57, "動作片"), (6, "葉問3", 3, 2, 65, "動作片"), (7, "倫敦陷落", 2, 3, 55, "動作片"), (8, "我的特工爺爺", 6, 4, 21, "動作片"), (9, "奔愛", 7, 46, 4, "愛情片"), (10, "夜孔雀", 9, 39, 8, "愛情片"), (11, "代理情人", 9, 38, 2, "愛情片"), (12, "新步步驚心", 8, 34, 17, "愛情片")) movie = (13, "唐人街探案", 23, 3, 17, "") length = len(sample) - 1 print("序號 名稱 距離") movieDisList = [] for i in range(0,length): mv= sample[i] start=mv[2:5] end= movie[2:5] distances = get_distance(start, end) print("%s %s %s" % (mv[0],mv[1],distances)) movieDis = MovieDis(mv[0], mv[1], distances, mv[5]) movieDisList.append(movieDis) movieDisList.sort(key=lambda x:x.distance) for i in range(0,5): print(movieDisList[i])
相關推薦
KNN演算法例子(java,scala,python 程式碼實現)
java 版本 package com.fullshare.test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u
十大經典排序演算法最強總結(含Java、Python碼實現)
# 引言 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量資料的處理方面。一個優秀的演算法可以節省大量的資源。在各個領域中考慮到資料的各種限制和規範,要得到一個符合實際的優
模擬RSA雙向驗證,並且實現DES加密以及MD5校驗過程(python程式碼實現)
要求如下: (1)A,B兩端各生成公鑰金鑰對(PA,SA), 金鑰對(PB,SB)。 (2)A端生成隨機數N1,用B的公鑰PB加
leetcode-Two sum(最佳思路以及python程式碼實現)
1、Two sumGiven nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].答案:使用hashtable,建立陣列值和下標的鍵值對,在pytho
支援向量機SVM通俗理解(python程式碼實現)
這是第三次來“複習”SVM了,第一次是使用SVM包,呼叫包並嘗試調節引數。聽聞了“流弊”SVM的演算法。第二次學習理論,看了李航的《統計學習方法》以及網上的部落格。看完後感覺,滿滿的公式。。。記不住啊。第三次,也就是這次通過python程式碼手動來實現SVM,才
決策樹原理例項(python程式碼實現)
決策數(Decision Tree)在機器學習中也是比較常見的一種演算法,屬於監督學習中的一種。看字面意思應該也比較容易理解,相比其他演算法比如支援向量機(SVM)或神經網路,似乎決策樹感覺“親切”許多。 優點:計算複雜度不高,輸出結果易於理解,對中間值的缺
七大查詢演算法(附C語言程式碼實現)
閱讀目錄 1、順序查詢 2、二分查詢 3、插值查詢 4、斐波那契查詢 5、樹表查詢 6、分塊查詢 7、雜湊查詢 查詢是在大量的資訊中尋找一個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。本文簡單概括性的介紹了常見的七種查詢演算法
跳臺階 & 變態跳臺階 (C/C++, Java, Python 分別實現)
跳臺階-題目描述一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。思路:f(0)=0, f(1)=1, f(2)=2, n>2時 狀態轉移方程為 f(n) = f(n-1) + f(n-2)C/C++JavaPython
單例模式(java兩種方式實現)
//測試類 public class SingletonTest1 { public static void main(String[] args) { //檢驗產生的例項是否是同一個例項 Singleton s
神經網路/自編碼器的實現(向量化Python版本實現)
神經網路/自編碼器的實現(向量版本) # -*- coding: utf-8 -*- """ Created on Tue Jan 2 17:47:29 2018 @author: lyh """ import numpy as np from skl
javaee實戰專案--農貿產品開發(詳細講解及程式碼實現)
這個專案是我第一個與他人合作完成的專案,我用java寫後臺,綜合性較強,用到了hibernate,jsp,servlet,適合那些javaee已經入門,想要通過專案來提高自己的朋友。 這個專案原始碼免積分提供大家學習,還有一些模組的程式碼(如數字驗證碼),可以稍作修改就能
機器學習與資料探勘-K最近鄰(KNN)演算法的實現(java和python版)
KNN演算法基礎思想前面文章可以參考,這裡主要講解java和python的兩種簡單實現,也主要是理解簡單的思想。 python版本: 這裡實現一個手寫識別演算法,這裡只簡單識別0~9熟悉,在上篇文章中也展示了手寫識別的應用,可以參考:機器學習與資料探勘-logistic迴
十大排序演算法的實現 十大經典排序演算法最強總結(含JAVA程式碼實現)
十大經典排序演算法最強總結(含JAVA程式碼實現) 最近幾天在研究排序演算法,看了很多部落格,發現網上有的文章中對排序演算法解釋的並不是很透徹,而且有很多程式碼都是錯誤的,例如有的文章中在“桶排序”演算法中對每個桶進行排序直接使用了Collection.sort
買什麼資料結構與演算法,這裡有:動態圖解十大經典排序演算法(含JAVA程式碼實現)
上篇的動圖資料結構反響不錯,這次來個動圖排序演算法大全。資料結構與演算法,齊了。 幾張動態圖捋清Java常用資料結構及其設計原理 本文將採取動態圖+文字描述+正確的java程式碼實現來講解以下十大排序演算法: 氣泡排序 選擇排序 插入排序 希爾排序
常見14種經典排序演算法(Java程式碼實現)
尊重原創,轉載請標明出處 http://blog.csdn.net/abcdef314159 ,想了解更多演算法題可以關注微信公眾號“資料結構和演算法”,每天一題為你精彩解答。 一,氣泡排序 排序演算法其實有很多,氣泡排序基本上算是最簡單的一種
關於資料結構演算法中的比較排序(一)(附Java程式碼實現)
現在已經是10月份,秋招正在進行,不知道是不是有的人會和我一樣正在瘋狂的複習起資料結構,在這裡我將就常見的幾種比較排序做一些簡單的解析,同時附上具體的程式碼實現。 1.氣泡排序 氣泡排序通常是我們最先接觸道的比較排序的一種,具體排序步驟如下: 1.比較相鄰的元
記錄一個演算法題(java程式碼):統計正整數n的二進位制寫法中有多少個1
package ludims.main; import java.util.Scanner; public class myMain { public static void main(String[] args) { System.out.pri
基於矩陣分解的推薦演算法(java程式碼實現)
目前推薦系統中用的最多的就是矩陣分解方法,在Netflix Prize推薦系統大賽中取得突出效果。以使用者-專案評分矩陣為例,矩陣分解就是預測出評分矩陣中的缺失值,然後根據預測值以某種方式向用戶推薦。常見的矩陣分解方法有基本矩陣分解(basic MF),正則化矩
機器學習-mnist kNN演算法識別(python)
方以類聚,物以群分 ---《周易·繫辭上》測試環境:python3.6、win7 32bit、x86。在上一篇文章中介紹了mnist資料的格式,以及用python如何讀取mnist資料
動態規劃演算法(後附常見動態規劃例題及Java程式碼實現)
原文連結 一、基本概念 動態規劃過程是:每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。 二、基本思想與策略 基本思想與分治法類似,也是