1. 程式人生 > >KNN演算法例子(java,scala,python 程式碼實現)

KNN演算法例子(java,scala,python 程式碼實現)

java 版本

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;
	}

}
scala版本
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

十大經典排序演算法最強總結JavaPython實現

# 引言 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量資料的處理方面。一個優秀的演算法可以節省大量的資源。在各個領域中考慮到資料的各種限制和規範,要得到一個符合實際的優

模擬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++, JavaPython 分別實現

跳臺階-題目描述一隻青蛙一次可以跳上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)演算法實現javapython

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程式碼實現

原文連結 一、基本概念     動態規劃過程是:每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。 二、基本思想與策略     基本思想與分治法類似,也是