• 技术文章 >Python技术 >Python基础教程

    Python K-means算法的计算步骤

    小妮浅浅小妮浅浅2021-08-26 10:18:19原创4044

    步骤说明

    1、确定K值。

    决定数据聚为几类,K值是K-Means算法中唯一的参数。

    2、从原始数据集中随机选择K个点作为初始均值点。

    3、依次从原始数据集中取出数据。

    每取出一个数据就和K个均值点分别计算距离(默认计算点间的欧氏距离),和谁更近就归为这个均值点所在的簇;

    4、分别计算各簇当前的均值点。

    即求该簇中所有点的平均值

    5、比较当前的均值点和上一步得到的均值点是否相同。

    如果相同,则K-Means算法结束,否则,将当前的均值点替换掉之前的均值点,然后重新划分族,重复步骤三。

    实例

    import numpy as np
    import matplotlib.pyplot as plt
     
    '''标志位统计递归运行次数'''
    flag = 0
     
    '''欧式距离'''
    def ecludDist(x, y):
        return np.sqrt(sum(np.square(np.array(x) - np.array(y))))
     
    '''曼哈顿距离'''
    def manhattanDist(x, y):
        return np.sum(np.abs(x - y))
     
    '''夹角余弦'''
    def cos(x, y):
        return np.dot(x, y)/(np.linalg.norm(x) * np.linalg.norm(y))
     
    '''计算簇的均值点'''
    def clusterMean(dataset):
        return sum(np.array(dataset)) / len(dataset)
     
    '''生成随机均值点'''
    def randCenter(dataset, k):
        temp = []
        while len(temp) < k:
            index = np.random.randint(0, len(dataset)-1)
            if  index not in temp:
                temp.append(index)
        return np.array([dataset[i] for i in temp])
     
    '''以数据集的前k个点为均值点'''
    def orderCenter(dataset, k):
        return np.array([dataset[i] for i in range(k)])
     
    '''聚类'''
    def kMeans(dataset, dist, center, k):
        global flag
        #all_kinds用于存放中间计算结果
        all_kinds = []
        for _ in range(k):
            temp = []
            all_kinds.append(temp)
        #计算每个点到各均值点的距离  
        for i in dataset:
            temp = []
            for j in center:
                temp.append(dist(i, j))
            all_kinds[temp.index(min(temp))].append(i)
        #打印中间结果    
        for i in range(k):
            print('第'+str(i)+'组:', all_kinds[i], end='\n')
        flag += 1
        print('************************迭代'+str(flag)+'次***************************')
        #更新均值点
        center_ = np.array([clusterMean(i) for i in all_kinds])
        if (center_ == center).all():
            print('结束')
            for i in range(k):
                print('第'+str(i)+'组均值点:', center_[i], end='\n')
                plt.scatter([j[0] for j in all_kinds[i]], [j[1] for j in all_kinds[i]], marker='*')
            plt.grid()
            plt.show()
        else:
            #递归调用kMeans函数
            center = center_
            kMeans(dataset, dist, center, k)
     
    def main(k):
        '''生成随机点'''
        x = [np.random.randint(0, 50) for _ in range(50)]
        y = [np.random.randint(0, 50) for _ in range(50)]
        points = [[i,j] for i, j in zip(x, y)]
        plt.plot(x, y, 'b.')
        plt.show()
        initial_center = randCenter(dataset=points, k=k)
        kMeans(dataset=points, dist=ecludDist, center=initial_center, k=k)
     
    if __name__ == '__main__':
        main(3)

    以上就是Python K-means算法的计算步骤,希望对大家有所帮助。更多Python学习指路:python基础教程

    本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。

    专题推荐:python k-means算法
    上一篇:Python kmeans聚类的使用 下一篇:Python默认值的使用注意

    相关文章推荐

    • python列表数据如何增加和删除• python解释器的多种使用• python字符串的用法总结• python中有哪些比较操作• python中os.path.join()函数是什么• python数据结构堆的介绍• python参数调用的注意点• python有哪些注释的种类• python自定义日志如何实现• python如何使用skimage包提取图像• python os.path.join()函数的使用• python confusion_matrix()是什么• python Pandas读取数据文件的优点• python异常中常见关键字• python中in和is的区分• Python3.1中的特性有哪些• python中__new__的重写• python如何解决初始化执行次数• python错误类型捕获的方法• python抛出raise异常的注意点• python异常的传递• python模块的搜索顺序分析• python__name__ 属性的使用注意• Python psd-tools如何转换文件• Python列表操作方法的整理• Python字符串方法如何使用• Python字典常用方法汇总• Python中os模块的功能介绍• Python curses库如何使用

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网