【K-means聚类】

K-means聚类python代码实现

      • 聚类
      • k-means聚类代码

聚类

定义:聚类是一种无监督的机器学习方法,它的主要目的是将数据集中的对象(或点)按照它们之间的相似性分组或聚类。这些聚类(或称为簇)中的对象在某种度量下是相似的,而不同聚类中的对象是不同的。简言之,聚类是将相似的对象归为一类,不同的对象归为不同的类。
常用的聚类方法及其确定和适用场景比较:

K-means聚类:

确定:基于距离的聚类,目标是使每个数据点到其所属簇的中心的距离之和最小。
适用场景:适用于球形簇,且簇的大小和形状相对接近的情况。
层次聚类:

确定:按照层次结构对数据进行聚类,可以是自底向上的(凝聚)或自顶向下的(分裂)。
适用场景:适用于各种形状和大小的簇,但需要更多的计算资源。
DBSCAN:

确定:基于密度的聚类,可以找到任意形状的簇,并可以处理噪声数据。
适用场景:适用于密度不均的簇和具有噪声的数据集。
谱聚类:

确定:基于图理论的聚类,将数据视为图中的节点,相似度视为边的权重,然后在图上执行聚类。
适用场景:适用于非凸形状的数据集和高维数据。
K-means聚类的原理和步骤:

原理:

K-means聚类是基于距离的聚类方法,其主要目标是使每个数据点到其所属簇的中心的距离之和最小。
在给定的数据集中,选择K个初始点作为簇的中心。
对于每个数据点,将其分配给最近的簇中心。
重新计算每个簇的中心(即簇内所有点的均值)。
重复步骤2和3,直到簇的中心不再发生变化或变化很小。
步骤:

初始化:选择K个数据点作为初始的簇中心。
分配步骤:对于每个数据点,计算它到各个簇中心的距离,并将其分配给最近的簇。
更新步骤:对于每个簇,重新计算其中心(即簇内所有点的均值)。
迭代:重复步骤2和3,直到满足停止条件(如簇的中心不再发生变化或变化很小,或达到预定的迭代次数)。
需要注意的是,K-means聚类方法对于初始簇中心的选择很敏感,不同的初始选择可能导致不同的聚类结果。此外,K-means只能发现球形的簇,并且需要提前指定簇的数量K。

k-means聚类代码

k-means 实现

from sklearn.cluster import KMeans
import numpy as np# 示例数据
data = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])# 创建KMeans对象,设置聚类数为2
kmeans = KMeans(n_clusters=2)# 拟合数据
kmeans.fit(data)# 预测数据的类别
labels = kmeans.predict(data)print("聚类结果:", labels)

应用:

from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
import osdef z_score(arr, threshold=3):mean = np.mean(arr)std_dev = np.std(arr)print('std_dev:', std_dev)z_scores = [(x - mean) / std_dev for x in arr]print('z_scores: ', z_scores)outliers = [i for i, z in enumerate(z_scores) if abs(z) > threshold]return outliersdef _kmeans(x, file):# global fileprefix, suffix = os.path.splitext(file)data = xn_clusters = 3kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(data)for i in range(n_clusters):plt.scatter(data[kmeans.labels_ == i, 0], data[kmeans.labels_ == i, 1], label=f'cluster{i}')# 聚类中心plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', color='red', label='cluster center')print(kmeans.cluster_centers_)print(np.bincount(kmeans.labels_))id_count_list = list(np.bincount(kmeans.labels_))y_center_list = list(kmeans.cluster_centers_[:, 0])y_center_list_c = y_center_list.copy()sorted_y_list = sorted(y_center_list_c, reverse=True)max_count_index = id_count_list.index(max(id_count_list))y_calib_value = sorted_y_list[len(sorted_y_list)//2]value_index = y_center_list.index(y_calib_value)# 校正值,不一定在类别列表的中心front_value, end_value = sorted_y_list[len(sorted_y_list)//2 -1], sorted_y_list[len(sorted_y_list)//2 +1]front_index, end_index = y_center_list.index(front_value), y_center_list.index(end_value)pitch_list = [kmeans.cluster_centers_[:, 1][end_index], kmeans.cluster_centers_[:, 1][value_index], kmeans.cluster_centers_[:, 1][front_index]]print(pitch_list)# flag_list = z_score(pitch_list)flag = True# 比较法if len(pitch_list)==3:diff0 = np.abs(pitch_list[0]- pitch_list[1])diff1 = np.abs(pitch_list[0]- pitch_list[2])diff3 = np.abs(pitch_list[1]- pitch_list[2])thresh = 10if np.abs(diff3- diff0)>thresh or np.abs(diff3- diff1)> thresh:flag = Falsepitch_calib, yaw_calib = None, None if value_index== max_count_index and flag:yaw_calib, pitch_calib = kmeans.cluster_centers_[max_count_index]print(yaw_calib.item())print(pitch_calib.item())# print(roll_calib.item())else:print('需再次采集数据标定')   print('=========', file) plt.legend()plt.title(file)# plt.show()plt.savefig('runs/onnx_infer/'+ prefix+ '.png')plt.savefig('runs/pred/kmeans.png')plt.close()return pitch_calib, yaw_calibif __name__ == '__main__':# 分析數據,得到校正值file_path = r'/home/'files = os.listdir(file_path)files = [item  for item in files if item.endswith('.txt')]for file in files:pt_list = []with open(os.path.join(file_path, file), 'r') as f:lines = f.read().splitlines()for line in lines:line = line.split()line = [float(item) for item in line]pt = [line[3], line[2]]pt_list.append(pt)x = np.array(pt_list)# 输入为[yaw, pitch] 二维数组pitch_calib, yaw_calib = _kmeans(x, file)

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

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

