1. 程式人生 > >python -- K最近鄰演算法

python -- K最近鄰演算法

KNN核心演算法函式

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# fileName : KNNdistance.py
# author : [email protected]

import math

def getMaxLocate(target): # 查詢target中最大值的locate
    maxValue = float("-inFinIty")
    for i in range(len(target)):
        if maxValue < target[i]:
            maxValue = target[i]
            flag = i
    return
flag def KDistance(K, dest, source): destlen = len(dest) source1len = len(source[1]) sourcelen = len(source) KNN = [] locate = source # 準備從source中剔除N-K個最大值 if destlen == source1len: for i in range(sourcelen): delta = 0 for j in range(source1len):# 畢達哥拉斯公式
delta += (dest[j] - source[i][j])*(dest[j] - source[i][j]) KNN.append(math.sqrt(delta)) for k in range(sourcelen, K, -1): flag = getMaxLocate(KNN) #print("%s 最大元素位置為%d" % (KNN, flag)) KNN.remove(KNN[flag]); locate.remove(locate[flag])# 移除對應位置的元素
#print(locate) return locate # 返回最終K個最接近的元素 else: return None

假設你在伯克利開個小小的麵包店,每天都做新鮮麵包,需要根據如下一組特徵預測當天該烤多少條麵包:
a. 天氣指數1~5(1表示天氣很糟,5表示天氣非常好);
b. 是不是週末或節假日(週末或節假日為1,否則為0);
c. 有沒有活動(1表示有,0表示沒有)。

已知

historyA(5, 1, 0) = 300
historyB(3, 1, 1) = 225
historyC(1, 1, 0) = 75
historyD(4, 0, 1) = 200
historyE(4, 0, 0) = 150
historyF(2, 0, 0) = 50

迴歸:週末,天氣不錯

Now(4, 1, 0) = ?

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# fileName : KNNdistance.py
# author : [email protected]

if __name__ == "__main__":

    history = {}
    history[5, 1, 0] = 300
    history[3, 1, 1] = 225
    history[1, 1, 0] = 75
    history[4, 0, 1] = 200
    history[4, 0, 0] = 150
    history[2, 0, 0] = 50

    dest = [4, 1, 0]
    source = []
    for i in history:
        source.append(i)
    print(source)

    from KNNdistance import KDistance
    K = 4
    locate = KDistance(K, dest, source)
    avg = 0
    for i in range(len(locate)):
        avg+=history[locate[i]]
    avg/=K
    print("迴歸結果:今天應該烤%d個麵包" % round(avg))

KNN演算法:

  1. 建立分類系統
  2. 分類(分組),特徵抽取(得到相似程度)
  3. 迴歸,即預測數值
  4. KNN演算法真的是很有用,堪稱你進入神奇的機器學習領域的領路人!機器學習旨在讓計算機更聰明。你見過一個機器學習的例子:建立推薦系統。
  5. OCR指的是光學字元識別 (optical character recognition),這意味著你可拍攝印刷頁面的照片,計算機將自動識別出其中的文字。Google使用OCR來實現圖書數字化。
  6. 一般而言,OCR演算法提取線段、點和曲線等特徵。
  7. OCR中的特徵提取要複雜得多,但再複雜的技術也是基於KNN等簡單理念的。這些理念也可用於語音識別和人臉識別。你將照片上傳到Facebook時,它有時候能夠自動標出照片中的人物,這是機器學習在發揮作用!
  8. OCR的第一步是檢視大量的數字影象並提取特徵,這被稱為訓練(training)。大多數機器學習演算法都包含訓練的步驟:要讓計算機完成任務,必須先訓練它。

samples:
a. 垃圾郵件過濾器, 使用一種簡單演算法——樸素貝葉斯分類器(Naive Bayes classifier)
b. 預測股票市場, 使用機器學習來預測股票市場的漲跌真的很難。對於股票市場,如何挑選合適的特徵呢?股票昨天漲了,今天也會漲,這樣的特徵合適嗎?又或者每年五月份股票市場都以綠盤報收,這樣的預測可行嗎?在根據以往的資料來預測未來方面,沒有萬無一失的方法。未來很難預測,由於涉及的變數太多,這幾乎是不可能完成的任務。

conclude:

機器學習是個很有趣的領域,只要下定決心,你就能很深入地瞭解它.