python中k均值聚类画树状图
时间: 2023-08-31 17:12:32 浏览: 115
在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 random
class KMeans:
def __init__(self, k=3, max_iterations=500):
self.k = k
self.max_iterations = max_iterations
def fit(self, data):
self.centroids = self._initialize_centroids(data)
for i in range(self.max_iterations):
clusters = [[] for _ in range(self.k)]
for point in data:
distances = [np.linalg.norm(point - c) for c in self.centroids]
cluster_index = np.argmin(distances)
clusters[cluster_index].append(point)
prev_centroids = self.centroids
self.centroids = [np.average(cluster, axis=0) if cluster else prev_centroids[i] for i, cluster in enumerate(clusters)]
if np.all(prev_centroids == self.centroids):
break
def predict(self, data):
return np.argmin([np.linalg.norm(data - c) for c in self.centroids])
def _initialize_centroids(self, data):
indices = random.sample(range(len(data)), self.k)
return [data[i] for i in indices]
```
使用时,可以创建一个KMeans类的实例,并使用fit方法将数据拟合到模型中。然后可以使用predict方法对新数据进行聚类预测。
下面是使用示例:
```python
data = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
kmeans = KMeans(k=2)
kmeans.fit(data)
print(kmeans.centroids)
# 输出: [array([1., 2.]), array([4., 2.])]
print(kmeans.predict([0, 0]))
# 输出: 0
```
该示例使用了一个包含6个数据点的二维数据集,并使用k=2进行聚类。fit方法会将数据拟合到模型中,并计算出两个聚类的中心点。然后使用predict方法对新的数据点进行预测,输出它属于哪个聚类。
阅读全文