相关文章

Docker技术仓库

数据卷 为什么用数据卷? 宿主机无法直接访问容器中的文件容器中的文件没有持久化,导致容器删除后,文件数据也随之消失容器之间也无法直接访问互相的文件 为解决这些问题,docker加入了数据卷机制,能很好解决上面问题…

FPGA模块——IIC接口设计

FPGA模块——IIC接口设计 IIC协议IIC接口代码应用IIC接口的代码 IIC协议 IIC接口代码 module iic_drive#(parameter P_ADDR_WIDTH 16 )( input i_clk ,//模块输入时钟input i_rs…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第八天-高级驱动framebuffer(物联技术666)

链接:https://pan.baidu.com/s/1cd7LOSAvmPgVRPAyuMX7Fg?pwd1688 提取码:1688 帧缓冲(framebuffer)设备应用于linux显示技术方面。因为linux的显示平台已经全部基于framebuffer,所以目前在linux环境下开发图形化界面…

python opencv图像模糊

目录 一:均值滤波 二:高斯滤波 三:中值滤波 四:双边滤波 在OpenCV中,模糊图片或进行图像平滑处理时常用的方法包括以下几种: 均值滤波 (Blurring): 均值滤波是一种简单的平滑方法,它通过对图像中每个像素的邻域内像素值进行平均来计算新的像素值。在OpenC

ABC341 题解

ABC341 题解 A Description 给定一个数 N N N,求长度 2 N 1 2N1 2N1 的 01 交替的字符串(0 开始)。 Solution 直接模拟,注意 0-index 是 i m o d 2 i\bmod 2 imod2,1-index 是 ( i 1 ) m o d 2 (i1) \bmod …

js-Vue Router 中的方法,父A-子B-子C依次返回,无法返回到A,BC中形成循环跳转解决

1.常用的方法 在 Vue Router 中,有一些常用的方法用于实现路由导航和管理。以下是一些常见的 Vue Router 方法及其作用: push: router.push(location, onComplete, onAbort) 作用:向路由历史记录中添加一个新条目,并导航到指定的路…

算法-位运算

题目&#xff1a;题目5 一个数组中有一种数出现K次&#xff0c;其他数都出现了M次&#xff0c; M > 1, K < M 找到&#xff0c;出现了K次的数&#xff0c; 要求&#xff0c;额外空间复杂度O(1)&#xff0c;时间复杂度O(N) 思路&#xff1a;遍历数组按位计数&#xff0c;不…

SRS关闭无人观看的流

这里需要使用到SRS自身自带的钩子回调功能&#xff0c;配置文件中有标注&#xff1a; Hook函数&#xff1a; 分为on_publish、on_play、on_stop、on_unpublish、on_dvr等类别&#xff1b; 其中主要介绍on_play、on_stop on_play&#xff1a; 主要用于用户在对srs拉流进行播…

十六进制数

