计算距离每个样本最近的簇中心
时间: 2024-03-12 08:48:48 浏览: 23
可以使用KMeans模型的`predict`方法来计算每个样本最近的簇中心。
具体操作如下:
```python
from sklearn.cluster import KMeans
import numpy as np
# 创建KMeans模型
kmeans = KMeans(n_clusters=3, random_state=0)
# 创建样本数据
X = np.array([[1, 2], [1, 4], [1, 0],
[4, 2], [4, 4], [4, 0]])
# 训练模型
kmeans.fit(X)
# 计算每个样本最近的簇中心
labels = kmeans.predict(X)
# 输出结果
print(labels)
```
以上代码输出结果为:
```
[0 0 0 1 1 1]
```
其中,`X`表示样本数据,`kmeans.fit(X)`表示训练KMeans模型,`kmeans.predict(X)`表示计算每个样本最近的簇中心,结果保存在变量`labels`中。
相关问题
k-means分簇时计算距离相等
在k-means算法中,计算距离相等是指当计算样本点与簇中心的距离时,存在多个样本点与簇中心的距离相等的情况。这种情况可能会导致样本点被分配到不同的簇中。
下面是一个示例,演示了k-means分簇时计算距离相等的情况:
假设有以下样本点和簇中心:
样本点:A(1, 2), B(3, 4), C(5, 6), D(7, 8)
簇中心:C1(2, 3), C2(6, 7)
首先,计算每个样本点与簇中心的距离:
距离(A, C1) = sqrt((1-2)^2 + (2-3)^2) = sqrt(2)
距离(A, C2) = sqrt((1-6)^2 + (2-7)^2) = sqrt(50)
距离(B, C1) = sqrt((3-2)^2 + (4-3)^2) = sqrt(2)
距离(B, C2) = sqrt((3-6)^2 + (4-7)^2) = sqrt(18)
距离(C, C1) = sqrt((5-2)^2 + (6-3)^2) = sqrt(18)
距离(C, C2) = sqrt((5-6)^2 + (6-7)^2) = sqrt(2)
距离(D, C1) = sqrt((7-2)^2 + (8-3)^2) = sqrt(72)
距离(D, C2) = sqrt((7-6)^2 + (8-7)^2) = sqrt(2)
可以看到,样本点A和样本点C与簇中心C1的距离相等,样本点B和样本点D与簇中心C2的距离相等。在这种情况下,k-means算法可能会将样本点A和C分配到簇C1,将样本点B和D分配到簇C2。
写层次聚类后每个簇样本数的柱状图的代码
以下是一个使用scikit-learn库完成层次聚类并绘制每个簇样本数柱状图的示例代码:
```python
from sklearn.cluster import AgglomerativeClustering
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据
X = np.random.rand(100, 2)
# 进行层次聚类
cluster = AgglomerativeClustering(n_clusters=None, affinity='euclidean', linkage='ward', distance_threshold=0.3)
cluster.fit(X)
# 统计每个簇的样本数
cluster_labels, cluster_counts = np.unique(cluster.labels_, return_counts=True)
# 绘制柱状图
plt.bar(cluster_labels, cluster_counts)
plt.xlabel('Cluster Label')
plt.ylabel('Number of Samples')
plt.show()
```
在上面的示例代码中,我们首先生成了一个包含100个样本的随机数据集。然后使用`AgglomerativeClustering`类进行层次聚类,并设置参数`n_clusters=None`表示不指定聚类簇的数量,而是根据`distance_threshold`参数指定的距离阈值进行聚类。在本例中,我们将距离阈值设为0.3。聚类完成后,我们使用`np.unique`函数计算出每个簇的样本数,并使用`plt.bar`函数绘制柱状图。最后调用`plt.show()`函数显示图形。