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

    Python K-means算法的计算步骤

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

    步骤说明

    1、确定K值。

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

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

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

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

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

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

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

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

    实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    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学习网