[機器學習]03-基于核密度估計(KDE)的鳶尾花數據集分類

關鍵點:

  • 使用核密度估計(KDE)?估計類別條件概率密度(高斯核,帶寬=0.2)

  • 采用最大后驗概率(MAP)?決策準則進行分類

程序代碼:

import random
import matplotlib
from sklearn.neighbors import KernelDensity
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocatordata_dict = {}
train_data = {}
test_data = {}matplotlib.rcParams.update({'font.size': 5})   #整體原始字體大小'''
加載數據形成字典,并且隨機打亂形成每類訓練數據45個,測試數據5個
'''
with open('Iris數據txt版.txt', 'r') as file:for line in file:line = line.strip()data = line.split('\t')if len(data) >= 3:try:category = data[0]attribute1 = eval(data[1])attribute2 = eval(data[2])if category not in data_dict:data_dict[category] = {'Length': [], 'Width': []}data_dict[category]['Length'].append(attribute1)data_dict[category]['Width'].append(attribute2)except ValueError:print(f"Invalid data in line: {line}")continue
for category, attributes in data_dict.items():print(f'種類: {category}')print(len(attributes["Length"]))print(len(attributes["Width"]))print(f'屬性1: {attributes["Length"]}')print(f'屬性2: {attributes["Width"]}')for category, attributes in data_dict.items():lengths = attributes['Length']widths = attributes['Width']train_indices = random.sample(range(len(lengths)), 45)test_indices = [i for i in range(len(lengths)) if i not in train_indices]train_data[category] = {'Length': [lengths[i] for i in train_indices],'Width': [widths[i] for i in train_indices]}test_data[category] = {'Length': [lengths[i] for i in test_indices],'Width': [widths[i] for i in test_indices]}prior_rate = 1.0/len(data_dict)
#print("訓練數據:")
#print(train_data)
#print(train_data['1']['Length'])
#print(train_data['1']['Width'])
#print(len(train_data['1']['Length']))
#print("測試數據:")
#print(test_data)
#print(test_data['1']['Length'])
#print(test_data['1']['Width'])
#print(len(test_data['1']['Length']))'''
使用Python自帶的k近鄰法(KNN算法)計算概率密度
'''
knn_models = {}
smoothed_data = {}for category, attributes in train_data.items():lengths = np.array(attributes['Length']).reshape(-1, 1)widths = np.array(attributes['Width']).reshape(-1, 1)knn_length = KernelDensity(kernel='gaussian', bandwidth=0.2).fit(lengths)knn_width = KernelDensity(kernel='gaussian', bandwidth=0.2).fit(widths)knn_models[category] = {'Length': knn_length, 'Width': knn_width}length_range = np.around(np.linspace(4, 8, 40), 1)width_range = np.around(np.linspace(2, 4.5, 25), 1)length_mesh, width_mesh = np.meshgrid(length_range, width_range)log_density_length = knn_length.score_samples(length_mesh.reshape(-1, 1))log_density_width = knn_width.score_samples(width_mesh.reshape(-1, 1))total_density = np.exp(log_density_length) + np.exp(log_density_width)total_density = total_density.reshape(length_mesh.shape)smoothed_data[category] = {'Length': length_mesh, 'Width': width_mesh, 'ProbabilityDensity': total_density}fig, axs = plt.subplots(1, 3, figsize=(18, 6), subplot_kw={'projection': '3d'})for idx, (category, data) in enumerate(smoothed_data.items()):ax = axs[idx]ax.set_title(f'Density Of Category: {category}',fontsize = 14)ax.plot_surface(data['Length'], data['Width'], data['ProbabilityDensity'], cmap='coolwarm')x_major_locator = MultipleLocator(0.1)y_major_locator = MultipleLocator(0.1)z_major_locator = MultipleLocator(0.2)ax.xaxis.set_major_locator(x_major_locator)ax.yaxis.set_major_locator(y_major_locator)ax.zaxis.set_major_locator(z_major_locator)ax.set_xlabel('Length',fontsize = 10)ax.set_ylabel('Width',fontsize = 10)ax.set_zlabel('ProbabilityDensity',fontsize = 10)plt.tight_layout()
plt.show()right = 0
all = 0for category1,data1 in test_data.items():print(category1,data1)for i,j in zip(data1['Length'],data1['Width']):desired_probability_density = {}for idx,(category2, data2) in enumerate(smoothed_data.items()):length_mesh = data2['Length']width_mesh = data2['Width']probability_density = data2['ProbabilityDensity']#獲取長度、寬度和概率密度數據length_index = np.abs(length_mesh[0] - i).argmin()width_index = np.abs(width_mesh[:, 0] - j).argmin()#找對應的索引desired_probability_density[category2] = probability_density[width_index, length_index]#用索引找對應的概率密度predict = max(desired_probability_density,key = desired_probability_density.get)#取后驗概率最大的類別print(category1,predict)all += 1if category1 == predict:right += 1print("正確率:",right/all)

運行結果:

種類: 1
50
50
屬性1: [5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5.0, 5.0, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5.0, 5.5, 4.9, 4.4, 5.1, 5.0, 4.5, 4.4, 5.0, 5.1, 4.8, 5.1, 4.6, 5.3, 5.0]
屬性2: [3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3.0, 3.0, 4.0, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3.0, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3.0, 3.4, 3.5, 2.3, 3.2, 3.5, 3.8, 3.0, 3.8, 3.2, 3.7, 3.3]
種類: 2
50
50
屬性1: [7.0, 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5.0, 5.9, 6.0, 6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6.0, 5.7, 5.5, 5.5, 5.8, 6.0, 5.4, 6.0, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, 5.8, 5.0, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7]
屬性2: [3.2, 3.2, 3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2.0, 3.0, 2.2, 2.9, 2.9, 3.1, 3.0, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3.0, 2.8, 3.0, 2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3.0, 3.4, 3.1, 2.3, 3, 2.5, 2.6, 3.0, 2.6, 2.3, 2.7, 3.0, 2.9, 2.9, 2.5, 2.8]
種類: 3
50
50
屬性1: [6.3, 5.8, 7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, 7.7, 6.0, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6.0, 6.9, 6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9]
屬性2: [3.3, 2.7, 3.0, 2.9, 3.0, 3.0, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3.0, 2.5, 2.8, 3.2, 3.0, 3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3.0, 2.8, 3.0, 2.8, 3.8, 2.8, 2.8, 2.6, 3.0, 3.4, 3.1, 3.0, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3, 2.5, 3, 3.4, 3]
1 {'Length': [5.1, 5.0, 5.4, 5.1, 5.1], 'Width': [3.3, 3.0, 3.4, 3.4, 3.8]}
1 1
1 1
1 1
1 1
1 1
2 {'Length': [6.5, 5.4, 6.7, 5.6, 5.1], 'Width': [2.8, 3.0, 3.1, 3, 2.5]}
2 3
2 2
2 3
2 2
2 1
3 {'Length': [5.8, 6.9, 7.4, 6.4, 6.9], 'Width': [2.7, 3.2, 2.8, 3.1, 3.1]}
3 2
3 3
3 3
3 3
3 3
正確率: 0.7333333333333333

進程已結束,退出代碼0

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

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

相關文章

jmeter怎么實現多個請求真正的同時發送

1.首先在插件管理器Plugins Manager中搜索插件Parallel Controller&Sampler,勾選上對應的插件后,在右下角點擊Apply Changes and Restart JMeter,安裝插件2.插件安裝完畢后,然后在線程組上面右擊,點擊添加--邏輯控…

復雜環境下車牌識別準確率↑29%:陌訊動態特征融合算法實戰解析

原創聲明本文為原創技術解析,核心技術參數與架構設計引用自《陌訊技術白皮書》,轉載需注明來源。一、行業痛點:車牌識別的現實挑戰在智慧交通、停車場管理等場景中,車牌識別作為關鍵技術環節,長期面臨多重環境干擾。據…

Express中間件和路由及響應方法

1.中間件分類 應用程序級別中間件 通過 app.use() 或 app.METHOD()(如 app.get)綁定的中間件,作用于整個應用程序。例如 記錄請求日志、解析請求體等全局功能。例如: app.use((req, res, next) > {console.log(Request URL:…

Dokcer創建中間件環境

簡而言之,用docker來搞中間件環境比價好使,不用關心各種環境了 rabbitmqsudo docker run -d \--name rabbitmq \-p 5672:5672 \-p 15672:15672 \rabbitmq:3.8-managementredis 5.0.3 docker start my-redisdocker run --name my-redis -d -p 6379:6379 \…

Linux高級編程-文件操作

1.Linux下的文件類型7種文件類型:b 塊設備文件 -------> 存儲類設備(硬盤) c 字符設備文件 ------->如輸入輸出設備(鼠標鍵盤顯示器...) d 目錄文件 ------->文件夾 - 普通文件 -------&g…

web:vue中import *** from 和import {***} from的區別

在Vue.js中,import語句用于導入模塊、組件或變量等。使用帶花括號{}和不帶花括號的區別主要在于導入的內容是具名導出(named exports)還是默認導出(default export)。 默認導入 (Default Import) - 不帶花括號 import Vue from vue; import MyComponent from ./MyCompone…

Mysql如何優化my.conf配置文件?

優化 MySQL 的 my.cnf 配置文件,可以顯著提升數據庫性能,特別是在高并發或大數據量場景下。以下是優化 my.cnf 的方法和建議,涵蓋 常見配置項、參數說明 和 優化技巧。1. 優化前的準備工作在修改 my.cnf 之前,需了解以下內容&…

Cherryusb UAC例程對接STM32內置ADC和DAC播放音樂和錄音(上)=>TIM+DAC+ADC+DMA正弦波回環測試

0. 概述 文本目標基于Cherryusb官方例程audio_v1_mic_speaker_multichan_template.c,底層對接STM32的內置ADC和DAC,實現錄音和播放。通過電腦播放歌曲,板子發出聲音。通過電腦錄音機開啟錄音,板子作為麥克風采集聲音,…

數模個人筆記

寫在前面:不建議觀看,會爛尾的1.馬氏鏈:狀態空間指的是隨機變量的取值范圍,xi稱為一個狀態,應用背景在現在的條件下下一狀態發生的概率,比如退火,他的條件概率可化簡為:且nm時刻的概…

Spring Boot自定義Starter:從原理到實戰全解析

1. 背景與需求1.1 什么是Starter? Spring Boot的起步依賴(Starter)是一種特殊的依賴描述符,用于簡化Spring應用的依賴管理和自動配置。官方文檔將Starter定義為“一組方便的依賴描述符”,開發者只需引入對應的Starter&…

安寶特方案丨工業AR+AI質檢方案:致力于提升檢測精度與流程效率

據IDC預測,2025年中國工業AI質檢市場規模將達62億元,年復合增長率28.5%,新能源、消費電子、高端裝備三大領域貢獻超70%市場份額。這一數據印證了AI質檢已從可選技術升級為制造業降本增效的生存剛需。當前制造業質檢環節正面臨:精度…

AudioLLM

參考鏈接:https://mp.weixin.qq.com/s/cscrUn7n_o6PdeQRzWpx8g 視頻教程:https://www.bilibili.com/video/BV1LGbozkEDY 模型代碼:https://github.com/boson-ai/higgs-audio 如果是兩個模型加在一起:一個語言模型,一個…

基于 CEP 引擎的算法拆單與調度實踐—基礎篇

在金融市場中,大額訂單的一次性交易可能會對市場價格產生較大沖擊,導致交易成本增加。例如,大額買入訂單可能會迅速推高股價,使后續買入成本上升;大額賣出訂單則可能打壓股價,造成資產賤賣。拆單算法通過將…

開源 C# TCP 通信框架 SocketDJ 發布:輕量、免費、可擴展

前言市面上的網絡通信框架琳瑯滿目,功能強大者有之,但不少都存在功能閉源、商業收費、學習成本高等問題。作為一名熱愛底層技術的開發者,我始終相信:基礎通信能力應當簡單、透明且免費。最近正好有項目需求,索性動手從…

移動機器人路徑規劃中ROS2中間件性能的研究綜述

導讀: 隨著移動機器人在工業自動化、特種作業及智能服務領域的廣泛應用,其路徑規劃能力越來越依賴機器人操作系統ROS2的通信性能。ROS2通過去中心化架構與數據分發服務中間件顯著提升了系統可靠性,但動態復雜環境中路徑規劃對通信延遲、帶寬…

【昇騰】Atlas 500 A2 智能小站制卡從M.2 SATA盤啟動Ubuntu22.04系統,重新上電卡死沒進系統問題處理_20250808

一、問題背景 Atlas 500 A2智能小站是華為基于20T 12G版本的Atlas 200I A2加速模塊開發的面向廣泛邊緣應用場景的輕量邊緣設備,具有超強計算性能、配置靈活、體積小、支持溫度范圍寬、環境適應性強、易于維護 管理等特點的產品。Atlas 500 A2智能小站主要應用在智能…

sigaction 中 sa_handler = SIG_IGN 的深度解析與應用實踐

sigaction 中 sa_handler SIG_IGN 的深度解析與應用實踐 核心意義:主動忽略信號 當 sa_handler 設置為 SIG_IGN 時,內核將完全丟棄指定的信號,不會: 執行默認行為調用任何處理函數中斷進程的正常執行 這與 SIG_DFL(默…

【LLM實戰|langchain、qwen_agent】RAG高級

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?type=blog 0. 前言 RAG高級 1. RAG 高效召回方法 合理設置TOP-K 改進索引算法 -知識圖譜 引入重排序 重排序模型 BGE-Rerank Cohere Rerank 混合檢索 向量索引+關鍵詞索引…

C++方向知識匯總(一)

關于單例模式1.什么是單例模式?答:單例模式是一種創建型設計模式,確保一個類在運行期間僅有一個實例,提供全局唯一的訪問點2.單例模式的目的?答:避免重復創建資源消耗大的對象,例如日志系統、線…

學習:JS[8]本地存儲+正則表達式

一.本地存儲1.介紹將數據存儲到用戶瀏覽器當中設置、讀取方便、頁面刷新不丟失數據2.本地存儲分類-localStoragea.語法(1)存儲數據//存儲數據 localStorage.setItem(鍵,值)如 localStorage.setItem(uname,哈哈)(2)獲取數據//獲取方式 都加引號 localStorage.getItem(鍵) localS…