[Python教學] Scikit-learn:非監督學習-聚類與降維

更新於 發佈於 閱讀時間約 12 分鐘

歡迎來到Scikit-learn教學系列的第六篇文章!在前幾篇中,我們學習了監督學習的分類與回歸模型,以及模型選擇與超參數調優。這一篇將進入非監督學習的領域,聚焦於聚類降維。我們將介紹非監督學習的基本概念、使用Scikit-learn實現常見的聚類與降維演算法,並通過實作範例展示如何應用這些技術分析無標籤資料。準備好探索資料的隱藏結構吧!


非監督學習概述

非監督學習(Unsupervised Learning)處理沒有標籤的資料,目標是從資料中發現模式或結構。常見應用包括:

  • 聚類(Clustering):將資料分為相似群組,例如客戶分群或圖像分割。
  • 降維(Dimensionality Reduction):將高維資料壓縮到低維,保留重要資訊,方便視覺化或加速模型訓練。

Scikit-learn提供了簡單且強大的工具來實現這些任務。


聚類演算法

聚類演算法將資料點分為若干群組,同一群組內的資料點相似。以下是兩種常見演算法:

  1. K均值聚類(K-Means Clustering):將資料分為K個群組,通過最小化群內方差進行分群。
  2. DBSCAN(Density-Based Spatial Clustering of Applications with Noise):基於資料點的密度進行分群,能識別異常值。


降維技術

降維技術將高維資料映射到低維空間,常用於視覺化或減少計算成本。以下是兩種常見方法:

  1. 主成分分析(Principal Component Analysis, PCA):通過線性變換找到資料的主要變異方向。
  2. t-SNE(t-Distributed Stochastic Neighbor Embedding):非線性降維,特別適合視覺化高維資料。


實作:對客戶資料進行聚類與降維

我們將使用一個模擬的客戶資料集(或Scikit-learn的make_blobs生成合成資料),進行K均值聚類與PCA降維,然後視覺化結果。假設資料包含客戶的消費行為特徵(例如年消費金額、購買頻率等)。

程式碼範例

以下程式碼展示如何對合成資料進行聚類與降維:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score

# 生成合成資料
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=1.0, random_state=42)

# 資料前處理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# K均值聚類
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans_labels = kmeans.fit_predict(X_scaled)
kmeans_silhouette = silhouette_score(X_scaled, kmeans_labels)

# DBSCAN聚類
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(X_scaled)
dbscan_silhouette = silhouette_score(X_scaled, dbscan_labels) if len(np.unique(dbscan_labels)) > 1 else None

# PCA降維
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 視覺化聚類結果
plt.figure(figsize=(12, 5))

# K均值結果
plt.subplot(1, 2, 1)
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=kmeans_labels, palette='deep', s=100)
plt.title(f'K-Means Clustering (Silhouette: {kmeans_silhouette:.4f})')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')

# DBSCAN結果
plt.subplot(1, 2, 2)
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=dbscan_labels, palette='deep', s=100)
plt.title(f'DBSCAN Clustering (Silhouette: {dbscan_silhouette if dbscan_silhouette else "N/A"})')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')

plt.tight_layout()
plt.savefig('clustering_results.png')
plt.show()

# 視覺化PCA解釋方差
explained_variance_ratio = pca.explained_variance_ratio_
plt.figure(figsize=(6, 4))
sns.barplot(x=['PC1', 'PC2'], y=explained_variance_ratio)
plt.title('Explained Variance Ratio by PCA Components')
plt.ylabel('Variance Ratio')
plt.savefig('pca_variance.png')
plt.show()

# 評估K均值不同群數
silhouette_scores = []
k_range = range(2, 7)
for k in k_range:
kmeans = KMeans(n_clusters=k, random_state=42)
labels = kmeans.fit_predict(X_scaled)
score = silhouette_score(X_scaled, labels)
silhouette_scores.append(score)

