请给出k-means算法的测试代码
时间: 2023-09-09 20:05:04 浏览: 148
### 回答1:
以下是用 Python 实现的 k-means 算法的样例代码:
```
import numpy as np
import matplotlib.pyplot as plt
def init_centroids(X, k):
m, n = X.shape
centroids = np.zeros((k, n))
idx = np.random.randint(0, m, k)
for i in range(k):
centroids[i,:] = X[idx[i],:]
return centroids
def find_closest_centroids(X, centroids):
m = X.shape[0]
k = centroids.shape[0]
idx = np.zeros(m)
for i in range(m):
min_dist = 1000000
for j in range(k):
dist = np.sum((X[i,:] - centroids[j,:]) ** 2)
if dist < min_dist:
min_dist = dist
idx[i] = j
return idx
def compute_centroids(X, idx, k):
m, n = X.shape
centroids = np.zeros((k, n))
for i in range(k):
indices = np.where(idx == i)
centroids[i,:] = (np.sum(X[indices,:], axis=0) / len(indices[0])).ravel()
return centroids
def run_k_means(X, initial_centroids, max_iters):
m, n = X.shape
k = initial_centroids.shape[0]
idx = np.zeros(m)
centroids = initial_centroids
for i in range(max_iters):
idx = find_closest_centroids(X, centroids)
centroids = compute_centroids(X, idx, k)
return idx, centroids
def plot_data_points(X, idx, k):
for i in range(X.shape[0]):
plt.scatter(X[i, 0], X[i, 1], c=colors[int(idx[i])])
plt.show()
def plot_centroids(centroids, previous, idx, K, i):
plt.scatter(previous[:, 0], previous[:, 1], c='b', marker='x')
plt.scatter(centroids[:, 0], centroids[:, 1], c='r', marker='x')
for j in range(centroids.shape[0]):
plt.scatter(centroids[j, 0], centroids[j, 1], c=colors[j], marker='x')
plt.title('Iteration number {}'.format(i))
plt.show()
data = np.loadtxt('data.txt', delimiter=',')
X = data[:, :-1]
### 回答2:
以下是一段伪代码,用于说明k-means算法的基本实现:
```
import numpy as np
def k_means(data, k, max_iter):
# 随机选择k个初始中心点
centroids = random_init(data, k)
for iteration in range(max_iter):
# 分配样本到最近的中心点
clusters = assign_samples(data, centroids)
# 更新中心点为每个簇的均值
centroids = update_centroids(data, clusters, k)
return clusters, centroids
def random_init(data, k):
# 从数据中随机选择k个点作为初始中心点
indices = np.random.choice(len(data), k, replace=False)
centroids = data[indices]
return centroids
def assign_samples(data, centroids):
# 将每个样本分配到最近的中心点
clusters = np.zeros(len(data))
for i, x in enumerate(data):
distances = np.linalg.norm(x - centroids, axis=1)
cluster = np.argmin(distances)
clusters[i] = cluster
return clusters
def update_centroids(data, clusters, k):
# 计算每个簇的均值作为新的中心点
centroids = np.zeros((k, data.shape[1]))
for cluster in range(k):
indices = np.where(clusters == cluster)
points = data[indices]
centroids[cluster] = np.mean(points, axis=0)
return centroids
```
此代码实现了k-means算法的基本步骤:随机选择初始中心点,分配样本到最近的中心点,更新中心点为每个簇的均值。该算法迭代固定次数,直到收敛。请注意,此代码仅为说明用途,实际上可能需要对输入数据进行预处理、设置收敛条件等。完整的测试代码取决于具体问题和数据集,以上只给出了算法的核心部分。
### 回答3:
以下是一个简单的k-means算法的测试代码:
'''
import numpy as np
from sklearn.cluster import KMeans
# 生成随机数据集
X = np.random.rand(100, 2)
# 定义k-means算法模型
kmeans = KMeans(n_clusters=3)
# 拟合数据,并进行聚类
kmeans.fit(X)
# 聚类结果
labels = kmeans.labels_
# 聚类中心
centers = kmeans.cluster_centers_
# 输出聚类结果和聚类中心
print("聚类结果:")
print(labels)
print("\n聚类中心:")
print(centers)
'''
这段代码首先生成了一个100x2的随机数据集(即二维数据),然后定义了一个k-means算法模型,并指定聚类个数为3。接着使用fit函数对数据进行聚类。最后通过labels属性获取聚类结果,通过cluster_centers_属性获取聚类中心,并输出结果。
请注意,上述代码使用了sklearn库的KMeans类来实现k-means算法。在实际使用中,可以根据需要调整参数,例如聚类个数、随机种子等。同时,为了更好地理解k-means算法的原理和流程,也可以尝试手动实现k-means算法。
阅读全文