一、聚類算法概述
聚類是一種無監督學習方法,其目標是將相似的數據樣本自動分組到若干個類別中。聚類分析廣泛應用於數據挖掘、圖像分析、信號處理等領域。
聚類算法大致可以分為以下幾類:
- 層次聚類算法(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-hant/n/335006.html
微信掃一掃
支付寶掃一掃