求两个点的欧几里得距离,并实现一个kmeans
时间: 2024-03-16 07:44:16 浏览: 15
好的,以下是两个点的欧几里得距离的Python代码实现:
```python
import numpy as np
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2)**2))
# 例子
x1 = np.array([1, 2, 3])
x2 = np.array([4, 5, 6])
distance = euclidean_distance(x1, x2)
print(distance) # 输出 5.196152422706632
```
接下来是KMeans算法的Python代码实现:
```python
class KMeans:
def __init__(self, n_clusters=8, max_iter=300, random_state=42):
self.n_clusters = n_clusters
self.max_iter = max_iter
self.random_state = random_state
def fit(self, X):
np.random.seed(self.random_state)
self.centroids = X[np.random.choice(X.shape[0], self.n_clusters, replace=False)]
for i in range(self.max_iter):
clusters = [[] for _ in range(self.n_clusters)]
for x in X:
distances = [euclidean_distance(x, c) for c in self.centroids]
cluster_idx = np.argmin(distances)
clusters[cluster_idx].append(x)
new_centroids = []
for cluster in clusters:
if cluster:
new_centroids.append(np.mean(cluster, axis=0))
else:
new_centroids.append(X[np.random.choice(X.shape[0])])
new_centroids = np.array(new_centroids)
if np.allclose(self.centroids, new_centroids):
break
self.centroids = new_centroids
def predict(self, X):
distances = np.apply_along_axis(lambda x: [euclidean_distance(x, c) for c in self.centroids], 1, X)
return np.argmin(distances, axis=1)
```
其中,`n_clusters` 表示要聚类的簇数,`max_iter` 表示最大迭代次数,`random_state` 表示随机数种子,`fit` 方法用于训练模型,`predict` 方法用于预测新样本所属的簇。在 `fit` 方法中,我们使用 `np.random.choice` 函数从样本中随机选择 `n_clusters` 个点作为初始的质心。在每一次迭代中,我们计算每个样本点与质心的距离,并将其归到距离最近的簇中。接着,我们更新每个簇的质心为该簇中所有样本点的平均值。如果新的质心与旧的质心非常接近,我们认为算法已经收敛,停止迭代。