下面是关于“Python实现聚类算法原理”的完整攻略。
1. 聚类算法简介
聚类算法是一种无监督学习算法,它的目标是将数据中的样本分成若干个类别,使得同一类别内的样本相似度高,不同类别之间的相似度低。聚类算法的核心是距离度量和聚类中心。距离度量用于计算样本之间的相似度,聚类心用于表示每个类别的中心点。
2. K-Means算法
K-Means算法是一种基于距离度量的聚类算法,它的目标是将数据集中的样本分成K个类别,使得同一类别内的样本距离聚类中心最近,不同类别之间的距离最大。算法的过程如下:
- 随机选择个样本作为聚类中心。
- 对于每个样本,计算它与K个聚类中心的距离,并将它分配到距离最近的聚类中心所在的类别。
- 对于每个类别,重新算它的聚类中心。
- 重复步骤2和步骤3,直到收敛或达到最大迭代次数。
3. Python实现K-Means算法
下面是一个使用Python实现K-Means算法的示例:
import numpy as np
class KMeans:
def __init__(self, n_clusters, max_iter=100):
self.n_clusters = n_clusters
self.max_iter = max_iter
def fit(self, X):
n_samples, n_features = X.shape
centroids = X[np.random.choice(n_samples, self.n_clusters, replace=False)]
for i in range(self.max_iter):
labels = np.argmin(np.linalg.norm(X[:, np.newaxis] - centroids, axis=2), axis=1)
new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(self.n_clusters)])
if np.allclose(centroids, new_centroids):
break
centroids = new_centroids
self.labels_ = labels
self.cluster_centers_ = centroids
在这个示例中,我们定义了一个KMeans类来实现K-Means算法。类的构造函数接受两个参数:n_clusters表示聚类数,max_iter表示最大迭代次数。类包含一个fit方法,用于拟合数据。在fit方法中,我们首先随机选择K个样本作为聚类中心,然后重复计算每个样本与聚类中心的距离,并将它分配到距离最近的聚类中心所在的类别。接着,我们重新计算每个类别的聚类中心,并重复上述过程,直到收敛或达到最大迭代次数。最后,我们将聚类结果保存在labels_和cluster_centers_属性中。
下面是一个使用上述KMeans类对Iris数据集进行聚类的示例:
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
iris = load_iris()
X = iris.data
k_means = KMeans(n_clusters=3)
k_means.fit(X)
plt.scatter(X[:, 0], X[:, 1], c=k_means.labels_)
plt.scatter(k_means.cluster_centers_[:, 0], k_means.cluster_centers_[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
在这个示例中,我们使用sklearn库的load_iris函数加载Iris数据集。我们使用KMeans类来对数据集进行聚类,并使用matplotlib库将聚类结果可视化。
4. DBSCAN算法
DBSCAN算法是一种基于密度的聚类算法,它的目标是将数据集中的样本分成若干个类别,使得同一类别内的样本密度高,不同类别之间的密度低。算法的过程如下:
- 随机选择一个未访问的样本。
- 计算它与未访问的样本的距离,并找到距离小于阈值ε的样本集合,称为邻域。
- 如果邻域中的样本数大于等于阈值MinPts,则将该样本标记为核心点,并将邻域中的所有样本加入同一类别。
- 重复步骤2和步骤3,直到所有样本都被访问。
- 将未被标记的样本标记为噪声点或加入最近的核心点所在的类别。
5. Python实现DBSCAN算法
下面是一个使用Python实现DBSCAN算法的示例:
import numpy as np
class DBSCAN:
def __init__(self, eps=0.5, min_samples=5):
self.eps = eps
self.min_samples = min_samples
def fit(self, X):
n_samples = X.shape[0]
visited = np.zeros(n_samples, dtype=bool)
labels = np.zeros(n_samples, dtype=int)
cluster_id = 0
for i in range(n_samples):
if visited[i]:
continue
visited[i] = True
neighbors = self._get_neighbors(X, i)
if len(neighbors) < self.min_samples:
labels[i] = -1
else:
cluster_id += 1
labels[i] = cluster_id
for j in neighbors:
if not visited[j]:
visited[j] = True
new_neighbors = self._get_neighbors(X, j)
if len(new_neighbors) >= self.min_samples:
neighbors = np.concatenate((neighbors, new_neighbors))
if labels[j] == 0:
labels[j] = cluster_id
self.labels_ = labels
def _get_neighbors(self, X, i):
return np.where(np.linalg.norm(X - X[i], axis=1) < self.eps)[0]
在这个示例中,我们定义了一个DBSCAN类来实现DBSCAN算法。类的构造函数接受两个参数:eps表示邻域半径,min_samples表示邻域中的最小样本数。类包含一个fit方法,用于拟合数据。在fit方法中,我们首先遍历所有未访问的样本,计算它的邻域,并根据邻域中的样本数判断它是否为核心点。如果是核心点,则将邻域中的所有样本加入同一类别,并重复上述过程。最后,我们将聚类结果保存在labels_属性中。
下面是一个使用上述DBSCAN类对Moon数据集进行聚类的示例:
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
X, y = make_moons(n_samples=200, noise=0.05, random_state=0)
dbscan = DBSCAN(eps=0.3, min_samples=5)
dbscan.fit(X)
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_)
plt.show()
在这个示例中,我们使用sklearn库的make_moons函数生成Moon数据集。我们使用DBSCAN类来对数据集进行聚类,并使用matplotlib库将聚类结果可视化。
6. 总结
K-Means算法和DBSCAN算法是两种常用的聚类算法。K-Means算法是一种基于距离度量的聚类算法,它的目标是将数据集中的样本分成K个类别。DBSCAN算法是一种基于密度的聚类算法,它的目标是将数据集中的样本分成若干个类别。在Python中,我们可以使用numpy库和sklearn库来实现这两种算法,并使用matplotlib库将聚类结果可视化。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现聚类算法原理 - Python技术站