一、聚類算法概述
聚類是一種無監督學習方法,其目標是將相似的數據樣本自動分組到若干個類別中。聚類分析廣泛應用於數據挖掘、圖像分析、信號處理等領域。
聚類算法大致可以分為以下幾類:
- 層次聚類算法(Hierarchical Clustering)
- 劃分聚類算法(Partitioning Clustering)
- 基於密度的聚類算法(Density-based Clustering)
- 基於網格的聚類算法(Grid-based Clustering)
- 模型聚類算法(Model-based Clustering)
下面我們以K-means算法為例進行介紹。
二、K-means算法
K-means算法是一種基於劃分的聚類算法,其主要思想是將所有數據點劃分到K個集群中,使得同一集群內的樣本點是相似的,不同集群內的樣本點是不相似的。K-means算法的具體過程如下:
- 隨機選取K個數據點作為初始的聚類中心;
- 計算所有數據點到聚類中心的距離,將其歸為距離最近的聚類中心所在的集群內;
- 計算每個集群的重心,作為新的聚類中心;
- 重複步驟2和3,直至滿足收斂條件。
下面是K-means算法的代碼實現:
import numpy as np class KMeans: def __init__(self, k=3, max_iters=100): self.K = k self.max_iters = max_iters def fit(self, X): self.centroids = X[np.random.choice(len(X), self.K, replace=False)] for i in range(self.max_iters): clusters = [[] for _ in range(self.K)] for x in X: distances = [np.linalg.norm(x-c) for c in self.centroids] cluster_idx = np.argmin(distances) clusters[cluster_idx].append(x) prev_centroids = self.centroids self.centroids = [np.mean(cluster, axis=0) for cluster in clusters] if np.all(prev_centroids == self.centroids): break self.labels = np.zeros(len(X)) for i, cluster in enumerate(clusters): for x in cluster: self.labels[X.tolist().index(x.tolist())] = i return self.labels
三、K-means算法應用舉例
以下是一個簡單的數據集,其中包含了40個樣本點:
import matplotlib.pyplot as plt data = np.vstack(((np.random.randn(10, 2) * 0.75 + np.array([1, 0])), (np.random.randn(10, 2) * 0.25 + np.array([-0.5, 0.5])), (np.random.randn(10, 2) * 0.5 + np.array([-0.5, -0.5])), (np.random.randn(10, 2) * 0.5 + np.array([0.5, -0.5])), (np.random.randn(10, 2) * 0.5 + np.array([0.5, 0.5])))) plt.scatter(data[:,0], data[:,1]) plt.show()
運行結果如下:
我們可以使用K-means算法將這40個點聚成3類,代碼如下:
kmeans = KMeans(k=3, max_iters=100) labels = kmeans.fit(data) colors = ['r', 'g', 'b'] for i in range(kmeans.K): plt.scatter(data[labels==i][:,0], data[labels==i][:,1], color=colors[i]) plt.scatter(kmeans.centroids[:,0], kmeans.centroids[:,1], marker='x', color='black') plt.show()
運行結果如下:
四、K-means算法的優缺點
K-means算法是一種快速且易於實現的聚類算法,但是也存在一些缺點,如下所示:
- 需要預先指定類別數,如果K值選擇不當,會導致聚類性能較差;
- 對於非凸形狀或密度不均勻的數據分佈,聚類效果較差;
- 算法對初始值非常敏感,不同的初始值可能會得到不同的聚類結果;
- 只能適用於連續型的數值型特徵,對於離散型或文本型特徵不可使用。
五、總結
聚類分析是一種無監督學習方法,其主要目的是將相似的數據樣本自動分組到若干個類別中。本文介紹了K-means算法,並提供了一個簡單的代碼實現和應用,同時對K-means算法的優缺點進行了分析。在實際應用中,需要根據數據特點選擇合適的聚類算法,並選取合適的K值來提高聚類性能。
原創文章,作者:JJGVL,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/335006.html