機器學習演算法_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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...