2)自行实现KMeans算法,对给定的数据集进行簇划分(可以尝试取不同K值时的效果)。
时间: 2024-02-11 07:08:57 浏览: 23
好的,我可以帮你实现KMeans算法来对给定的数据集进行簇划分。
首先,让我们来看看KMeans算法的步骤:
1. 初始化K个聚类中心点(可以随机选取或者手动指定);
2. 对于每个数据点,计算其到每个聚类中心的距离,将其划分到距离最近的聚类中心所在的簇;
3. 根据簇内数据点的均值,更新聚类中心的位置;
4. 重复步骤2和步骤3,直到聚类中心的位置不再发生变化或者达到预设的迭代次数。
下面是一个Python实现KMeans算法的例子,你可以通过修改K值和数据集来观察聚类的效果:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义KMeans算法类
class KMeans:
def __init__(self, k=3, max_iter=100):
self.k = k # 聚类数量
self.max_iter = max_iter # 最大迭代次数
self.centroids = None # 聚类中心
# 计算欧几里得距离
def euclidean_distance(self, a, b):
return np.sqrt(np.sum((a - b) ** 2))
# 初始化聚类中心
def init_centroids(self, X):
self.centroids = X[np.random.choice(X.shape[0], self.k, replace=False)]
# 根据聚类中心对数据进行划分
def cluster_assignment(self, X):
clusters = [[] for _ in range(self.k)]
for i in range(X.shape[0]):
distances = [self.euclidean_distance(X[i], c) for c in self.centroids]
cluster = np.argmin(distances)
clusters[cluster].append(i)
return clusters
# 更新聚类中心
def update_centroids(self, X, clusters):
for i in range(self.k):
if len(clusters[i]) > 0:
self.centroids[i] = np.mean(X[clusters[i]], axis=0)
# KMeans算法主体
def fit(self, X):
self.init_centroids(X)
for i in range(self.max_iter):
old_centroids = np.copy(self.centroids)
clusters = self.cluster_assignment(X)
self.update_centroids(X, clusters)
if np.allclose(old_centroids, self.centroids):
break
# 可视化聚类结果
def plot_clusters(self, X, clusters):
colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']
for i in range(self.k):
plt.scatter(X[clusters[i], 0], X[clusters[i], 1], c=colors[i])
plt.scatter(self.centroids[i, 0], self.centroids[i, 1], marker='*', s=200, c='k')
plt.show()
# 生成测试数据集
X = np.vstack((np.random.randn(100, 2) + np.array([3, 3]), np.random.randn(100, 2) + np.array([-3, -3]), np.random.randn(100, 2) + np.array([-3, 3])))
np.random.shuffle(X)
# 调用KMeans算法进行聚类
kmeans = KMeans(k=3)
kmeans.fit(X)
clusters = kmeans.cluster_assignment(X)
# 可视化聚类结果
kmeans.plot_clusters(X, clusters)
```
在上述代码中,我们生成了一个包含300个数据点的测试数据集,其中前100个数据点来自于均值为(3,3)的正态分布,后100个数据点来自于均值为(-3,-3)的正态分布,剩下100个数据点来自于均值为(-3,3)的正态分布。我们将K值设为3,即将数据集分为3类。
运行上述代码,可以看到KMeans算法将数据集成功分为3类,并且聚类中心点分别位于三个聚类簇的中心位置。你可以尝试改变K值和数据集来观察不同的聚类效果。