1.做一个收电费程序&#xff0c;要求输入使用的电的度数&#xff08;整数&#xff09;以及电费单价&#xff08;实数&#xff09;&#xff0c;输出总的用电费用。 2.提示并输入一个小写字母数据&#xff0c;输出其对应的ASCII值&#xff0c;以及该小写字母对应的大写字母。 3.提…

Spring设计模式之工厂模式创建Bean对象

BeanFactory和Application是Spring容器中创建和管理Bean对象的接口&#xff0c;但是它们的实现方式不同。 BeanFactory&#xff1a; BeanFactory采用延迟初始化策略&#xff0c;只有应用程序向容器请求特定的Bean时才创建该Bean对象。它的启动速度很快&#xff0c;但在程序运…

MySQL、Redis、Nginx配置优化

文章目录 一、MySQL二、Redis三、Nginx 一、MySQL mysql.cnf [mysqld] binlog_cache_size 128K thread_stack 256K join_buffer_size 2048K max_heap_table_size 512Mdefault_storage_engine InnoDB performance_schema_max_table_instances 400 table_definition_cach…

leetcode hot100组合综合四

本题中&#xff0c;是要求nums中求的总和为target的排列数&#xff0c;因为题中说了&#xff0c;元素顺序不同&#xff0c;则可以视为不同的结果之一。 所以&#xff0c;根据对背包问题的总结&#xff0c;本题中元素可以重复使用&#xff0c;是完全背包并且需要求排列数&#…

.net 微服务 服务保护 自动重试 Polly

1. 概要 实验服务保护&#xff0c;自动重新连接功能。 2.代码 2.1 重复工具 using Polly; using Polly.Retry; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks;namespace WebApplication2 {pu…

c# DotNetty

对于 .NET 开发者来说&#xff0c;DotNetty 是一个开源、高性能的网络库&#xff0c;它是对 Java 平台上流行的 Netty 异步事件驱动网络应用程序框架的一个端口。DotNetty 适用于创建各种网络应用程序&#xff0c;如 IoT (物联网)、游戏服务器以及消息传递系统等。 以下是对 Do…

Redis之缓存击穿问题解决方案

文章目录 一、书接上文二、介绍三、解决方案1. 单例双检锁2. 缓存预热和定时任务 一、书接上文 Redis之缓存雪崩问题解决方案 二、介绍 缓存击穿就是大量并发访问同一个热点数据&#xff0c;一旦这个热点数据缓存失效&#xff0c;则请求压力都来到数据库。 三、解决方案 1…

Redis命令和Redisson对象匹配列表

大家好&#xff0c;Redisson系列再发一文。 多克创新国庆福利继续发&#xff0c;有需要的可以前往官网了解详情&#xff01;&#xff01;&#xff01; Redis命令Redisson对象方法AUTHConfig.setPassword();APPENDRBinaryStream.getOutputStream().write()BITCOUNTRBitSet.ca…

嵌入式Qt 计算器核心算法_1

一.表达式分离算法分析 二.分离算法实现 QCalculatorDec.cpp #include "QCalculatorDec.h"#include <QDebug>QCalculatorDec::QCalculatorDec() {m_exp "";m_result "";QQueue<QString> r split("9.11 ( -3 - 1 ) * -5 &…

C#,整数转为短字符串(Short string)的加解密算法与源代码

1 整数转为短字符串的应用 网站生成的动态 URL 往往以内容序列号id为标识与参数&#xff0c;比如&#xff1a; http://www.jerry.com/tom.aspx?id1 使用 Web Rewrite&#xff0c;可以实现网页静态化&#xff0c;称为&#xff1a; http://www.jerry.com/content/1.html 对…

数学家的趣闻轶事15则

目录 前言趣闻轶事15则参考文献 前言 有人的地方就有江湖&#xff0c;有江湖的地方就有故事。数学本身就是一个江湖&#xff0c;这个江湖也充满着血雨腥风和侠骨柔情&#xff0c;至今流传着各种各样的传说&#xff0c;其中不乏”马踏江湖潇潇事“&#xff0c;也有"何当共…

Centos安装图形化桌面环境

1.使用root远程登录最小化安装的虚拟机 2.执行命令yum groupinstall "X Window System" 这是安装窗口系统 3.执行命令yum grouplist" 检查安装的软件可可以安装的软件 4.执行命令yum groupinstall "Server with GUI" 这是安装图形化界面 5.执行命令sy…