kmeans聚类算法python代码不要调用包,可视化聚类图并加上k值得确定肘部图
时间: 2023-06-06 19:06:52 浏览: 140
基于肘部法的kmeans聚类优化,肘部法选址聚类参数(代码完整,数据齐全)
5星 · 资源好评率100%
对于您的问题,我可以提供以下代码示例,实现K-means聚类算法的Python实现,不调用包,可视化聚类图并加上K值得确定肘部图。
首先,我们需要导入NumPy和Matplotlib库,用来进行数据处理和可视化。
```python
import numpy as np
import matplotlib.pyplot as plt
```
接下来,我们可以生成一个随机数据集,用来演示聚类算法。这里我们生成100个数据点,每个数据点有两个特征值。
```python
np.random.seed(0)
X = np.random.randn(100, 2) * 2 + np.array([2, 2])
X = np.vstack((X, np.random.randn(100, 2) * 0.5 + np.array([-2, -2])))
X = np.vstack((X, np.random.randn(100, 2) * 0.5 + np.array([2, -2])))
```
接下来,我们可以定义K-means算法的主要函数。该函数接受两个参数:数据集X和聚类的个数K。算法的主要步骤如下:
1. 随机初始化K个质心。
2. 计算每个数据点与K个质心之间的距离,将每个数据点分配到距离最近的质心所在的簇。
3. 对于每个簇,重新计算该簇的质心。
4. 如果质心发生变化,重复步骤2-3,直到质心不再发生变化或者达到最大迭代次数。
```python
def kmeans(X, K, max_iters=100):
m, n = X.shape
centroids = X[np.random.choice(m, K, replace=False), :]
for i in range(max_iters):
indices = np.argmin(((X[:, :, np.newaxis] - centroids.T[np.newaxis, :, :]) ** 2).sum(axis=1), axis=1)
centroids_new = np.array([X[indices == k, :].mean(axis=0) for k in range(K)])
if np.allclose(centroids, centroids_new):
break
centroids = centroids_new
return centroids, indices
```
接下来,我们可以调用K-means函数,并将结果可视化出来。
```python
K = 3 # 聚类的个数
centroids, indices = kmeans(X, K)
# 可视化聚类结果
fig, ax = plt.subplots(figsize=(8, 6))
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k']
for k in range(K):
ax.scatter(X[indices == k, 0], X[indices == k, 1], c=colors[k], label='Cluster {}'.format(k + 1))
ax.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=200, linewidths=3, color='k')
ax.legend()
plt.show()
```
在聚类结果图上加上K值的确定肘部图如下:
```python
K = 8 # 聚类的个数
max_K = 10 # 最大聚类个数
distortions = []
for k in range(1, max_K + 1):
centroids, indices = kmeans(X, k)
distortion = np.sum(((X - centroids[indices, :]) ** 2).sum(axis=1))
distortions.append(distortion)
plt.plot(range(1, max_K + 1), distortions, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.show()
```
这里我们选择聚类个数从1到最大聚类个数,依次计算每个聚类对应的失真函数值,并将结果绘制成聚类个数-K值与失真函数值-肘部图的形式。
希望以上代码对您有所帮助。
阅读全文