plt.figure(figsize=(6, 4))
sns.lineplot(x=k_range, y=silhouette_scores, marker='o')
plt.title('Silhouette Score vs Number of Clusters')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Silhouette Score')
plt.savefig('kmeans_silhouette.png')
plt.show()

程式碼解釋

  1. 資料生成與前處理: 使用make_blobs生成300筆合成資料,包含4個群組。 使用StandardScaler標準化特徵,確保聚類與降維的穩定性。
  2. 聚類: 應用K均值(n_clusters=4)與DBSCAN(eps=0.5, min_samples=5)進行分群。 使用silhouette_score評估聚類品質(值越接近1越好)。
  3. 降維: 使用PCA將資料降至2維,方便視覺化。 繪製散點圖,展示K均值與DBSCAN的聚類結果。
  4. 視覺化: 繪製PCA解釋方差圖,展示每個主成分的貢獻。 繪製不同K值下的Silhouette分數,幫助選擇最佳群數。

運行程式碼後,你會看到K均值與DBSCAN的聚類結果、PCA降維後的散點圖、解釋方差圖,以及Silhouette分數曲線。

raw-image
raw-image
raw-image


練習:對Iris資料集應用聚類與降維

請完成以下練習:

  1. 使用Scikit-learn的load_iris()載入Iris資料集(忽略標籤,僅使用特徵)。
  2. 對特徵進行標準化。
  3. 使用K均值聚類(n_clusters=3)與DBSCAN(自選eps與min_samples)進行分群。
  4. 使用PCA將資料降至2維,繪製K均值與DBSCAN的聚類結果散點圖,保存為iris_clustering.png。
  5. 計算K均值與DBSCAN的Silhouette分數,並在圖表標題中顯示。
  6. 繪製PCA解釋方差圖,保存為iris_pca_variance.png。

以下是起點程式碼:

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
import seaborn as sns

# 載入Iris資料集
iris = load_iris()
X = iris.data

# 你的程式碼從這裡開始...
raw-image


總結

恭喜你掌握了非監督學習的基礎!本篇文章介紹了聚類(K均值、DBSCAN)與降維(PCA)的概念與應用,並通過合成資料展示了完整流程。你現在能夠發現資料的隱藏結構並視覺化結果。

在下一篇文章中,我們將學習進階應用 - 管道與模型組合,探索如何簡化工作流程並提升模型表現。請完成練習,並在留言區分享你的Iris資料集聚類圖!

資源與進階學習




