python中k均值聚类画树状图
时间: 2023-08-31 09:12:32 浏览: 57
在Python中,可以使用`scipy`和`matplotlib`库来绘制K均值聚类的树状图。下面是一个简单的示例代码:
```python
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 生成数据
X = [[2, 4], [3, 3], [3, 5], [4, 7], [5, 6], [5, 8], [6, 7], [7, 9], [8, 7], [9, 6]]
# 使用Ward方法进行层次聚类
Z = linkage(X, 'ward')
# 绘制树状图
plt.figure(figsize=(10, 5))
dendrogram(Z)
plt.show()
```
运行上述代码将会得到一个树状图,其中每个叶子节点表示一个数据点,而非叶子节点表示不同的聚类。你可以根据需要调整绘图的大小、字体大小等参数来美化树状图。
相关问题
python中利用K均值聚类算法实现图像压缩
K 均值聚类算法可以用来实现图像压缩。以下是一个 Python 实现的图像压缩代码示例:
```python
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
def compress_image(image_path, k):
"""
使用 K 均值聚类算法压缩图像
:param image_path: 图像文件路径
:param k: 聚类数
:return: 压缩后的图像对象
"""
# 打开图像并转换为 numpy 数组
image = Image.open(image_path)
data = np.asarray(image, dtype=np.float32)
# 将图像数据归一化到 [0, 1]
data /= 255.0
# 将图像数据转换为二维数组
height, width, channels = data.shape
data = data.reshape(height * width, channels)
# 运行 K 均值聚类算法
labels, centers = k_means_clustering(data, k)
# 将每个像素点的颜色替换为其所属类别的中心颜色
compressed_data = centers[labels]
# 将压缩后的数据转换为三维数组
compressed_data = compressed_data.reshape(height, width, channels)
# 将数据归一化到 [0, 255] 并转换为整数类型
compressed_data *= 255.0
compressed_data = compressed_data.astype(np.uint8)
# 创建压缩后的图像对象
compressed_image = Image.fromarray(compressed_data)
return compressed_image
```
该函数接受一个字符串 `image_path` 和一个整数 `k`,返回一个压缩后的图像对象。该函数首先打开图像文件并将其转换为一个二维 numpy 数组 `data`,其中每行表示一个像素点的颜色。然后将图像数据归一化到 [0, 1]。接下来,运行 K 均值聚类算法,得到每个像素点所属的类别和类中心。将每个像素点的颜色替换为其所属类别的中心颜色,并将压缩后的数据转换为三维数组,其中第一维和第二维是图像的高度和宽度,第三维是颜色通道数。最后,将压缩后的数据归一化到 [0, 255] 并转换为整数类型,创建一个压缩后的图像对象并返回。
使用python实现k均值聚类
以下是使用Python实现k均值聚类的示例代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成数据集
np.random.seed(123)
X = np.random.randn(50, 2)
# 定义k均值聚类算法
def k_means(X, k, max_iters=100):
# 随机选择k个聚类中心
centroids = X[np.random.choice(X.shape[0], k, replace=False)]
for i in range(max_iters):
# 计算每个样本到聚类中心的距离
distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
# 分配样本到最近的聚类中心
labels = np.argmin(distances, axis=0)
# 更新聚类中心
new_centroids = np.array([X[labels == j].mean(axis=0) for j in range(k)])
# 如果聚类中心不再变化,则停止迭代
if np.allclose(centroids, new_centroids):
break
centroids = new_centroids
return centroids, labels
# 聚类并可视化结果
centroids, labels = k_means(X, k=3)
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
```
在本例中,我们使用numpy和matplotlib库生成和可视化数据集。然后,我们定义了一个k_means函数来实现k均值聚类算法。在函数中,我们首先随机选择k个聚类中心,然后在循环中进行以下步骤:
1. 计算每个样本到聚类中心的距离;
2. 分配样本到最近的聚类中心;
3. 更新聚类中心。
在每次循环后,我们检查聚类中心是否发生变化。如果聚类中心不再变化,则停止迭代。
最后,我们调用k_means函数并使用matplotlib库可视化聚类结果。