Python纯手写版本的KMeans算法实现,没有使用numpy库,使用matplotlib可视化测试

最优化方法——K-means实现手写数字图像聚类 本篇博客主要介绍K-means算法的原理与流程,降维算法的优化问题解决与使用,并分别使用Matlab、Pycharm分别实现了使用K-means算法在实际问题中(对MNIST手写数字数据集)的聚类并进行分析,并分别使用了PCA与LDA对其进行了降维可视化(内附数据集和python及matlab代码)。 阅读详情

Python纯手写版本的KMeans算法实现,没有使用numpy库,使用matplotlib可视化测试

import random
import matplotlib.pyplot as plt

class KMeans():

    def __init__(self, k=1):
        '''
        :param k: k代表分类数
        '''
        self.__k = k
        self.__data = []         # 存放原始数据
        self.__pointCenter = []  # 存放中心点,第一次获得的中心点通过随机方式在__data里随机出来
        self.__result = []       # 存放分类结果
        for i in range(k):
            self.__result.append([])  # [[],[],[],[],[]]
            pass
        pass

    def fit(self, data, threshold, times=50000):
        '''
        进行模型训练
        :param data: 训练数据
        :param threshold: 阈值,退出条件
        :return:
        '''
        self.__data = data
        self.randomCenter()
        print(self.__pointCenter)
        centerDistance = self.calPointCenterDistance(self.__pointCenter, self.__data)

        # 对原始数据进行分类,将每个点分到离它最近的中心点
        i = 0
        for temp in centerDistance:
            index = temp.index(min(temp))
            self.__result[index].append(self.__data[i])
            i += 1
            pass
        # 打印分类结果
        # print(self.__result)
        oldCenterPoint = self.__pointCenter
        newCenterPoint = self.calNewPointCenter(self.__result)

        while self.calCenterToCenterDistance(oldCenterPoint, newCenterPoint) > threshold:
            times -= 1
            result = []
            for i in range(self.__k):
                result.append([])
                pass
            # 保存上次的中心点
            oldCenterPoint = newCenterPoint
            centerDistance = self.calPointCenterDistance(newCenterPoint, self.__data)

            # 对原始数据进行分类,将每个点分到离它最近的中心点
            i = 0
            for temp in centerDistance:
                index = temp.index(min(temp))
                result[index].append(self.__data[i]) # result = [[[10,20]]]
                i += 1
                pass

            newCenterPoint = self.calNewPointCenter(result)
            print(self.calCenterToCenterDistance(oldCenterPoint, newCenterPoint))
            self.__result = result
            pass
        self.__pointCenter = newCenterPoint
        return newCenterPoint, self.__result
        pass

    def calCenterToCenterDistance(self, old, new):
        '''
        计算两次中心点之间的距离,求和求均值
        :param old: 上次的中心点
        :param new: 新计算的中心点
        :return:
        '''
        total = 0
        for point1, point2 in zip (old, new):
            total += self.distance(point1, point2)
            pass
        return total / len(old)
        pass

    def calPointCenterDistance(self, center, data):
        '''
        计算每个点和每个中心点之间的距离
        :return:
        '''
        centerDistance = []
        for temp in data:
            centerDistance.append([self.distance(temp, point) for point in center])
            pass
        print(centerDistance)
        return centerDistance
        pass

    def calNewPointCenter(self, result):
        '''
        计算新的中心点
        :param result:
        :return:
        '''
        newCenterPoint = []
        for temp in result:
            # 转置
            temps = [[temp[x][i] for x in range(len(temp)) ] for i in range(len(temp[0]))]
            point = []
            for t in temps:
                # 对每个维度求和,去平均
                point.append(sum(t)/len(t)) # mean
                pass
            newCenterPoint.append(point)
            pass
        print(newCenterPoint)
        return newCenterPoint
        pass

    def distance(self, point1, point2):
        '''
        计算两个点之间的距离,支持任意维度,欧式距离
        :param pointer1:
        :param pointer2:
        :return:
        '''
        distance = (sum([(x1 - x2)**2 for x1, x2 in zip(point1, point2)]))**0.5
        return distance
        pass

    def randomCenter(self):
        '''
        从原始的__data里随机出最开始进行计算的k个中心点
        :return:
        '''
        while len(self.__pointCenter) < self.__k:
            # 随机一个索引
            index = random.randint(0, len(self.__data) - 1)
            # 判断中心点是否重复,如果不重复,加入中心点列表
            if self.__data[index] not in self.__pointCenter:
                self.__pointCenter.append(self.__data[index])
                pass
            pass
        pass
    pass

