K-Means++代码实现

news/2024/5/2 14:19:43/文章来源:https://blog.csdn.net/qq_43629083/article/details/128198222

K-Means++代码实现

数据集
https://download.csdn.net/download/qq_43629083/87246495

import pandas as pd
import numpy as np
import random
import math
%matplotlib inline
from matplotlib import pyplot as plt# 按文件名读取整个文件
data = pd.read_csv('data.csv')
class MyKmeansPlusPlus:def __init__(self, k, max_iter = 10):self.k = k# 最大迭代次数self.max_iter = max_iter# 训练集self.data_set = None# 结果集self.labels = None'''计算两点间的欧拉距离'''def euler_distance(self, point1, point2):distance = 0.0for a, b in zip(point1, point2):distance += math.pow(a - b, 2)return math.sqrt(distance)'''计算样本中的每一个样本点与已经初始化的聚类中心之间的距离,并选择其中最短的距离'''def nearest_distance(self, point, cluster_centers):min_distance = math.infdim = np.shape(cluster_centers)[0]for i in range(dim):# 计算point与每个聚类中心的距离distance = self.euler_distance(point, cluster_centers[i])# 选择最短距离if distance < min_distance:min_distance = distancereturn min_distance'''初始化k个聚类中心'''def get_centers(self):dim_m, dim_n = np.shape(self.data_set)cluster_centers = np.array(np.zeros(shape = (self.k, dim_n)))#随机初始化第一个聚类中心点index = np.random.randint(0, dim_m)cluster_centers[0] = self.data_set[index]# 初始化一个距离序列distances = [0.0 for _ in range(dim_m)]for i in range(1, self.k):print("i = ", i)sum_all = 0.0for j in range(dim_m):# 对每一个样本找到最近的聚类中心点distances[j] = self.nearest_distance(self.data_set[j], cluster_centers[0:i])# 将所有最短距离相加sum_all += distances[j]# 取得sum_all之间的随机值sum_all *= random.random()# 以概率获得距离最远的样本点作为聚类中心for id, dist in enumerate(distances):sum_all -= distif sum_all > 0:continuecluster_centers[i] = self.data_set[id]break;return cluster_centers'''确定非中心点与哪个中心点最近'''def get_closest_index(self, point, centers):# 初始值设为最大min_dist = math.inflabel = -1# enumerate() 函数同时列出数据和数据下标for i, center in enumerate(centers):dist = self.euler_distance(center, point)if dist < min_dist:min_dist = distlabel = ireturn label'''更新中心点'''def update_centers(self):# k类点分别存points_label = [[] for i in range(self.k)]for i, label in enumerate(self.labels):points_label[label].append(self.data_set[i])centers = []for i in range(self.k):centers.append(np.mean(points_label[i], axis = 0))return centers'''判断是否停止迭代,新中心点与旧中心点一致或者达到设置的迭代最大值则停止'''def stop_iter(self, old_centers, centers, step):if step > self.max_iter:return Truereturn np.array_equal(old_centers, centers)'''模型训练'''def fit(self, data_set):self.data_set = data_set.drop(['labels'], axis = 1)self.data_set = np.array(self.data_set)point_num = np.shape(data_set)[0]# 初始化结果集self.labels = data_set.loc[:, 'labels']self.labels = np.array(self.labels)# 初始化k个聚类中心点centers = self.get_centers()# 保存上一次迭代的中心点old_centers = []# 当前迭代次数step = 0flag = Falsewhile not flag:# 存储 旧的中心点old_centers = np.copy(centers)# 迭代次数+1step += 1print("current iteration: ", step)print("current centers: ", old_centers)# 本次迭代 各个点所属类别(即该点与哪个中心点最近)for i, point in enumerate(self.data_set):self.labels[i] = self.get_closest_index(point, centers)# 更新中心点centers = self.update_centers()# 迭代是否停止的标志flag = self.stop_iter(old_centers, centers, step)centers = np.array(centers)fig = plt.figure()label0 = plt.scatter(self.data_set[:, 0][self.labels == 0], self.data_set[:, 1][self.labels == 0])label1 = plt.scatter(self.data_set[:, 0][self.labels == 1], self.data_set[:, 1][self.labels == 1])label2 = plt.scatter(self.data_set[:, 0][self.labels == 2], self.data_set[:, 1][self.labels == 2])plt.scatter(old_centers[:, 0], old_centers[:, 1], marker='^', edgecolor='black', s=128)plt.title('labeled data')plt.xlabel('V1')plt.ylabel('V2')plt.legend((label0, label1, label2), ('label0', 'label1', 'label2'))plt.show()
myKmeansPP = MyKmeansPlusPlus(3)
myKmeansPP.fit(data)