留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
11會員
163內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/06/20
歡迎來到Scikit-learn教學系列的第五篇文章!我們將介紹交叉驗證、超參數調優方法(網格搜尋與隨機搜尋),以及如何避免過擬合,幫助你選擇最佳模型並優化其參數。準備好讓你的模型更上一層樓吧!
2025/06/20
歡迎來到Scikit-learn教學系列的第五篇文章!我們將介紹交叉驗證、超參數調優方法(網格搜尋與隨機搜尋),以及如何避免過擬合,幫助你選擇最佳模型並優化其參數。準備好讓你的模型更上一層樓吧!
2025/06/10
歡迎來到Scikit-learn教學系列的第四篇文章!在上一篇文章中,我們學習了分類模型,掌握了如何預測離散類別。這一篇將聚焦於回歸模型,這是監督學習的另一大分支,用於預測連續數值。我們將介紹回歸問題、Scikit-learn中常見的回歸演算法,並通過實作範例訓練模型、評估表現並視覺化結果。
Thumbnail
2025/06/10
歡迎來到Scikit-learn教學系列的第四篇文章!在上一篇文章中,我們學習了分類模型,掌握了如何預測離散類別。這一篇將聚焦於回歸模型,這是監督學習的另一大分支,用於預測連續數值。我們將介紹回歸問題、Scikit-learn中常見的回歸演算法,並通過實作範例訓練模型、評估表現並視覺化結果。
Thumbnail
2025/06/04
歡迎來到Scikit-learn教學系列的第三篇文章!在前兩篇中,我們介紹了Scikit-learn的基礎、環境設置以及資料前處理。這一篇將進入監督學習的核心,聚焦於分類模型。我們將學習分類問題的基本概念、使用Scikit-learn實現常見分類演算法,並通過實作範例與評估方法來訓練和評估模型。
Thumbnail
2025/06/04
歡迎來到Scikit-learn教學系列的第三篇文章!在前兩篇中,我們介紹了Scikit-learn的基礎、環境設置以及資料前處理。這一篇將進入監督學習的核心,聚焦於分類模型。我們將學習分類問題的基本概念、使用Scikit-learn實現常見分類演算法,並通過實作範例與評估方法來訓練和評估模型。
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。
Thumbnail
數據分析與解讀 隨著數據的爆炸式增長,能夠分析、解讀和應用數據的能力變得至關重要。這包括熟悉數據分析工具和技術,如統計學、數據挖掘、機器學習等。然而,僅靠短時間的數據分析並不足以提供深入見解。 要熟悉數據分析工具和技術,如統計學、數據挖掘和機器學習,可以從以下幾個方面入手: 基礎知識的學習
Thumbnail
數據分析與解讀 隨著數據的爆炸式增長,能夠分析、解讀和應用數據的能力變得至關重要。這包括熟悉數據分析工具和技術,如統計學、數據挖掘、機器學習等。然而,僅靠短時間的數據分析並不足以提供深入見解。 要熟悉數據分析工具和技術,如統計學、數據挖掘和機器學習,可以從以下幾個方面入手: 基礎知識的學習
Thumbnail
本文將延續上一篇文章,經由訓練好的GAN模型中的生成器來生成圖片 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 [深度學習][Python]訓練CNN的GAN模型來生成圖片_訓練篇 相較之下CNN的GAN生成的效果比較好,但模型也相對比較複雜,訓練時間花的也比較
Thumbnail
本文將延續上一篇文章,經由訓練好的GAN模型中的生成器來生成圖片 [深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇 [深度學習][Python]訓練CNN的GAN模型來生成圖片_訓練篇 相較之下CNN的GAN生成的效果比較好,但模型也相對比較複雜,訓練時間花的也比較
Thumbnail
本文將延續上一篇文章,經由訓練好的VAE模型其中的解碼器,來生成圖片。 [深度學習]訓練VAE模型用於生成圖片_訓練篇 輸入產生的隨機雜訊,輸入VAE的解碼器後,生成的圖片
Thumbnail
本文將延續上一篇文章,經由訓練好的VAE模型其中的解碼器,來生成圖片。 [深度學習]訓練VAE模型用於生成圖片_訓練篇 輸入產生的隨機雜訊,輸入VAE的解碼器後,生成的圖片
Thumbnail
本文介紹了AI助手在數據收集和訓練過程中的工作原理和不斷進步的過程。關注的內容包括從公開的網絡資源、書籍、文章等渠道收集數據,數據的清洗和結構化處理,知識庫的增量更新以及訓練算法和模型的優化。如果大家對AI助手的發展還有任何其他感興趣的話題或建議,歡迎隨時告訴我們,讓我們共同探索,攜手進步。
Thumbnail
本文介紹了AI助手在數據收集和訓練過程中的工作原理和不斷進步的過程。關注的內容包括從公開的網絡資源、書籍、文章等渠道收集數據,數據的清洗和結構化處理,知識庫的增量更新以及訓練算法和模型的優化。如果大家對AI助手的發展還有任何其他感興趣的話題或建議,歡迎隨時告訴我們,讓我們共同探索,攜手進步。
Thumbnail
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
Thumbnail
本文主要介紹神經網路訓練辨識的過程,利用fashion_mnist及簡單的神經網路來進行分類。 使用只有兩層的神經網路來訓練辨識fashion_mnist資料。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News