K-means聚类算法是一种无监督学习算法,用于将数据集中的数据按照不同的分组分成K类,每一类中的数据和其它类中的数据相似度较低。这个算法的应用场景非常广泛,比如在图像分割、网络流量分析、客户行为分析等领域里面都有应用。
K-means聚类算法的实现方法如下:
-
随机确定K个点作为初始的质心。
-
根据质心,将数据集中的所有点分成K类。分组原则为:距离某个质心更近的点分为同一类。
-
计算各个分组的质心。
-
利用新计算出的质心重新分组。
-
重复步骤3、4,直到完成分组。
下面是一个简单的代码实现:
import numpy as np
def k_means(data, k):
# 1. 随机初始化K个质心
centroids = generate_random_centroids(data, k)
iteration = 0
while True:
print(f"Iteration {iteration}")
# 2. 为每个数据点分组
groups = {}
for point in data:
group_id = find_nearest_centroid(point, centroids)
if group_id not in groups:
groups[group_id] = []
groups[group_id].append(point)
# 打印每个组包含的点数
for group_id, group in groups.items():
print(f"Group {group_id}: {len(group)} points.")
# 3. 重新计算质心
new_centroids = np.zeros((k, data.shape[1]))
for group_id, group in groups.items():
new_centroids[group_id] = np.mean(group, axis=0)
# 计算质心移动距离
dist = np.linalg.norm(new_centroids - centroids)
print(f"Centroid moved {dist}.")
# 4. 如果质心移动距离非常小,则停止聚类
if dist < 0.01:
break
centroids = new_centroids
iteration += 1
return centroids, groups
def find_nearest_centroid(point, centroids):
distances = np.linalg.norm(centroids - point, axis=1)
return np.argmin(distances)
def generate_random_centroids(data, k):
indices = np.random.choice(range(len(data)), k, replace=False)
return data[indices]
# 调用示例
data = np.random.rand(100, 2)
centroids, groups = k_means(data, k=3)
下面是一个使用K-means聚类算法实现图像分割的示例:
import cv2
import numpy as np
def k_means_image_segmentation(image, k):
# 将图像转换为二维坐标系的点
data = np.float32(image.reshape(-1, 3))
# 聚类
centroids, groups = k_means(data, k=k)
# 获取每个质心最接近的数据点,即为图像的分割区域
segmentations = []
for centroid in centroids:
distances = np.linalg.norm(data - centroid, axis=1)
indices = np.argsort(distances)[:100] # 取距离最近的100个点
segmentations.append(data[indices])
# 绘制分割结果
segmentations = np.uint8(segmentations)
res = np.zeros_like(image)
for i, segmentation in enumerate(segmentations):
mask = np.uint8(np.all(data == centroid[i], axis=1)).reshape(image.shape[:2])
res[mask] = np.uint8([segmentation[0]]) # 质心颜色作为分割结果
return res
# 调用示例
image = cv2.imread("example.jpg")
segmented_image = k_means_image_segmentation(image, k=3)
cv2.imshow("segmented image", segmented_image)
cv2.waitKey(0)
以上是K-means聚类算法的应用以及实现方法的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:K-means聚类算法的应用以及实现 - Python技术站