k-means算法理解与图像分割

本文介绍了k-means算法的基础知识,包括算法步骤和在wine数据集上的应用。讨论了算法的优缺点,如对离群点敏感、k值选择问题以及对初始聚类中心的依赖。此外,还提到了k-means在图像分割中的应用,特别是在像素聚类上的作用。通过PIL和sklearn库实现了图像分割,但指出初始质心选择对结果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式识别的课程作业,要求实现一个k-means算法,并深入分析.不知道为什么老师讲的算法名字叫c-means.(课程报告仅供参考,避免全部一样)

k-means算法介绍

kmeans算法又名k均值算法。其算法思想大致为:先从样本集中随机选取 k 个样本作为簇中心,并计算所有样本与这 k 个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。

根据以上描述,可以得出算法的基本步骤:

  • 初始化常数K,随机选取初始点为质心
  • while : 直到质心不再改变
    • 计算样本与每个质心之间的相似度,
    • 将样本归类到最相似的类中
    • 重新计算质心
  • 输出最终的质心以及每个类
import numpy as np
import matplotlib.pyplot as plt
import random

#加载数据
def loadData(filename):
    dataSet = []
    with open(filename) as fr:
        for l in fr.readlines():
            indata = l.strip().split('\t')
            dataSet.append([float(x) for x in indata])
    dataSet = np.array(dataSet)
    return dataSet

#欧式距离
def disEclud(vec1, vec2):
    return ((vec1 - vec2) ** 2).sum(axis = 1) ** 0.5

#初始化类心
def initCent(dataSet, k):
    m, n = np.shape(dataSet)
    centroids = dataSet[random.sample(range(m), k)]
    return centroids

def kMeans(dataSet, k):
    m = dataSet.shape[0]
    #类心
    centroids = initCent(dataSet, k)
    #分类
    clusterAssment = np.zeros(m)
    clusterChange = np.array(centroids)
    while True:
        for i in range(m):
            dis = disEclud(dataSet[i], centroids)
            clusterAssment[i] = dis.argmin()
        for cent in range(k):
            centroids[cent] = dataSet[np.where(clusterAssment == cent)].mean(axis = 0)
        if (centroids == clusterChange).all():
            break
        else:
            clusterChange = np.array(centroids)
            continue
    return cen
运用K-means算法进行图像分割, K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。 k个初始类聚类中心点的选取对聚类结果具有较大的 公式 公式 影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,J的值没有发生变化,说明算法已经收敛。 算法过程如下: 1)从N个文档随机选取K个文档作为质心 2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 3)重新计算已经得到的各个类的质心 4)迭代2~3步直至新的质心原质心相等或小于指定阈值,算法结束 具体如下: 输入:k, data[n]; (1) 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1]; (2) 对于data[0]….data[n],分别c[0]…c[k-1]比较,假定c[i]差值最少,就标记为i; (3) 对于所有标记为i点,重新计算c[i]={ 所有标记为i的data[j]之和}/标记为i的个数; (4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值。 折叠工作原理 K-MEANS算法的工作原理及流程 K-MEANS算法 输入:聚类个数k,以及包含 n个数据对象的数据库。 输出:满足方差最小标准的k个聚类。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值