機器學習knnlearn5

import numpy as np
from os import listdir
from sklearn.neighbors import KNeighborsClassifier as kNN# 此函數用于將一個32x32的文本文件轉換為一個1x1024的一維向量
def img2vector(filename):"""將32x32的文本文件轉換為1x1024的向量:param filename: 要轉換的文本文件的文件名:return: 轉換后的1x1024向量,如果出現錯誤則返回None"""try:# 初始化一個1x1024的零向量,用于存儲轉換后的數據returnVect = np.zeros((1, 1024))# 以只讀模式打開指定的文件with open(filename) as fr:# 遍歷文件的前32行,因為圖像是32x32的for i in range(32):# 讀取當前行的內容lineStr = fr.readline()# 遍歷當前行的前32個字符for j in range(32):# 將當前字符轉換為整數,并存儲到向量的相應位置returnVect[0, 32 * i + j] = int(lineStr[j])# 返回轉換后的向量return returnVectexcept FileNotFoundError:# 若文件未找到,打印錯誤信息print(f"錯誤:文件 {filename} 未找到。")return Noneexcept Exception as e:# 若發生其他未知錯誤,打印錯誤信息print(f"錯誤:處理文件 {filename} 時發生未知錯誤:{e}")return None# 此函數用于加載訓練數據,返回訓練數據矩陣和對應的標簽列表
def load_training_data():"""加載訓練數據:return: 訓練數據矩陣和對應的標簽列表,如果出現錯誤則返回None, None"""# 用于存儲訓練數據的標簽hwLabels = []try:# 獲取訓練數據文件夾下的所有文件名trainingFileList = listdir('trainingDigits')# 計算訓練數據的數量m = len(trainingFileList)# 初始化一個m行1024列的零矩陣,用于存儲訓練數據trainingMat = np.zeros((m, 1024))# 遍歷訓練數據文件夾下的所有文件for i in range(m):# 獲取當前文件名fileNameStr = trainingFileList[i]# 從文件名中提取出對應的數字標簽classNumber = int(fileNameStr.split('_')[0])# 將標簽添加到標簽列表中hwLabels.append(classNumber)# 調用img2vector函數將當前文件轉換為向量vector = img2vector(f'trainingDigits/{fileNameStr}')if vector is not None:# 將轉換后的向量存儲到訓練數據矩陣的相應行trainingMat[i, :] = vector# 返回訓練數據矩陣和標簽列表return trainingMat, hwLabelsexcept FileNotFoundError:# 若訓練數據文件夾未找到,打印錯誤信息print("錯誤:訓練數據文件夾未找到。")return None, Noneexcept Exception as e:# 若發生其他未知錯誤,打印錯誤信息print(f"錯誤:加載訓練數據時發生未知錯誤:{e}")return None, None# 此函數用于加載測試數據,返回測試數據矩陣和對應的標簽列表
def load_test_data():"""加載測試數據:return: 測試數據矩陣和對應的標簽列表,如果出現錯誤則返回None, None"""try:# 獲取測試數據文件夾下的所有文件名testFileList = listdir('testDigits')# 計算測試數據的數量mTest = len(testFileList)# 初始化一個mTest行1024列的零矩陣,用于存儲測試數據testMat = np.zeros((mTest, 1024))# 用于存儲測試數據的標簽testLabels = []# 遍歷測試數據文件夾下的所有文件for i in range(mTest):# 獲取當前文件名fileNameStr = testFileList[i]# 從文件名中提取出對應的數字標簽classNumber = int(fileNameStr.split('_')[0])# 將標簽添加到標簽列表中testLabels.append(classNumber)# 調用img2vector函數將當前文件轉換為向量vector = img2vector(f'testDigits/{fileNameStr}')if vector is not None:# 將轉換后的向量存儲到測試數據矩陣的相應行testMat[i, :] = vector# 返回測試數據矩陣和標簽列表return testMat, testLabelsexcept FileNotFoundError:# 若測試數據文件夾未找到,打印錯誤信息print("錯誤:測試數據文件夾未找到。")return None, Noneexcept Exception as e:# 若發生其他未知錯誤,打印錯誤信息print(f"錯誤:加載測試數據時發生未知錯誤:{e}")return None, None# 此函數用于進行手寫數字識別測試,打印分類結果和錯誤率
def handwritingClassTest():"""手寫數字識別測試"""# 調用load_training_data函數加載訓練數據trainingMat, hwLabels = load_training_data()if trainingMat is None or hwLabels is None:# 若加載訓練數據失敗,直接返回return# 創建一個K近鄰分類器對象,設置鄰居數量為3,算法為自動選擇neigh = kNN(n_neighbors=3, algorithm='auto')# 使用訓練數據和標簽對分類器進行訓練neigh.fit(trainingMat, hwLabels)# 調用load_test_data函數加載測試數據testMat, testLabels = load_test_data()if testMat is None or testLabels is None:# 若加載測試數據失敗,直接返回return# 初始化錯誤計數為0errorCount = 0.0# 計算測試數據的數量mTest = len(testLabels)# 遍歷測試數據for i in range(mTest):# 使用訓練好的分類器對當前測試數據進行預測classifierResult = neigh.predict(testMat[i].reshape(1, -1))# 打印分類結果和真實標簽print(f"分類返回結果為 {classifierResult[0]}\t真實結果為 {testLabels[i]}")if classifierResult[0] != testLabels[i]:# 若分類結果與真實標簽不一致,錯誤計數加1errorCount += 1.0# 打印錯誤的數量和錯誤率print(f"總共錯了 {int(errorCount)} 個數據\n錯誤率為 {errorCount / mTest * 100:.2f}%")# 程序入口,當腳本作為主程序運行時,調用handwritingClassTest函數進行測試
if __name__ == '__main__':handwritingClassTest()
# 首先導入鳶尾花數據載入工具
from sklearn.datasets import load_iris
#導入KNN分類模型
from sklearn.neighbors import KNeighborsClassifier
#為了方便可視化,我們再導入matplotlib和seaborn
import matplotlib.pyplot as plt
import seaborn as sns
#加載鳶尾花數據集,賦值給iris變量
iris = load_iris()
#查看數據集的鍵名
iris.keys()
#查看數據集的特征名稱
iris.feature_names
# 查看數據集中的樣本分類
iris.target 
#將樣本的特征和標簽分別賦值給X和y
x, y = iris.data, iris.target 
#查看是否成功
x.shape
#導入數據集拆分工具
from sklearn.model_selection import train_test_split
#將X和y拆分為訓練集和驗證集
x_train, x_test, y_train, y_test = train_test_split(x,y)
#查看拆分情況
x_train.shape
#創建KNN分類器,參數保持默認設置
knn_clf = KNeighborsClassifier(n_neighbors=6)
#使用訓練集擬合模型
knn_clf.fit(x_train,y_train)
#查看模型在訓練集和驗證集中的準確率print('訓練集準確率:%.2f'%knn_clf.score(x_train, y_train))
print('驗證集準確率:%.2f'%knn_clf.score(x_test, y_test))# 導入網格搜索
from sklearn.model_selection import GridSearchCV
# 定義一個從1到10的n_neighbors
n_neighbors = tuple(range(1,11,1))
# 創建網格搜索示例,estimator 用knn分類器
# 把剛剛定義的n_neighbors 傳入param_grid參數
# cv參數指交叉驗證次數為5
cv = GridSearchCV(estimator=KNeighborsClassifier(),param_grid = {'n_neighbors':n_neighbors},cv = 5)
# 使用網絡搜索你和數據集
cv.fit(x,y)
# 查看最優參數
cv.best_params_
訓練集準確率:0.96
驗證集準確率:0.95{'n_neighbors': 6}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74896.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74896.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git revert 用法實戰:撤銷一個 commit 或 merge

