【基础】MATLAB中的图像分割:使用K均值聚类进行图像分割
发布时间: 2024-05-21 15:56:00 阅读量: 118 订阅数: 197
# 2.1 K均值聚类算法原理
K均值聚类算法是一种无监督学习算法,它将数据点划分为K个簇。算法的原理是:
* **初始化:**随机选择K个数据点作为初始簇中心。
* **分配:**将每个数据点分配到距离最近的簇中心。
* **更新:**计算每个簇中所有数据点的平均值,并将其作为新的簇中心。
* **重复:**重复分配和更新步骤,直到簇中心不再发生变化或达到预定义的迭代次数。
最终,算法将数据点划分为K个簇,每个簇由距离其簇中心最近的数据点组成。
# 2. K均值聚类算法
### 2.1 K均值聚类算法原理
K均值聚类算法是一种无监督学习算法,用于将数据点划分到K个簇中。其目标是找到一组簇中心,使得每个数据点到其最近簇中心的距离之和最小。
**算法原理:**
1. **初始化:**随机选择K个数据点作为初始簇中心。
2. **分配:**将每个数据点分配到距离最近的簇中心。
3. **更新:**重新计算每个簇的中心,作为簇中所有数据点的平均值。
4. **重复:**重复步骤2和3,直到簇中心不再发生变化或达到最大迭代次数。
### 2.2 K均值聚类算法步骤
**步骤:**
1. **确定K值:**确定要划分的簇数。
2. **初始化簇中心:**随机选择K个数据点作为初始簇中心。
3. **计算距离:**计算每个数据点到每个簇中心的距离。
4. **分配簇:**将每个数据点分配到距离最近的簇中心。
5. **更新簇中心:**重新计算每个簇的中心,作为簇中所有数据点的平均值。
6. **重复:**重复步骤3-5,直到簇中心不再发生变化或达到最大迭代次数。
**代码块:**
```python
import numpy as np
import matplotlib.pyplot as plt
# 数据点
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
# K值
K = 2
# 初始化簇中心
centroids = np.array([[1, 2], [9, 10]])
# 距离计算函数
def distance(x, y):
return np.linalg.norm(x - y)
# 簇分配函数
def assign_cluster(data, centroids):
clusters = np.zeros(len(data))
for i in range(len(data)):
distances = [distance(data[i], centroid) for centroid in centroids]
clusters[i] = np.argmin(distances)
return clusters
# 簇中心更新函数
def update_centroids(data, clusters, K):
new_centroids = np.zeros((K, 2))
for i in range(K):
cluster_data = data[clusters == i]
new_centroids[i] = np.mean(cluster_data, axis=0)
return new_centroids
# 迭代次数
max_iterations = 10
# 迭代
for i in range(max_iterations):
clusters = assign_cluster(data, centroids)
centroids = update_centroids(data, clusters, K)
# 可视化
plt.scatter(data[:, 0], data[:, 1], c=clusters)
plt.scatter(centroids[:, 0], centroids[:, 1], c='r', marker='x')
plt.show()
```
**代码逻辑分析:**
* **初始化:**随机初始化K个
0
0