【數據挖掘】聚類算法學習—K-Means

K-Means

????????K-Means是一種經典的無監督學習算法,用于將數據集劃分為K個簇(clusters),使得同一簇內的數據點相似度高,不同簇間的相似度低。它在數據挖掘、模式識別和機器學習中廣泛應用,如客戶細分、圖像壓縮和異常檢測。下面我將逐步介紹其核心原理、算法步驟、優缺點和應用場景。

要求:

????????理解并掌握K-Means算法,理解算法的原理,能夠實現算法,并對給定的數據集進行聚類

代碼實現:

import numpy as np
import matplotlib.pyplot as plt
import random
#算法實現
class KMeans:def __init__(self, n_clusters=3, max_iter=300):self.n_clusters = n_clustersself.max_iter = max_iterself.centroids = Noneself.labels = Nonedef fit(self, X):#隨機初始化質心indices = random.sample(range(len(X)), self.n_clusters)self.centroids = X[indices]for _ in range(self.max_iter):#分配樣本到最近的質心distances = self._calc_distances(X)self.labels = np.argmin(distances, axis=1)#更新質心位置new_centroids = np.array([X[self.labels == k].mean(axis=0) for k in range(self.n_clusters)])#檢查收斂if np.allclose(self.centroids, new_centroids):breakself.centroids = new_centroidsdef _calc_distances(self, X):return np.array([[np.linalg.norm(x - c) for c in self.centroids] for x in X])def predict(self, X):distances = self._calc_distances(X)return np.argmin(distances, axis=1)#數據加載函數
def load_data(file_path):data = []labels = []with open(file_path, 'r') as f:for line in f:values = line.strip().split(',')#提取前兩個特征和標簽data.append([float(values[0]), float(values[1])])labels.append(values[2])return np.array(data), np.array(labels)#評估函數(使用多數投票原則)
def evaluate_clustering(true_labels, pred_labels):#創建映射關系label_mapping = {}for cluster_id in set(pred_labels):cluster_samples = np.where(pred_labels == cluster_id)[0]cluster_labels = true_labels[cluster_samples]majority_label = max(set(cluster_labels), key=list(cluster_labels).count)label_mapping[cluster_id] = majority_label#計算準確率correct = 0for i in range(len(true_labels)):if label_mapping[pred_labels[i]] == true_labels[i]:correct += 1return correct / len(true_labels), label_mappingif __name__ == "__main__":#加載數據file_path = "D:/課程/數據挖掘/實驗六/實驗6-iris-聚類.txt"X, true_labels = load_data(file_path)#創建K-Means實例并訓練kmeans = KMeans(n_clusters=3)kmeans.fit(X)#預測聚類標簽pred_labels = kmeans.labels#評估聚類結果accuracy, mapping = evaluate_clustering(true_labels, pred_labels)print(f"聚類準確率: {accuracy:.2%}")print("聚類標簽映射關系:")for cluster_id, species in mapping.items():print(f"聚類{cluster_id} -> {species}")plt.figure(figsize=(12, 5))plt.subplot(121)colors = {'Iris-setosa': 'red', 'Iris-versicolor': 'green', 'Iris-virginica': 'blue'}for species in np.unique(true_labels):plt.scatter(X[true_labels == species, 0], X[true_labels == species, 1], label=species,c=colors[species],alpha=0.6)plt.title('真實標簽分布')plt.xlabel('花萼長度')plt.ylabel('花萼寬度')plt.legend()#聚類結果分布plt.subplot(122)for cluster_id in range(3):plt.scatter(X[pred_labels == cluster_id, 0], X[pred_labels == cluster_id, 1], label=f'聚類{cluster_id}',alpha=0.6)#標記質心位置plt.scatter(kmeans.centroids[:, 0], kmeans.centroids[:, 1], marker='X', s=200, c='black', label='質心')plt.title('K-Means聚類結果')plt.xlabel('花萼長度')plt.ylabel('花萼寬度')plt.legend()plt.tight_layout()plt.savefig('kmeans_clustering_result.png')plt.show()

