用Python实现机器学习中的聚类算法 聚类算法是一种无监督学习的机器学习算法,它旨在将数据集中的数据分成不同的群组或者簇。聚类算法可以应用于数据挖掘、图像处理、自然语言处理等领域。本文将会介绍常用的聚类算法和如何用Python实现它们。 1. K-Means聚类算法 K-Means是一种常用的聚类算法,它的核心思想是将数据点分配到K个簇中,使得同一簇内的数据点相似度高,不同簇之间的数据点相似度低。K-Means算法可以分为以下几个步骤: 1)初始化K个中心点。 2)将数据点分配到距离最近的中心点所在的簇。 3)重新计算每个簇的中心点。 4)重复2)和3)直到簇不再发生变化或达到最大迭代次数。 下面是用Python实现K-Means算法的样例代码: ``` import numpy as np import matplotlib.pyplot as plt class KMeans: def __init__(self, k=2, max_iter=100): self.k = k self.max_iter = max_iter def dist(self, x, y): return np.sqrt(np.sum((x-y)**2)) def fit(self, X): self.centers = X[np.random.choice(X.shape[0], self.k, replace=False)] for iter in range(self.max_iter): clusters = [[] for _ in range(self.k)] for i in range(X.shape[0]): distances = [self.dist(X[i], center) for center in self.centers] cluster = np.argmin(distances) clusters[cluster].append(i) new_centers = [] for i in range(self.k): new_centers.append(np.mean(X[clusters[i]], axis=0)) if np.allclose(self.centers, new_centers): break else: self.centers = new_centers def predict(self, X): y_pred = [] for i in range(X.shape[0]): distances = [self.dist(X[i], center) for center in self.centers] cluster = np.argmin(distances) y_pred.append(cluster) return np.array(y_pred) ``` 2. DBSCAN聚类算法 DBSCAN是一种基于密度的聚类算法,它的核心思想是基于数据点周围的密度来确定簇的数量和形状。DBSCAN算法可以分为以下几个步骤: 1)选择一个未被访问的核心点。 2)寻找与该核心点距离小于阈值的所有点,并将它们加入同一簇中。 3)对于簇中的每个点,如果它也是一个核心点,那么将它的邻居加入簇中,并继续迭代。 4)重复1)到3)直到所有点都被访问。 下面是用Python实现DBSCAN算法的样例代码: ``` import numpy as np import matplotlib.pyplot as plt class DBSCAN: def __init__(self, eps=0.5, min_samples=5): self.eps = eps self.min_samples = min_samples def region_query(self, X, i): return np.where(np.linalg.norm(X-X[i], axis=1) < self.eps)[0] def fit(self, X): self.labels = np.zeros(X.shape[0]) C = 0 for i in range(X.shape[0]): if self.labels[i] != 0: continue neighbors = self.region_query(X, i) if len(neighbors) < self.min_samples: self.labels[i] = -1 else: C += 1 self.labels[i] = C while len(neighbors) > 0: j = neighbors[0] neighbors = np.delete(neighbors, 0) if self.labels[j] == -1: self.labels[j] = C elif self.labels[j] == 0: self.labels[j] = C new_neighbors = self.region_query(X, j) if len(new_neighbors) >= self.min_samples: neighbors = np.concatenate((neighbors, new_neighbors)) def predict(self, X): return self.labels ``` 3. 层次聚类算法 层次聚类算法是一种基于类似树状结构的层次结构的聚类算法,它可以自动决定簇的数量。层次聚类算法可以分为以下几个步骤: 1)将每个数据点视为一个簇。 2)计算所有簇之间的相似度。 3)将相似度最高的两个簇合并成一个新的簇。 4)重复2)和3)直到所有数据点都被合并为一个簇或达到最大簇的数量。 下面是用Python实现层次聚类算法的样例代码: ``` import numpy as np import matplotlib.pyplot as plt from scipy.spatial.distance import pdist, squareform class Hierarchical: def __init__(self, linkage='single', max_clusters=None): self.linkage = linkage self.max_clusters = max_clusters def fit(self, X): dists = pdist(X) link = squareform(dists) clusters = [i for i in range(X.shape[0])] while len(clusters) > 1: i, j = np.unravel_index(np.argmin(link), link.shape) if len(clusters) == self.max_clusters: break if self.linkage == 'single': new_link = np.min(link[(clusters == i)[:, None], clusters == j], axis=0) elif self.linkage == 'complete': new_link = np.max(link[(clusters == i)[:, None], clusters == j], axis=0) else: new_link = np.mean(link[(clusters == i)[:, None], clusters == j], axis=0) link = np.delete(link, [i, j], axis=0) link = np.delete(link, [i, j], axis=1) new_row = np.hstack((new_link, link[:, [i, j]])) new_col = np.vstack((new_link, link[[i, j], :])) link = np.vstack((new_row, new_col)) clusters = np.delete(clusters, [i, j]) clusters = np.append(clusters, [max(clusters)+1]) self.labels = np.zeros(X.shape[0]) for i, c in enumerate(np.unique(clusters)): self.labels[clusters == c] = i def predict(self, X): return self.labels ``` 总结 本文介绍了K-Means、DBSCAN和层次聚类三种常用的聚类算法以及如何用Python实现它们。聚类算法在机器学习中的应用越来越广泛,它可以发现数据中的隐藏结构并支持更深入的数据分析。在使用聚类算法时,还需要注意选择合适的距离度量和相似度度量方法,以及对数据进行适当的归一化和缩放。