给出使用欧氏距离的k-means算法
时间: 2023-09-04 12:10:56 浏览: 138
基于Java(UI)实现欧式距离的聚类算法的Kmeans作业【100011723】
欧氏距离的k-means算法是一种常见的聚类算法,可以用于将数据点划分为k个簇。下面是使用欧氏距离的k-means算法的步骤:
1. 随机选择k个点作为初始质心。
2. 对于每个数据点,计算其与k个质心的欧氏距离,将其归为距离最近的质心所在的簇。
3. 对于每个簇,重新计算其质心的位置,即取簇中所有数据点的平均值作为新的质心。
4. 重复步骤2和步骤3,直到质心位置不再发生变化或达到最大迭代次数。
下面是一个使用Python实现欧氏距离的k-means算法的示例代码:
```python
import numpy as np
def euclidean_distance(x1, x2):
"""
计算两个数据点之间的欧氏距离
"""
return np.sqrt(np.sum((x1 - x2) ** 2))
class KMeans:
def __init__(self, k=3, max_iters=100, random_state=None):
self.k = k
self.max_iters = max_iters
self.random_state = random_state
self.centroids = None
self.labels = None
def fit(self, X):
np.random.seed(self.random_state)
# 随机选择k个点作为初始质心
self.centroids = X[np.random.choice(X.shape[0], size=self.k, replace=False)]
for i in range(self.max_iters):
# 计算每个数据点到质心的欧氏距离
distances = np.zeros((X.shape[0], self.k))
for j in range(self.k):
distances[:, j] = np.apply_along_axis(euclidean_distance, 1, X, self.centroids[j])
# 将每个数据点归为距离最近的质心所在的簇
self.labels = np.argmin(distances, axis=1)
# 重新计算每个簇的质心位置
for j in range(self.k):
self.centroids[j] = np.mean(X[self.labels == j], axis=0)
return self
def predict(self, X):
distances = np.zeros((X.shape[0], self.k))
for j in range(self.k):
distances[:, j] = np.apply_along_axis(euclidean_distance, 1, X, self.centroids[j])
return np.argmin(distances, axis=1)
```
阅读全文