if __name__ == "__main__":
    data = [[random.randint(1, 100), random.randint(1, 100)] for i in range(1000)]
    for i in range(10):
        kmeans = KMeans(k=5)
        centerPoint, result = kmeans.fit(data, 0.0001)
        print(centerPoint)
        plt.plot()
        plt.title("KMeans Classification")
        i = 0
        tempx = []
        tempy = []
        color = []
        for temp in result:
            temps = [[temp[x][i] for x in range(len(temp))] for i in range(len(temp[0]))]
            color += [i] * len(temps[0])
            tempx += temps[0]
            tempy += temps[1]

            i += 2
            pass
        plt.scatter(tempx, tempy, c=color, s=30)
        plt.show()
        pass
    pass
面试手撕代码-k-means算法 要求: 随机生成x,y均在[0,10]范围内的10个点,k=2,训练一个简单的k-means模型。 K均值算法步骤如下: 1.在训练样本点中随机初始化[0,10]范围内的k个样本点作为k个簇各自的中心; 2.遍历一遍所有样本点,将每一个样本点分配到最近的簇中心,得到clusterDict。clusterDict的键为centroidList的下标,键值为属于该类的所有样本点。 3.计算第... 阅读详情

相关推荐

Python实现K-means聚类算法,只使用python中的pandas和numpy库

只使用最基础的python语言,只是用基础的库包去实现机器学习算法,有助于读者理解各机器学习算法的原理,以及算法实现的整个步骤。这期带来K-means聚类算法的实现。k-means是一种最流行的聚类算法,属于无监督学习 ,可以在数据集分为相似的组(簇),使得组内数据相似度较高,组间之间的相似度较低。从样本中选择k个点作为初始簇中心。计算每一个样本到各个簇中心的距离,将样本划分到距离最近的簇中心所对应的簇中根据每个簇中的所有样本,重新计算簇中心,并更新。

weixin_54044641的博客 779

K-means算法的Python实现

K-means算法的基本思想以及python实现

Dong Hsueh 1711

python 实现周志华 机器学习书中 k-means 算法

hello,all 上节采用python实现了决策树,本节使用python实现k-means算法,后一节将会采用map-reduce实现k-means算法 算法程序如下: 算法代码如下: # coding=utf-8 import pprint import uniout import math from collections import Counter imp

小猪观察家 6937

【手撕机器学习系列】kmeans算法

重温《机器学习实战》,对其中的经典算法重新学习,发现又是另一种感受;才发现自己以前并没有真正理解,在数据结构算法的理解基础上,再来看机器学习算法,发现有一种异曲同工之妙,这才有了《手撕机器学习系列》的想法,让我们一起走进算法,在理解中认识算法,而不是简单的调包。 【手撕机器学习系列】kmeans算法 原理:(资源太多,这里不再赘述) 手撕代码: import math import random # 读取数据 def load_data(filename): dataSet = [] .

墨竹 1505

随记·手撕coding | kmeans

随记·手撕coding | kmeans

weixin_43646592的博客 301

KMeans++算法的Python实现与应用

