Kmeans聚类算法-python
创始人
2024-06-02 10:34:18
0

import random
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 计算欧拉距离
def calcDis(dataSet, centroids, k):
    clalist=[]
    for data in dataSet:
        diff = np.tile(data, (k, 1)) - centroids  #相减   (np.tile(a,(2,1))就是把a先沿x轴复制1倍,即没有复制,仍然是 [0,1,2]。 再把结果沿y方向复制2倍得到array([[0,1,2],[0,1,2]]))
        squaredDiff = diff ** 2     #平方
        squaredDist = np.sum(squaredDiff, axis=1)   #和  (axis=1表示行)
        distance = squaredDist ** 0.5  #开根号
        clalist.append(distance) 
    clalist = np.array(clalist)  #返回一个每个点到质点的距离len(dateSet)*k的数组
    return clalist

# 计算质心
def classify(dataSet, centroids, k):
    # 计算样本到质心的距离
    clalist = calcDis(dataSet, centroids, k)
    # 分组并计算新的质心
    minDistIndices = np.argmin(clalist, axis=1)    #axis=1 表示求出每行的最小值的下标
    newCentroids = pd.DataFrame(dataSet).groupby(minDistIndices).mean() #DataFramte(dataSet)对DataSet分组,groupby(min)按照min进行统计分类,mean()对分类结果求均值
    newCentroids = newCentroids.values
 
    # 计算变化量
    changed = newCentroids - centroids
 
    return changed, newCentroids

# 使用k-means分类
def kmeans(dataSet, k):
    # 随机取质心
    centroids = random.sample(dataSet, k)
    
    # 更新质心 直到变化量全为0
    changed, newCentroids = classify(dataSet, centroids, k)
    while np.any(changed != 0):
        changed, newCentroids = classify(dataSet, newCentroids, k)
 
    centroids = sorted(newCentroids.tolist())   #tolist()将矩阵转换成列表 sorted()排序
 
    # 根据质心计算每个集群
    cluster = []
    clalist = calcDis(dataSet, centroids, k) #调用欧拉距离
    minDistIndices = np.argmin(clalist, axis=1)  
    for i in range(k):
        cluster.append([])
    for i, j in enumerate(minDistIndices):   #enymerate()可同时遍历索引和遍历元素
        cluster[j].append(dataSet[i])
        
    return centroids, cluster
 
# 创建数据集
def createDataSet():
    return [[1, 1], [1, 2], [2, 1], [6, 4], [6, 3], [5, 4]]

if __name__=='__main__': 
    dataset = createDataSet()
    centroids, cluster = kmeans(dataset, 2)
    print('质心为:%s' % centroids)
    print('集群为:%s' % cluster)
    for i in range(len(dataset)):
      plt.scatter(dataset[i][0],dataset[i][1], marker = 'o',color = 'green', s = 40 ,label = '原始点')
                                                    #  记号形状       颜色      点的大小      设置标签
      for j in range(len(centroids)):
        plt.scatter(centroids[j][0],centroids[j][1],marker='x',color='red',s=50,label='质心')
        plt.show()

 

相关内容

热门资讯

我来教大家“东乡麻将辅助器ap... 您好,东乡麻将这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“熊猫正版辅助器ap... 您好,熊猫正版这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“乐星跑胡子辅助器a... 您好,乐星跑胡子这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中...
我来教大家“小闲54棋牌辅助器... 我来教大家“小闲54棋牌辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第...
我来教大家“闲逸游戏辅助器ap... 您好,闲逸游戏这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“六六内蒙麻将辅助器... 您好,六六内蒙麻将这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏...
我来教大家“wepoker俱乐... 亲,wepoker俱乐部这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,wepok...
我来教大家“天府麻舍辅助器ap... 我来教大家“天府麻舍辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“金钻棋牌辅助器ap... 我来教大家“金钻棋牌辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“瀚海麻将辅助器ap... 我来教大家“瀚海麻将辅助器app官方下载最新版本更新”详细分享开挂一、瀚海麻将AI软件牌型概率发牌机...
我来教大家“海浪手游辅助器ap... 亲,海浪手游这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,海浪手游的开挂软件,名...
我来教大家“若水欢乐麻将辅助器... 亲,若水欢乐麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,若水欢乐麻将的开挂...
我来教大家“决胜游戏辅助器ap... 亲,决胜游戏这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,决胜游戏的开挂软件,名...
我来教大家“红龙扑克辅助器ap... 您好,红龙扑克这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“天天松滋麻将辅助器... 我来教大家“天天松滋麻将辅助器app官方下载最新版本更新”详细分享开挂一、天天松滋麻将AI软件牌型概...
我来教大家“越记乡游辅助器ap... 您好,越记乡游这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“大发快三辅助器ap... 亲,大发快三这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,大发快三的开挂软件,名...
我来教大家“沐晖麻将辅助器ap... 我来教大家“沐晖麻将辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“桔子游玩辅助器ap... 您好,桔子游玩这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“滇麻圈辅助器app... 我来教大家“滇麻圈辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方神...