機器學習演算法_knn(福利)

来源:https://www.cnblogs.com/xiu123/archive/2018/08/19/9503298.html
-Advertisement-
Play Games

這兩天翻了一下機器學習實戰這本書,演算法是不錯,只是代碼不夠友好,作者是個搞演算法的,這點從代碼上就能看出來。可是有些地方使用numpy搞數組,搞矩陣,總是感覺怪怪的,一個是需要使用三方包numpy,雖然這個包基本可以說必備了,可是對於一些新手,連pip都用不好,裝的numpy也是各種問題,所以說能不用 ...


這兩天翻了一下機器學習實戰這本書,演算法是不錯,只是代碼不夠友好,作者是個搞演算法的,這點從代碼上就能看出來。可是有些地方使用numpy搞數組,搞矩陣,總是感覺怪怪的,一個是需要使用三方包numpy,雖然這個包基本可以說必備了,可是對於一些新手,連pip都用不好,裝的numpy也是各種問題,所以說能不用還是儘量不用,第二個就是畢竟是數據,代碼樣例裡面寫的只有幾個case,可是實際應用起來,一定是要上資料庫的,如果是array是不適合從資料庫中讀寫數據的。因此綜合以上兩點,我就把這段代碼改成list形式了,當然,也可能有人會說我對numpy很熟悉啊,而且作為專業的數學包,矩陣的運算方面也很方便,我不否定,那我這段代碼恐怕對你不適合,你可以參考書上的代碼,直接照打並理解就好了。

knn,不多說了,網上書上講這個的一大堆,簡單說就是利用新樣本new_case的各維度的數值與已有old_case各維度數值的歐式距離計算


歐式距離這裡也不說了,有興趣可以去翻我那篇python_距離測量,裡面寫的很詳細,並用符號展示說明,你也可以改成棋盤距離或街區距離試試,速度可能會比歐式距離快,但還是安利歐式距離。


有一點沒搞明白的就是,對坐標進行精度化計算這塊,實測後確定使用直接計算無論是錯誤率還是精度,處理前都要比處理後更準確,可能原代碼使用小數點的概率更高些吧,也許這個計算對於小數計算精度更有幫助


閑話一些,不多也不少,下麵上代碼,代碼中配有偽代碼,方便閱讀,如果還看不太明白可以留言,我把詳細註釋加上

 

以下是代碼中使用顏色,選用html的16進位RGB顏色,在應用時將其轉換為10進位數字計算,old_case選取紅色圈,new_case選取橙色圈

紫色(茄子顏色)

綠色(黃瓜顏色)

黃色(香蕉顏色)

淡綠(西葫蘆顏色)

代碼見下

#!/usr/bin//python
# coding: utf-8

'''
1、獲取key和coord_values,樣例使用的是list,但是如果真正用在訓練上的話list就不適合了,建議改為使用資料庫進行讀取
2、對坐標進行精度化計算,這個其實我沒理解是為什麼,可能為了防止錯誤匹配吧,書上是這樣寫的
3、指定兩個參數,參數一是新加入case的坐標,參數二是需要匹配距離最近的周邊點的個數n,這裡贏指定單數
4、距離計算,使用歐式距離
  新加入case的坐標與每一個已有坐標計算,這裡還有優化空間,以後更新
  計算好的距離與key做成新的key-value
  依據距離排序
  取前n個case
5、取得key
  對前n個case的key進行統計
  取統計量結果最多的key即是新加入case所對應的分組
6、將新加入的values與分組寫成key-value加入已有的key-value列隊
輸入新的case坐標,返回第一步......遞歸
'''

import operator

def create_case_list():
  # 1代表黃瓜,2代表香蕉,3代表茄子,4代表西葫蘆
  case_list = [[25,3,73732],[27.5,8,127492],[13,6,127492],[16,13,50331049],[17,4,18874516],[22,8,13762774],[14,1,30473482],[18,3,38338108]]
  case_type = [1,1,2,2,3,3,4,4]
  return case_list,case_type

def knn_fun(user_coord,case_coord_list,case_type,take_num):
  case_len = len(case_coord_list)
  coord_len = len(user_coord)
  eu_distance = []
  for coord in case_coord_list:
    coord_range = [(user_coord[i] - coord[i]) ** 2 for i in range(coord_len)]
    coord_range = sum(coord_range) ** 0.5
    eu_distance.append(coord_range)
  merage_distance_and_type = zip(eu_distance,case_type)
  merage_distance_and_type.sort()
  type_list = [merage_distance_and_type[i][1] for i in range(take_num)]
  class_count = {}
  for type_case in type_list:
    type_temp = {type_case:1}
    if class_count.get(type_case) == None:
      class_count.update(type_temp)
    else: class_count[type_case] += 1
  sorted_class_count = sorted(class_count.iteritems(), key = operator.itemgetter(1), reverse = True)
  return sorted_class_count[0][0]