git revert 1 區別 ? 常規的 commit (使用 git commit 提交的 commit) ? merge commit 2 首先構建場景 master上的代碼 dev開發分支上,添加一個a標簽,并commit這次提交 切到master上,再次進行改動和提交 將de…

自然語言處理|高效法律助手:AI如何解析合同條款?

引言:法律 AI 的崛起 在數字化浪潮快速發展的今天,人工智能(AI)已不再是一個陌生的概念,它正以快速發展滲透到各個領域,法律行業也不例外。從智能合同審查到法律風險預測,AI 技術為法律工作帶來…

【數據分享】2000—2024年我國鄉鎮的逐年歸一化植被指數(NDVI)數據(年最大值/Shp/Excel格式)

之前我們分享過2000-2024年我國逐年的歸一化植被指數(NDVI)柵格數據,該逐年數據是取的當年月歸一化植被指數(NDVI)的年最大值!另外,我們基于此年度柵格數據按照行政區劃取平均值,得到…

辦公網絡健康監控(域名健康監控)

需求 辦公室訪問一些網絡經常出現故障 現需要時時觀察監控這些網絡的健康 包含專線網等其他網絡 實施 支持 SNMP 且支持 Webhook 發送報警的開源監控系統 hertzbeat:關系型數據庫+時序數據庫; Zabbix:關系型數據庫; LibreNMS:關系型數據庫; Prometheus(包含ale…

藍橋杯 合并數列

問題描述 小明發現有很多方案可以把一個很大的正整數拆成若干個正整數的和。他采用了其中兩種方案,分別將它們列為兩個數組: {a?, a?, ..., a?}{b?, b?, ..., b?} 兩個數組的元素和相同。 定義一次合并操作為:將某個數組中相鄰的兩…

【行駛證識別】批量咕嘎OCR識別行駛證照片復印件圖片里的文字信息保存表格或改名字,基于QT和騰訊云api_ocr的實現方式

項目背景 在許多業務場景中,如物流管理、車輛租賃、保險理賠等,常常需要處理大量的行駛證照片復印件。手動錄入行駛證上的文字信息,像車主姓名、車輛型號、車牌號碼等,不僅效率低下,還容易出現人為錯誤。借助 OCR(光學字符識別)技術,能夠自動識別行駛證圖片中的文字信…

個人學習編程(3-29) leetcode刷題

最后一個單詞的長度: 思路:跳過末尾的空格,可以從后向前遍歷 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的長度, int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //從字符串末尾開始//…

PAT甲級(Advanced Level) Practice 1028 List Sorting

原題 1028 List Sorting - PAT (Advanced Level) Practice 題目大意 輸入n個學生的id、姓名、分數,再輸入C表示對C列進行排序。 id:從小到大排 姓名:姓名不同時從小到大排,相同時id從小到大排 分數:不同時從小到…

UE4學習筆記 FPS游戲制作20 重寫機器人和玩家死亡 切換相機和模型

定義父類中的死亡方法 在父類中定義OnDie方法,不需要實現,由子類實現各自的死亡邏輯 新建一個Die方法,處理公共的死亡邏輯 Die的實現: 以前的分離控制現在要延遲做,如果分離了控制器,就無法再獲取到玩家的…

Linux信號的誕生與歸宿:內核如何管理信號的生成、阻塞和遞達?

個人主頁:敲上癮-CSDN博客 個人專欄:Linux學習、游戲、數據結構、c語言基礎、c學習、算法 目錄 一、認識信號 二、信號的產生 1.鍵盤輸入 2.系統調用 3.系統指令 4.硬件異常 5.軟件條件 三、信號的保存 1.block 2.pending 3.handler 四、信號…

DeepSeek API集成開發指南——Flask示例實踐

DeepSeek API集成開發指南——Flask示例實踐 序言:智能化開發新范式 DeepSeek API提供了覆蓋自然語言處理、代碼生成等多領域的先進AI能力。本文將以一個功能完備的Flask示例系統為載體,詳解API的集成方法與最佳實踐。通過本案例,開發者可快…

Linux環境下安裝部署Docker

windows下連接Linux: 打開終端: //ssh遠程連接 ssh root192.168.xx.xx//輸入賬號密碼 root192.168.xx.xxs password: ssh連接成功! 安裝Docker: //安裝Docker yum install -y yum-utils device-mapper-persistent-data lvm2 …

開源CDN產品-GoEdge

一、背景 上篇文章分析了一下CDN的基本原理以及使用代碼實現了一個乞丐版的智能DNS調度器。從整個例子我們可以清晰了解到CDN原理,也就那么回事。 但是,之前也講過了,CDN產品融合的技術比較雜、也比較多。所以我就想著,萬物皆有開…

正則表達式-萬能表達式

1、正則 正則表達式是一組由字母和符號組成的特殊文本, 它可以用來從文本中找 出滿足你想要的格式的句子. {“basketId”: 0, “count”: 1, “prodId”: #prodId#, “shopId”: 1, “skuId”: #skuId#} #prodId# re相關的文章: https://www.cnblogs.com/Simple-S…

javaWeb Router

一、路由簡介 1、什么是路由? - 定義:路由就是根據不同的 URL 地址展示不同的內容或頁面。 - 通俗理解:路由就像是一個地圖,我們要去不同的地方,需要通過不同的路線進行導航。 2、路由的作用 - 單頁應用程序…

【前端】使用 HTML、CSS 和 JavaScript 創建一個數字時鐘和搜索功能的網頁

文章目錄 ?前言?一、項目結構?二、HTML 結構?三、CSS 樣式?四、JavaScript 功能?五、運行效果?總結 標題詳情作者JosieBook頭銜CSDN博客專家資格、阿里云社區專家博主、軟件設計工程師博客內容開源、框架、軟件工程、全棧(,NET/Java/Python/C)、數…

聚焦應用常用功能,提升用戶體驗與分發效率

隨著HarmonyOS應用的持續發展,應用的功能將越來越豐富,實際上80%的用戶使用時長都會集中在20%的特性上,其余的功能可能也僅僅是面向部分用戶。 用戶在下載應用時,如果應用包含大量的功能和資源,可能會導致下載時間過長…

OCR 識別案例

OCR 識別案例 注意點:輸入圖像尺寸比例盡量和參與模型訓練的數據集比例相似,識別效果會更好。 1、pytesseract Pytesseract是一個Python的光學字符識別(OCR)工具,它作為Tesseract OCR引擎的封裝,允許你在…

IP大洗牌ipv6強勢來襲!!!【ipv6配置及應用】

前言 隨著時代的發展,IPv4(互聯網協議第四版)已逐漸無法滿足全球互聯網爆炸式增長的需求。自20世紀80年代誕生以來,IPv4憑借其簡潔的架構和約43億的地址容量,支撐了互聯網的早期擴張。然而,在移動互聯網、物…

OpenAI 推出圖像生成新突破:GPT-4o 實現圖像編輯對話化

關鍵要點 OpenAI 推出了 4o 圖像生成功能,集成于 GPT-4o,提供精準且逼真的圖像生成。 它似乎適用于多種用戶,包括免費用戶,API 訪問預計幾周內推出。 安全措施包括 C2PA 元數據和內容屏蔽,限制生成不適當圖像。 研究…