当前位置: 首页 > news >正文

Kmeans聚类算法-python

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()

 

http://www.lryc.cn/news/39430.html

相关文章:

  • Linux|奇怪的知识|locate命令---文件管理小工具
  • Cadence Allegro 导出Function Pin Report报告详解
  • 蓝桥杯2018年第九题-缩位求和
  • 基于Yolv5s的口罩检测
  • Linux基本命令
  • 云原生场景下的安全左移
  • mysql面试经典问题
  • 微信小程序|基于小程序+C#制作一个考试答题小程序
  • 【1605. 给定行和列的和求可行矩阵】
  • Linux命令之nano命令
  • IT项目管理(作业1)
  • 蓝桥杯嵌入式(G4系列):串口收发
  • 「兔了个兔」玉兔踏青,纯CSS实现瑞兔日历(附源码)
  • 第17章 关于局部波动率的一些总结
  • 反转链表合并两个有序链表链表分割链表的回文结构相交链表
  • 联想触摸板只能单击,二指三指失效
  • mysql 删除表卡死,或是截断(truncate)卡死解决办法
  • ORACLE P6 EPPM 架构及套件介绍(源自Oracle Help)
  • Android开发面试:数据结构与算法知识答案精解
  • 京东前端手写面试题集锦
  • 【JDK动态代理】及【CGLib动态代理】:Java的两种动态代理方式
  • 《程序员面试金典(第6版)》面试题 04.05. 合法二叉搜索树
  • Nginx 反向代理技术梳理
  • 华为OD机试 - 整数编码(Java) | 机试题+算法思路+考点+代码解析 【2023】
  • 蓝桥杯冲击01 - 质数篇
  • 【WEB前端进阶之路】 HTML 全路线学习知识点梳理(下)
  • MySQL索引分类
  • 会声会影2023最新版图文安装详细教程
  • Java中的反射
  • STM32入门笔记(03):STM32F103C8T6定时器的输入捕获模式和编码器模式(SPL库函数版)