current iteration: 1
current centers:
[[55.97659 75.71833 ]
[43.75808 67.45812 ]
[71.72321 -7.872746]]

请添加图片描述

current iteration: 2
current centers:
[[55.83404759 70.21560931]
[30.35261288 47.71518861]
[50.15798861 -5.34769581]]

请添加图片描述

current iteration: 3
current centers:
[[47.66230967 65.1238036 ]
[22.93488 39.05383154]
[52.52023009 -6.18734425]]

请添加图片描述

current iteration: 4
current centers:
[[42.96329079 61.70702396]
[12.28521822 20.36196405]
[63.73622886 -9.02914858]]

请添加图片描述

current iteration: 5
current centers:
[[ 40.8388755 59.95703427]
[ 9.62033389 11.15366963]
[ 69.77599323 -10.09654797]]

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_231280.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学编程:Python入门考级必备[11]

目录 1.查找字符串 2.字符串的格式化 3.字符串的转义字符 \ \" 4. 修改字符串 5.字符串连接与分割 附件代码&#xff1a; 炼 知识模块(11) 名符其实--字符串 1.查找字符串 # 1.1用 in 函数 a aa in acacacacaabaac print(a) # 1.2 用index 找不到就报错 b h…

民办二本程序员阿里、百度、平安等五厂面经,5 份 offer(含真题)

昨天小休&#xff0c;一位高中同学联系了我&#xff0c;说是要请我吃饭&#xff0c;有这种好事&#xff0c;我当然是毫不犹豫的答应了啦&#xff01; 等等...会不会是找我借钱的&#xff1f; 好慌&#xff0c;怎么办&#xff1f;已经答应过去了。 在后面的交谈中&#xff0c;…

Odoo丨如何在明细行中添加复选框?

最近&#xff0c;在项目实际业务中遇到需要对明细订单添加复选框和按钮进行操作的需求。 起初在拿到需求时&#xff0c;我联想到Odoo默认tree视图是有复选框和操作按钮的功能&#xff0c;于是查看了源码&#xff0c;确认了这个想法。 因为这个是属于字段中one2many 关系属性来…