運行結果:

左圖為真實的標簽分布,右圖為K-Means的聚類結果

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

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

相關文章

linux環境內存滿php-fpm

檢查 PHP-FPM 配置 pm.max_children:該參數控制 PHP-FPM 進程池中最大允許的子進程數。過高的子進程數會導致內存占用過大。你可以根據服務器的內存大小來調整 pm.start_servers:控制 PHP-FPM 啟動時創建的進程數。根據實際情況調整此值。 pm.min_spare_…

基于CNN卷積神經網絡圖像識別小程序9部合集

基于CNN卷積神經網絡圖像識別小程序合集-視頻介紹下自取 ? 內容包括: 基于python深度學習的水果或其他物體識別小程序 003基于python深度學習的水果或其他物體識別小程序_嗶哩嗶哩_bilibili 代碼使用的是python環境pytorch深度學習框架,代碼的環境安…

WebRTC(九):JitterBuffer

JitterBuffer Jitter “Jitter”指的是連續到達的媒體包之間時間間隔的變化。在網絡傳輸中,由于: 網絡擁塞路由路徑變化隊列排隊不同鏈路帶寬差異 導致包之間的接收時間不一致,這就是網絡“抖動”。 作用 **JitterBuffer(抖…

【推薦100個unity插件】在 Unity 中繪制 3D 常春藤,模擬生長——hedera插件的使用

注意:考慮到后續接觸的插件會越來越多,我將插件相關的內容單獨分開,并全部整合放在【推薦100個unity插件】專欄里,感興趣的小伙伴可以前往逐一查看學習。 效果演示 文章目錄 效果演示前言一、常春藤生成器工具下載二、工具使用1、…

【三維重建】【3DGS系列】【深度學習】3DGS的理論基礎知識之高斯橢球的幾何變換

【三維重建】【3DGS系列】【深度學習】3DGS的理論基礎知識之高斯橢球的幾何變換 文章目錄 【三維重建】【3DGS系列】【深度學習】3DGS的理論基礎知識之高斯橢球的幾何變換前言模型變換(Model Transformation)觀測變換(Viewing Transformation)視圖變換(View Transformation)投影…

EXISTS 和 NOT EXISTS 、IN (和 NOT IN)

在 SQL 中,EXISTS、NOT EXISTS 和 IN 都是用于子查詢的條件運算符,用于根據子查詢的結果過濾主查詢的行。它們之間的區別主要體現在工作方式、效率、對 NULL 值的處理以及適用場景上。 1. EXISTS 和 NOT EXISTS 作用: EXISTS: 檢查子查詢是…

GitHub 趨勢日報 (2025年06月25日)

📊 由 TrendForge 系統生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日報中的項目描述已自動翻譯為中文 📈 今日獲星趨勢圖 今日獲星趨勢圖 880 awesome 788 build-your-own-x 691 free-for-dev 427 best-of-ml-python 404 …

互聯網大廠Java求職面試:Java虛擬線程實戰

互聯網大廠Java求職面試:Java虛擬線程實戰 文章內容 開篇:技術總監與程序員鄭薪苦的三輪對話 在一場緊張而嚴肅的Java工程師面試中,技術總監張工正對候選人鄭薪苦進行深入提問。鄭薪苦雖然性格幽默,但對技術有著扎實的理解。今天…

網絡安全的兩大威脅:XSS與CSRF攻擊實例解析

在網絡攻擊中,XSS跨站腳本攻擊(Cross Site Scripting)與CSRF跨站請求偽造攻擊(Cross-Site Request Forgery)是兩種常見的攻擊方式,它們之間存在顯著的區別。以下是對這兩種攻擊方式的詳細比較: 一、攻擊原理 XSS跨站腳本攻擊 攻擊者通過在Web頁面中注入惡意腳本來實現攻…

如何一次性將 iPhone 中的聯系人轉移到 PC

許多重要的聯系人都存儲在您的 iPhone 上。為了保護關鍵信息,您可能需要將聯系人從 iPhone 轉移到 PC,這是一種有效的聯系人備份方法。如果您在將 iPhone 聯系人轉移到電腦上遇到困難,現在可以從本文中學習 5 個有效的解決方案,然…

Spring Boot開啟定時任務的三種方式 【@EnableScheduling注解,SchedulingConfigurer接口,Quartz 框架】

Spring Boot 開啟定時任務的三種方式? ? ? 在 Spring Boot 應用開發過程中,定時任務是十分常見的需求,比如定時清理日志文件、定期備份數據庫數據、定時發送郵件提醒等。Spring Boot 提供了多種開啟定時任務的方式,本文將詳細介紹三種常見…

LLM 編碼器 怎么實現語義相關的 Token 向量更貼近? mask訓練:上下文存在 ;; 自回歸訓練:只有上文,生成模型

LLM 編碼器 怎么實現語義相關的 Token 向量更貼近? 目錄 LLM 編碼器 怎么實現語義相關的 Token 向量更貼近?mask訓練:上下文存在自回歸訓練:只有上文,生成模型一、核心機制:損失函數與反向傳播的“語義校準”1. 損失函數的“語義約束”2. 嵌入層參數的“動態調整”二、關…

從OCR瓶頸到結構化理解來有效提升RAG的效果

當人們探討如何讓人工智能系統更好地從文檔中查找和使用信息時,通常關注的是令人矚目的算法和前沿的大型語言模型。但問題是:如果文本提取的質量很差,那么后續的努力都將付諸東流。本文探討OCR質量如何影響檢索增強生成(RAG&#…

SpringBoot -- 整合Junit

11.SpringBoot 整合 Junit 11.1 為什么需要單元測試 由于在SpringBoot開發過程中,每開發一個模塊,有時需要從 controller、service、mapper 到甚至 xml 文件的編寫全部開發完畢才能進行測試,這是十分浪費時間的,比如開發人員想測…

虛擬機遠程連接編譯部署QT程序

概要 邏輯 我們需要湊齊 QT庫、交叉編譯工具、sysroot這三大件。 交叉編譯的程序是部署到板卡環境運行,需要構建和板卡一樣的庫環境。 sysroot是我們在虛擬機上自己命名的一個文件夾,包含開發板的運行系統所需的所有文件。 虛擬機是x64版本,開發板是arm64版本。 如果開發板…

基于SpringBoot的智慧旅游系統

以智慧旅游系統的設計與實現為研究對象,旨在通過科技手段提升旅游業的管理效能和游客體驗。在系統設計方面,深入分析了地理特征、豐富的文化底蘊以及多樣的自然景觀。結合這些獨特之處,構建了一個多層次的旅游管理系統,包括景點信…

下載最新版本的OpenOCD

Download OpenOCD for Windowsd: https://gnutoolchains.com/arm-eabi/openocd/

Geollama 輔助筆記:raw_to_prompt_strings_geo.py

1 GeoLifePreprocessingDF 1.1 創造函數 1.2 讀取原始數據 讀取這個DataFrame 1.3 處理原始DataFrame 1.4 生成對應prompt 1.5 打亂軌跡 1.6 打亂軌跡里面的事件

TDengine 如何打破工業實時數據庫勢力邊界?

打破工業實時數據庫勢力邊界,TDengine 時序數據庫與工業 SCADA 深度融合 隨著 時序數據庫(Time Series Database)的日益普及,越來越多的工業自動化控制(工控)人員開始認識到其強大能力。然而,時…

滲透靶場:事件和屬性被阻止的反射xss

本關很多標簽被攔截了&#xff0c;需要使用 burp 模糊測試哪個標簽可以用 <a>和<animate>可以使用&#xff0c;<animate>是<svg>標簽中用來給動畫設定屬性的&#xff0c;看看<svg>可不可用 利用<svg>、<animate>、<a>來構造 這…