htmltable {th, td {th {pre {简介:KMeans++算法改进了原始KMeans聚类的随机初始质心问题,通过特定的质心选取策略来提高聚类质量。Python中,可以利用NumPy、Pandas、Matplotlib和Scikit-learn库来辅助实现标准的KMeans算法,但KMeans++需要自定义实现其初始化步骤。实现步骤包括随机选择初始质心、计算数据点到已有质心的最短距离平方、概率分配与采样以选择新质心,直至达到K个质心。

weixin_42581846的博客 800

python手写kmeans算法,使用numpy库,使用matplotlib可视化测试

kmeans算法使用numpy库源代码: import random import matplotlib.pyplot as plt import numpy as np import time class KMeans(): def __init__(self, k=1): ''' :param k: k代表分类数 ''' ...

zhanglijie__1的博客 509

从零手写KMeans聚类算法:原理、实现与实战优化

聚类分析是机器学习中经典的无监督学习方法,其核心目标是将数据点划分为若干组,使得组内相似度高、组间差异大。KMeans算法作为最常用的聚类方法之一,基于期望最大化思想,通过迭代执行分配与更新步骤来最小化簇内平方和。该算法在客户分群、图像分割、异常检测等场景中具有重要应用价值。本文聚焦于KMeans算法的底层实现细节,深入探讨了KMeans++初始化策略对聚类效果的影响,并对比了DBSCAN等密度聚类算法的适用场景差异。通过纯NumPy手写实现,读者不仅能掌握距离度量、向量化计算等核心编程技巧,还能学习如何处

weixin_29063035的博客 265

kmeans算法python命令_Python中使用K-means算法

k-means是机器学习中最常用的聚类算法,关于k-means算法的数学原理、算法、伪码等已有相当丰富的文献,在此不再赘述。1、调用以下库importnumpyasnp#用于抽样和生成随机数fromsklearn.clusterimportKMeans#sklearn自带的Kmeans算法,用于严重本文算法结果是否正确importmatplotlib.pyplotas...

weixin_34701183的博客 1205

Ansys Zemax与Speos协同设计:从HUD光学优化到驾驶环境可视化全流程解析

本文深入解析了如何利用Ansys Zemax与Speos进行协同设计,实现从HUD光学系统核心优化到驾驶环境可视化验证的全流程。文章强调了HUD设计是光学性能与视觉感知的深度耦合,通过Zemax进行精密光学设计,再利用Speos进行系统级仿真与感知模拟,最终完成从虚拟到现实的闭环验证,有效提升HUD产品的开发效率与可靠性。

weixin_29199873的博客 241

zabbix 监控EMC存储

经过搜索,找到了脚本地址,该项目应该是模板原作者创建的,该项目也有zabbix模板,和上面的应该是相同的,我用的是上面的模板。./unity_get_state.py --api_ip='X.X.X.X' --api_port='443' --api_user='zabbix' --api_password='PASSWORD' --storage_name="zabbix web前端配置的主机名" --discovery。修改权限,给zabbix用户执行权限,模板调用时以zabbix用户执行。

wangyfde的专栏 3754

PSO 算法优化 KMeans 聚类:Python 实现与 2 个数据集性能评测

本文详细介绍了如何利用粒子群优化(PSO)算法改进传统KMeans聚类,通过Python实现并在Iris和Wine数据集上进行性能评测。PSO-KMeans混合模型有效解决了KMeans对初始质心敏感的缺陷,显著提升了聚类质量,同时提供了参数调优和工程实践建议。

weixin_34130389的博客 389

深度学习动画实战:用MotorNerve系统5步实现自然角色交互

本文详细介绍了如何利用腾讯游戏的MotorNerve系统,通过深度学习技术5步实现自然角色动画交互。从环境搭建、基础运动控制到交互过渡和行走转向优化,该系统能显著提升游戏动画制作效率,尤其适合中小团队替代昂贵的动捕方案。重点解析了骨骼动画配置、PFNN控制器使用及Blender工作流集成等核心技术。

book8的博客 685

从零手写机器学习算法:NumPy纯实现指南

机器学习算法本质是数学原理的程序化表达,其核心在于参数更新、梯度计算与数值稳定性等底层机制。理解线性回归的梯度下降、决策树的信息增益、神经网络的反向传播等概念,需穿透scikit-learn等封装库,直面矩阵运算、张量形状匹配与浮点精度控制等工程细节。这种‘白盒实现’不仅强化数学直觉,更培养对过拟合、梯度爆炸、维度不匹配等典型问题的调试敏感度,广泛应用于算法岗面试准备、嵌入式模型轻量化改造及教学演示等真实场景。

weixin_33910460的博客 511

Unity通过Vosk实现离线语音识别方法

以下是一个使用 Unity 和 Vosk(一个开源的离线语音识别库)的简单示例。将Vosk的DLL文件(如libvosk.dll、vosk.dll等)放入Assets/Plugins文件夹中。通过以上步骤,你可以在Unity中实现一个简单的离线语音识别功能。音频格式:确保录音的音频格式与Vosk模型要求的格式一致(通常是16kHz、16bit单声道)。首先,你需要下载Vosk的语音识别模型。在Assets文件夹中创建一个Plugins文件夹,用于存放Vosk的DLL文件。打开Unity并创建一个新的项目。

qq_39515892的博客 2070

深度探索:非线性随机森林(Nonlinear Random Forest,NL-RF)原理及应用

非线性随机森林(NL-RF)旨在通过结合集成方法与高级技术来捕捉和建模数据中的非线性关系,从而改善传统随机森林在处理复杂非线性数据结构时的表现。

qq_51320133的博客 2064

手工实现k-means算法

k-means算法实现

weixin_43811239的博客 2818

Claude Code 实战指南:用 AI 玩转终端编程,效率狂飙!

本文介绍了终端 AI 代理工具 Claude Code,涵盖常用命令、使用方法(如 init 初始化、权限配置、工作流程、上下文管理)、MCP 扩展工具及实战案例,展示其通过自然语言辅助开发的高效性与实用性。

个人技术 1万+

python 3d绘图kmeans_Python使用matplotlib绘制三维参数曲线操作示例

本文实例讲述了Python使用matplotlib绘制三维参数曲线操作。分享给大家供大家参考,具体如下:一 代码import matplotlib as mplfrom mpl_toolkits.mplot3d importAxes3Dimport numpy as npimport matplotlib.pyplot as pltmpl.rcParams['legend.fontsize']=1...

weixin_39637920的博客 398

基于STM32 HAL库的L298N四驱电机PWM调速与方向控制实战

本文详细介绍了基于STM32 HAL库驱动L298N电机控制板实现四驱小车PWM调速与方向控制的实战方法。涵盖硬件连接、GPIO与定时器配置、PWM生成、方向控制逻辑及电源管理等核心内容,并提供代码优化与常见问题解决方案,帮助开发者快速实现高效稳定的电机控制。

jump7的博客 222

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023年7月,瑞士洛桑联邦理工学院的Hongkeng Zhu和Elison Matioli在《IEEE Transactions on Power Electronics》期刊发表文章,提出了一种稳态测量方法,用于研究氮化镓(GaN)高电子迁移率晶体管(HEMT)的动态导通电阻(Ron)。实验结果显示,商业GaN器件在稳态下的动态Ron变化显著,稳定时间可达数分钟且与电压相关。传统的脉冲测量方法由于测试时间不足,可能导致结果不准确。该

荷塘阅色 1376

python的安装包有多大_python有多少个包

1、 Import 函数 from 库,往后可以直接使用 函数 import库,要使用函数则需 库.函数。2、 %matplotlib inline是jupyter notebook里的命令, 意思是将那些用matplotlib绘制的图显示在页面里而不是弹出一个窗口3、 用图形表示回归效果可以采用横坐标为实际值,纵坐标为预测值(采用横坐标的标定作为标定)则预测点越集中在y=x坐标线上则回...

weixin_39854326的博客 905

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

kmeans聚类

k-means:基于划分算法的典型、实现比较简单。特点是只能聚球形、受离群点的影响很大。 采用python实现:用二维矩阵来存点集和质心点、每次循环分两步:计算质心和重新分配点,循环直到最小平方误差SSE收敛为止,或者指定一个最大的迭代次数。 关于画图,我使用的是pylab和Matplotlib,Matplotlib中的很多函数和matlab用法一样,比较方便作图,安装它时花了很长的时间来解决

messiandzcy的专栏 1682

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Apache Ossie 可分解性一次讲透:为什么你的指标没法安全地预聚合

Apache Ossie 是 Apache 旗下的开源语义元数据规范,为分析、AI 与 BI 平台之间的交换提供厂商中立的单一事实来源。本文讲清它聚合函数的可分解性(Decomposability)分类——判断一个指标能不能拆开并行计算、再合并。 ## 痛点:你建的预聚合表,在部分函数上是错的 订单表有上亿行,运维说"先按天预聚合,查询时直接合并预聚合结果,别每次扫明细"。这个方案在部分函数上

gitblog_01019的博客 440

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python使用opencv图像聚类_opencv python K-Means聚类

cv2.kmeans(data, K, bestLabels, criteria, attempts, flags[, centers]) -> retval, bestLabels, centersdata: np.float32数据类型,每个功能应该放在一个列中nclusters(K):集群数bestLabels:预设的分类标签:没有的话 Nonecriteria:它是迭代终止标准,满足...

weixin_39841709的博客 271

我的kmeans聚类 python代码

仿制matlab的kmeans聚类 http://blog.youkuaiyun.com/nbu2004/article/details/43084999注意 data 是list类型,但二维array类型也没问题。比起MATLAB,Python只能更简单,即使没有MATLAB矩阵表达式。# -*- coding: utf-8 -*- # import copy import numpy as np i

神圣代码部落 993
上一篇: Java入门基础:Java多态考题解析之一(那些年的Java多态考题)
下一篇: Python快速排序的手写实现(quiksort,分别使用最后一个和第一个元素作为分界值)
猿说猿道
博客等级 码龄8年 120粉丝 55原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值