三车道交通流元胞自动机研究(matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

中国电信移动物联网发展成果与创新实践 ,干货满满

近日&#xff0c;首届移动物联网大会&#xff08;2022&#xff09;&#xff08;以下简称“大会”&#xff09;在江苏省无锡市举办。本次大会由工信部指导&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;、中国通信学会、无锡市人民政府、人民邮…

大数据学习:进程管理

文章目录一、进程ID&#xff08;PID&#xff09;二、查看进程1、进程查看命令-ps&#xff08;1&#xff09;命令作用&#xff08;2&#xff09;参数说明&#xff08;3&#xff09;操作案例2、Linux进程状态3、观察进程变化命令 -top&#xff08;1&#xff09;参数选项&#xff…

超声功率放大器在MEMS超声测试中的应用

MEMS&#xff08;微机电系统&#xff09;技术的不断发展&#xff0c;目前已经广泛应用在生物、航空、医学、航天等多领域。MEMS传感器即微机电系统&#xff08;Micro-electroMechanicalSystems&#xff09;&#xff0c;是指精密机械系统和微电子电路技术结合发展出来的一项工程…

【正点原子FPGA连载】第二十八章 以太网ARP测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十八章 以太…

【C++11多线程】线程同步之线程互斥:mutex、lock_guard

文章目录1.mutex2.锁双重判断3.lock_guard4.unique_lockunique_lock的构造函数1.mutex 头文件 #include <mutex> mutex 是一个类&#xff0c;其源码如下图所示。 互斥锁其实就是一个类对象&#xff0c;多个线程尝试用成员函数 lock() 来加锁&#xff0c;只有一个线程能…

自定义HandlerMethodArgumentResolver如何注册到springmvc框架里的

目录 1.DEBUG 注册代码 1.1 WebMvcConfigurerComposite 1.2 DelegatingWebMvcConfiguration 1.3 AutowiredAnnotationBeanPostProcessor 2.DEBUG调用代码 2.1 this.argumentResolvers 日常工作开发中&#xff0c;总有一些参数&#xff0c;在未传参数时&#xff0c;需要自定…

Web3中文|马斯克也疯狂?网红AI “ChatGPT”有多火?

一个名为“ChatGPT”的网红AI竟写出了毁灭人类的计划书。 计划书的步骤详细到入侵各国计算机系统、控制武器、破坏通讯、交通系统等等。和电影里的情节一模一样&#xff0c;甚至ChatGPT还给出了相应的Python代码。 诱导ChatGPT写下该计划的是一位名为扎克德纳姆&#xff08;Z…

计算机网络-网络层:IP协议

目录 一、IP协议格式 二、IP地址管理 1.动态地址分配&组建私网 1.1 动态地址分配DHCP 1.2 NAT技术组建私网 2. 早期网络划分方式 3. 当前网络划分方式CIDR方案 4. 特殊IP地址 5. 公网与私网&#xff08;外网与内网&#xff09; 6. 路由选择 网络层&#xff1a;负…

【win11内存占用高优化】未运行程序,系统内存占用50以上

这里写自定义目录标题前言打开控制面板找到电源键功能找到快速启动选项&#xff0c;取消勾选&#xff0c;确定win X以管理员身份打开powershell输入如下命令&#xff0c;回车关闭终端完成前言 windows11在未运行任何其他程序的情况下&#xff0c;内存占用超50%&#xff0c;可…

深入浅出java nio

Buffer 缓冲 为什么需要缓冲&#xff1f; 思考&#xff1a;没有buffer之前的读写。 子类 常见类型的缓冲 ByteBuffer public abstract class ByteBufferextends Bufferimplements Comparable<ByteBuffer> {}ByteBuffer是抽象类无法直接实例化&#xff0c;可以通过all…

研究 | CT图像迭代重建算法研究进展

上次讲到我实现了一下代数迭代重建&#xff08;ART&#xff09;&#xff0c;到周六开会的时候才大概了解了我的研究方向应该是统计迭代重建&#xff0c;一下子就把我给搞懵了。按照书上的说法&#xff0c;统计迭代法是在发射型CT&#xff08;SPECT和PET&#xff09;中应用广泛&…

[附源码]计算机毕业设计勤工俭学管理小程序Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Docker学习4-常用命令之重要的容器命令

本文是Docker学习系列教程中的第四篇。本文是Docker常用命令中的重要命令。为什么说重要呢&#xff1f;因为这些命令&#xff0c;在以后开发过程中&#xff0c;会经常使用到。比如&#xff1a;怎么查看容器中运行的日志&#xff1f;怎么查看容器运行的进程&#xff1f;怎么导出…

【安全测试】渗透测试神器BurpSuite环境搭建

工欲善其事&#xff0c;必先利其器&#xff0c;要想更好的进行安全测试&#xff0c;就需要有一个趁手的工具&#xff0c;BurpSuite就是一个不错的选择&#xff0c;是广大安全测试工程师的必备工具&#xff0c;今天就带着大家把这个工具给装上&#xff0c;开启大家的安全测试之旅…

引擎入门 | Unity UI简介–第2部分(5)

本期我们继续为大家进行Unity UI简介&#xff08;第二部分&#xff09;的后续教程 本篇内容 9.设置动画对话框 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第二部分&#xff09;篇幅较长&#xff0c;分为八篇&#xff0c;本篇为第五篇。 9.设置动画对…

【信息检索与数据挖掘期末复习】(五)Language Model

什么是语言模型&#xff1f; 一个传统的语言生成模型可以用于识别或生成字符串 我们可以将有穷自动机看作是一种确定性的语言模型 基本模型&#xff1a;每一个文档都是通过一个像这样的自动机生成的&#xff0c;只不过这种自动机是有概率的 一种最简单的语言模型等价于一个…