def auto_norm(case_list):
  case_len = len(case_list[0])
  min_vals = [0] * case_len
  max_vals = [0] * case_len
  ranges = [0] * case_len
  for i in range(case_len):
    min_list = [case[i] for case in case_list]
    min_vals[i] = min(min_list)
    max_vals[i] = max([case[i] for case in case_list])
    ranges[i] = max_vals[i] - min_vals[i]
  norm_data_list = []
  for case in case_list:
    norm_data_list.append([(case[i] - min_vals[i])/ranges[i] for i in range(case_len)])
  return norm_data_list,ranges,min_vals

def main():
  result_list = ['黃瓜','香蕉','茄子','西葫蘆']
  dimension1 = float(input('長度是: '))
  dimension2 = float(input('彎曲度是: '))
  dimension3 = float(input('顏色是: '))
  case_list,type_list = create_case_list()
  #norm_data_list,ranges,min_vals = auto_norm(case_list)
  in_coord = [dimension1,dimension2,dimension3]
  #in_coord_len = len(in_coord)
  #in_coord = [in_coord[i]/ranges[i] for i in range(in_coord_len)]
  #class_sel_result = knn_fun(in_coord,norm_data_list,type_list,3)
  class_sel_result = knn_fun(in_coord,case_list,type_list,3)
  class_sel_result = class_sel_result - 1
  return result_list[class_sel_result]

if __name__ == '__main__':
  a = main()
  print '這貨是: %s' %a

測試結果,效果還不賴


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

-Advertisement-
Play Games
更多相關文章
  • 概要 帶著問題去看教程: 不是用logstash來監聽我們的日誌,我們可以使用logback配置來使用TCP appender通過TCP協議將日誌發送到遠程Logstash實例。 我們可以使用Logstash指向多個日誌文件。 我們可以在logstash配置文件中使用更複雜的過濾器,以根據需要執行更 ...
  • 緩存ABC Intro 緩存是一種比較常見的用來將提高系統性能的方式。從線程緩存、進程緩存、到記憶體緩存再到分散式緩存再到CDN,都是屬於緩存的範疇。 緩存的本質是 以提高讀的效率,犧牲一些記憶體空間來換取之後的快速讀取與訪問。 緩存3問 為什麼需要緩存? 一般在項目中,最消耗性能的地方就是後端服務了, ...
  • 說起線程,無法免俗首先要弄清楚的三個概念就是:進程、線程、協程。OK,那什麼是進程,什麼是線程,哪協程又是啥東西。進程:進程可以簡單的理解為運行在操作系統中的程式,程式時靜態代碼,進程是動態運行著的代碼,程式的運行需要向操作系統申請資源比如記憶體,文件句柄等,特別強調的是進程申請的資源都是獨立的,也就 ...
  • 本文主要講解靜態代理,動態代理的原理,以及如何使用JDK動態代理,cglib動態代理,最後帶大家手寫jdk動態代理源碼!真正理解動態代理的原理與技術!含Git完整項目地址! ...
  • 詳情戳擊下方鏈接 Python之進程、線程、協程 python之IO多路復用 ...
  • 數據類型 由於學習過其他編程語言(C/C++/java),所以記錄的話除了一些差異點和遇到的問題,儘可能的簡潔,以達到最佳的記錄作用,方便以後的複習和形成體系。 1.數字類型 包括integer,long,float,complex(複雜整數)等,統稱number,而且不用特殊聲明。 特殊類型:布爾 ...
  • 方式一:修改server.xml文件 優點: 配置速度快,只需要在server.xml文件中添加<Context>標簽,在其中分別配置path虛擬路徑和docBase真實路徑然後啟動Tomcat伺服器即可 缺點: 需要配置兩個路徑,如果path為空字元串,則為預設配置 每次修改server.xml文 ...
  • 1.前提條件 相比較於支付寶和微信的支付功能接入這一塊,銀行相對來說更加嚴格,比如說支付寶,在你簽約之前可以進行一些測試。但是銀行來說就不是這樣了,如果您現在要進行招行的支付功能開發的話,請務必先讓相關人員去進行簽約 2. 測試開發必須條件 進行測試開發之前有幾個比較重要的東西是不可避免的,我們來看 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...