k-means python代码
时间: 2023-08-29 17:06:45 浏览: 97
### 回答1:
下面是一个简单的使用Python实现的K-Means算法的代码:
```
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(0)
X = np.random.randn(100, 2)
# 初始化聚类中心
k = 3
centers = X[:k, :]
# 迭代更新聚类中心
while True:
# 计算每个样本与聚类中心的距离
distances = np.sqrt(((X - centers[:, np.newaxis]) ** 2).sum(axis=2))
# 分配样本到最近的聚类中心
labels = distances.argmin(axis=0)
# 更新聚类中心
new_centers = np.array([X[labels == i].mean(axis=0) for i in range(k)])
# 判断是否收敛
if np.all(centers == new_centers):
break
centers = new_centers
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=200, c='r')
plt.show()
```
上述代码中,我们首先生成了一个二维的随机数据集X,然后初始化了三个聚类中心,接着进行了迭代更新聚类中心的过程,直到聚类中心不再变化为止。最后,我们用matplotlib库将聚类结果可视化出来。
### 回答2:
K-means是一种常用的聚类算法,它通过将数据样本分配给K个不同的聚类中心,以使样本与所属聚类中心的距离之和最小化。以下是一个简单的K-means算法的Python代码示例:
```python
import numpy as np
from sklearn.cluster import KMeans
# 创建样本数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
# 定义K-means模型
kmeans = KMeans(n_clusters=2, random_state=0)
# 训练模型
kmeans.fit(X)
# 获取聚类中心
centroids = kmeans.cluster_centers_
# 输出每个样本所属的聚类
labels = kmeans.labels_
# 打印结果
print('聚类中心:', centroids)
print('每个样本的聚类:', labels)
```
上述代码中,我们首先导入所需的库,然后定义了一个包含6个样本数据的矩阵X。接下来,我们创建了一个K-means聚类模型,其中n_clusters参数设置为2,表示我们希望将样本聚类成两个簇。然后,我们使用fit方法训练模型,并通过cluster_centers_属性获取聚类中心的坐标。最后,我们通过labels_属性获取每个样本所属的聚类簇的标签。
运行代码后,我们会得到类似以下的输出结果:
```
聚类中心: [[1. 2.]
[4. 2.]]
每个样本的聚类: [0 1 0 0 1 0]
```
说明了样本的聚类中心分别是[1, 2]和[4, 2],每个样本所属的聚类分别是0、1、0、0、1、0。
### 回答3:
k-means是一种常用的聚类算法,可以对数据进行分类。下面是一个基于Python实现的简单的k-means代码示例:
```python
import numpy as np
def kmeans(X, k, max_iters=100):
n_samples, n_features = X.shape
# 随机初始化k个簇中心
centroids = X[np.random.choice(n_samples, k, replace=False)]
for _ in range(max_iters):
# 为每个样本找到最近的簇中心
distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=-1)
labels = np.argmin(distances, axis=1)
# 更新簇中心为每个簇中样本的均值
new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(k)])
# 如果簇中心没有变化,停止迭代
if np.all(centroids == new_centroids):
break
centroids = new_centroids
return labels
# 示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
k = 2
# 调用k-means算法
labels = kmeans(X, k)
print(labels)
```
该代码首先随机初始化k个簇中心,然后通过迭代的方式进行更新。在每次迭代中,首先计算每个样本到所有簇中心的欧式距离,然后为每个样本分配最近的簇标签。接下来,更新每个簇的中心为该簇中所有样本的均值。如果簇中心没有变化,则停止迭代。最后,返回每个样本所属的簇标签。
在示例代码中,我们使用一个简单的2维数据作为示例。调用`kmeans`函数进行聚类,并打印每个样本所属的簇标签。运行代码后可以看到输出结果为`[0 0 0 1 1 1]`,表示前三个样本属于第一个簇,后三个样本属于第二个簇。
阅读全文