KMeans,KNN,Mean-shift算法的学习

1.KMeans算法是什么?

在没有标准标签的情况下,以空间的k个节点为中心进行聚类,对最靠近他们的对象进行归类。

2.KMeans公式:

2. 1.关键分为三个部分:
1.一开始会定义n个中心点,然后计算各数据点与中心点的距离dist(xi,ujt)
2. 判断数据点属于哪一类:主要看当前数据点离哪一个中心点的距离最近
3.所有数据点分类完后,需要
更新各个类的中心点
,然后不断重复1,2操作直至中心点不再变化
中心点更新=1/k(当前区域的节点数)*(当前区域节点xi之和)
在这里插入图片描述
2.2.KMeans均值聚类的图像展示:
在这里插入图片描述

3.KNN算法

3.1.KNN算法是什么?

**1.概念:**给定一共训练数据集,对输入的新的数据实例A,在数据集上寻找和A实例最邻近的K各实例(K个邻居),然后这K个实例的多数属于某个类,那么这个A实例就属于该这个类中;
2.认识: 因为新实例的数据的判别,和它的K个邻居关系很大,所以我们需要知道K个邻居的正确标签,因此KNN算法是一个监督式学习的算法;
在这里插入图片描述

3.2.例子:

在这里插入图片描述

4.均值漂移聚类算法(Mean-shift)

4.1是什么?

KMeans算法需要一开始定义n个类别(n个中心点),但是如果数据量越来越大,类别越来越多时KMeans已经无法满足当前需求了。而均值漂移算法是一个基于密度梯度上升的聚类算法(沿着密度梯度上升,从而寻找聚类中心点)
因此Mean-shift是一个无监督学习算法。

4.2公式:

1.计算均值偏移:M(x)偏移量=1/K*(当前中心点和其余数据点的距离之和)
2.中心点的更新:新的中心点=旧的中心点+M(x)偏移量
在这里插入图片描述

4.3 均值漂移算法的流程:

**KMeans算法:*一开始定义n个中心类,然后根据与中心类的距离进行数据点的归类,并重复以上操作直至中心点不再变化(中心点=1/K(xi之和));
**Mean-shift算法:*随机找一个点作为中心点A,并定义半径r,找出与A距离在r内的所有节点记为集合S——>计算偏移量中心节点的均值偏移量(1/K(u-xi)),不断移动中心点A直至收敛
在这里插入图片描述

5.KMeans算法实战:

1.概念: 本质是一个非监督学习的聚类算法,也就是说不需要提供标签,它会以空间K个中心点进行聚类,对最靠近他们的对象进行归类。
2.过程: 1.首先KM = KMeans(n_clusters=3, random_state=0)选择中心点个数——>2.然后根据各个数据datai中心点距离确定各个datai所属的类别——>3.不断更新聚类中心(1/K*(xi之和))【k为每个区域的节点个数,xi为该区域的节点】直至中心点不再变化

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score

# 1.读取数据进行预览
data = pd.read_csv('D:/pythonDATA/data.csv')
data.head()
# 2.定义X和y
X = data.drop(['labels'], axis=1)
y = data.loc[:, 'labels']
y.head()
pd.value_counts(y)  # 查看label类别数(0,1,2)
# 3.根据给定的正确的标签进行分类
fig1 = plt.figure()
label0 = plt.scatter(X.loc[:, 'V1'][y == 0], X.loc[:, 'V2'][y == 0])
label1 = plt.scatter(X.loc[:, 'V1'][y == 1], X.loc[:, 'V2'][y == 1])
label2 = plt.scatter(X.loc[:, 'V1'][y == 2], X.loc[:, 'V2'][y == 2])

plt.title('labeled data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.legend((label0, label1, label2), ('label0', 'label1', 'label2'))
# 4.建立Kmeans模型:需要指定中心节点数3个
KM = KMeans(n_clusters=3, random_state=0)
KM.fit(X)
# 5.输出中心节点信息,并画出中心点
centers = KM.cluster_centers_
print("中心点信息:")
print(centers)
plt.scatter(centers[:, 0], centers[:, 1])
plt.show()
y_predict = KM.predict(X)

# 矫正结果
y_corrected = []
for i in y_predict:
    if i == 0:
        y_corrected.append(2)
    elif i == 1:
        y_corrected.append(1)
    else:
        y_corrected.append(0)
print(pd.value_counts(y_corrected), pd.value_counts(y))
# 预测模型
accuracy = accuracy_score(y, y_corrected)
print(accuracy)

在这里插入图片描述

6.KNN算法的实战

1.概念: 本质上是一个监督学习算法,数据需要提供正确的标签。
2.过程: 根据输入的数据实例寻找该实例最近的K个实例——>如果这K个实例的大多数属于A类,那么这个新输入的实例就属于A类
3.缺点: 1.需要指定K邻居数量,且需要给数据附上标签;2.没有中心节点

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import silhouette_score
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# 1. 读取数据进行预览
data = pd.read_csv('D:/pythonDATA/data.csv')
data.head()

# 2. 定义X和y
X = data.drop(['labels'], axis=1)
y = data.loc[:, 'labels']

# 3. 使用KNN算法进行聚类
k = 3  # 设定簇的数量
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X, y)

# 4. 预测每个样本所属的簇
y_predict = knn.predict(X)
y_predict = np.array(y_predict)
print(y_predict)

# 5. 评估聚类结果
silhouette_avg = silhouette_score(X, y_predict)
print("Silhouette Score:", silhouette_avg)

# 6. 画图(KNN不提供聚类中心,因此无法画出中心点)
label0 = plt.scatter(X.loc[:, 'V1'][y_predict == 0], X.loc[:, 'V2'][y_predict == 0])
label1 = plt.scatter(X.loc[:, 'V1'][y_predict == 1], X.loc[:, 'V2'][y_predict == 1])
label2 = plt.scatter(X.loc[:, 'V1'][y_predict == 2], X.loc[:, 'V2'][y_predict == 2])
plt.legend((label0, label1, label2), ('label0', 'label1', 'label2'))
plt.title("KNN Clustering")
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()
y_predict_test = knn.predict([[80, 60]])
print(y_predict_test)

在这里插入图片描述

7.MeanShift算法的实战:

1.概念: 与KMeans算法一样是一个非监督学习算法,无需提供数据标签,也无需像KMeans算法一样提前定义中心节点的个数。
2.过程: 首先随机选一个没有分类的点作为中心点**(初始化)——>然后找出中心点A距离在r内的所有点,记为集合S (生成集合)——>再然后就是计算中心点A到集合S内每个元素的偏移量M(x) (确定方向)——>不断进行节点的更新并聚合直到所有的点都不再移动或者移动的距离小于一个设定的阈值(生成聚类)**
3.公式: 1.计算均值偏移:M(x)=1/K*(当前中心点和其余数据的距离差之和) ——>2.中心点的更新:新的中心点=旧的中心点+M(x) 偏移量
在这里插入图片描述

from sklearn.cluster import MeanShift, estimate_bandwidth
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from sklearn.metrics import silhouette_score

# 1.读取数据进行预览
data = pd.read_csv('D:/pythonDATA/data.csv')
data.head()

# 2.定义X
X = data.drop(['labels'], axis=1)
y = data.loc[:, 'labels']

# 3.使用MeanShift算法进行聚类
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=500)
meanshift = MeanShift(bandwidth=bandwidth)
meanshift.fit(X)

# 4.输出聚类中心信息
centers = meanshift.cluster_centers_
print("中心点信息:")
print(centers)

# 5.预测每个样本所属的簇
y_predict = meanshift.predict(X)
silhouette_avg = silhouette_score(X, y_predict)  
print("Silhouette Score:", silhouette_avg)

# 6.画图
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y_predict)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', color='red')
plt.title("MeanShift Clustering")
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()

在这里插入图片描述

8.silhouette_score轮廓系数对于聚类的评分

  1. 是什么: **轮廓系数(Silhouette Score)**是一种用于评估聚类效果的指标,它考虑了聚类的紧密度和分离度。其计算方法如下:

  2. 对于每个样本i,计算与同簇中所有其他样本的平均距离,记作ai。ai越(优),表示样本i越应该被分到该簇。

  3. 对于样本i,计算它与其他任意簇所有样本的平均距离,取最小值,记作bi。bi越(优),表示样本i越不应该被分到其他簇。

  4. 轮廓系数Si定义为:Si = (bi - ai) / max(ai, bi)

对所有样本的轮廓系数取平均值,得到整个数据集的平均轮廓系数。

轮廓系数的取值范围在[-1, 1]之间,其中:

  1. 如果Si接近于1,则表示样本i聚类合理,距离相近的样本分在同一个簇,且簇与其他簇有很好的分离度。
  2. 如果Si接近于-1,则表示样本i更适合分到其他簇,当前的聚类结果可能不合理。
  3. 如果Si接近于0,则表示样本i位于两个簇的边界附近。
    所以,轮廓系数越大越好,表示聚类效果越好。

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

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

相关文章

浅谈云计算资源和服务

目录 前言 正文 专有名词及其首字母缩写 轻量级应用服务器 云服务器ECS 专有网络VPC 其他类服务 尾声 🔭 Hi,I’m Pleasure1234🌱 I’m currently learning Vue.js,SpringBoot,Computer Security and so on.👯 I’m studying in University o…

如何用Python创建目录以及自动创建缺失的父目录

在Python中,创建目录(也称为文件夹)是一个常见的任务,尤其是当你需要为文件系统上的某些文件创建存储位置时。幸运的是,Python的os模块提供了一个非常方便的函数os.makedirs(),它允许你创建一个目录&#x…

【AMBA Bus ACE 总线 8 -- ICache maintenance】

请阅读【AMBA Bus ACE 总线与Cache 专栏 】 欢迎学习:【嵌入式开发学习必备专栏】 文章目录 ACE ICache maintenanceACE ICache maintenance 图 1-1 当一个OS run 多个cpu的时候,根据调度算法的不同,OS 可以根据调度算法的不同分别 run 在某个具体的CPU上,因此,它们会有…

计算图与自动微分

计算图与自动微分 一、自动梯度计算1.1 数值微分(Numerical Differentiation)1.2 符号微分(Symbolic Differentiation)1.3 自动微分(Automatic Differentiation,AD)1.3.1 计算图1.3.2 正向传播1…

java技术总结

1.java基本数据类型? byte 1,short 2 ,int 4,long 8 ,float 4,double 8,boolean 1,char 2 2.java为什么要有包装类型? 前 6 个类派生于公共的超类 Number,而 Character 和 Boolean 是 Object 的直接子类。 被 final 修饰, Java 内置的包装类是无法被继承的。 包装…

FreeRTOS标准库例程代码

1.设备STM32F103C8T6 2.工程模板 单片机: 部分单片机的程序例程 - Gitee.comhttps://gitee.com/lovefoolnotme/singlechip/tree/master/STM32_FREERTOS/1.%E5%B7%A5%E7%A8%8B%E6%A8%A1%E6%9D%BF 3.代码 1-FreeRTOS移植模板 #include "system.h" #include "…

腾讯云coding代码托管平台配置问题公钥拉取失败提示 Permission denied(publickey)

前言 最近在学校有个课设多人开发一个游戏,要团队协作,选用了腾讯云的coding作为代码管理仓库,但在配置的时候遇到了一些问题,相比于github,发现腾讯的coding更难用,,,这里记录一下…

【进程替换】进程程序替换函数execl | 单进程程序替换原理

目录 直接看现象(单进程) 单进程程序替换原理 替换函数 直接看现象(单进程) 我们先使用execl来直接看现象man 3 execlexecute a file执行一个程序int execl(const char *path, const char *arg, ...);execl函数的返回值&#x…

使用GitLab自带的CI/CD功能在K8S集群里部署项目(四)

前置内容: 通过Docker Compose部署GitLab和GitLab Runner(一) 使用GitLab自带的CI/CD功能在本地部署项目(二) 使用GitLab自带的CI/CD功能在远程服务器部署项目(三) 一、K8S集群信息 节点名称…

Unity TileMap入门

概述 相信很多同学学习制作游戏都是从2D游戏开始制作的吧,瓦片地图相信大家都有接触,那接下来让我们学习一下这部分的内容吧! Tilemap AnimationFrameRate:设置每帧动画的播放速率。Color:瓦片地图的颜色TileAnchor:锚点,&#x…

笔试强训week4

day1 Q1 难度⭐⭐ 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 题目: 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防…

马斯克:脑机接口迎来首例植入者,芯片接线发生故障。

马斯克旗下的脑机接口公司Neuralink近日传出关于首例植入者诺兰阿博脑机接口芯片故障的消息。根据Neuralink发布的文章,诺兰阿博的脑机设备发生了故障,多根植入他大脑的接线已经脱落,导致获取数据量减少。目前该公司正在研究导致接线脱落的原…

Java进阶08 集合(续)Stream流

Java进阶08 集合(续)&Stream流 一、HashSet集合类(续) 1、JDK7(-)HashSet原理解析 1.1 底层结构 数组链表 1.2 执行过程 ①创建一个默认长度为16的数组,数组名为table ②根据元素的哈希值跟数组的长度求余计…

灰狼优化算法(Grey Wolf Optimizer)

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 算法引言 灰狼算法(Grey Wolf Optimizer, GWO)是一种受自然界灰狼行为启发的优化算法。它模拟了灰狼的社会层次和狩猎策…

JS实现初始化、动态点击切换激活样式

食用须知&#xff0c;不懂得把代码交给AI解释一下&#xff0c;明白流程就会用了&#xff0c;本文只有js与html&#xff0c;样式代码一概没有&#xff1a; 效果展示 1、点击显示的盒子代码 <div data-v-e1dd37c4"" class"news-container main-width-contain…

JAVA获取application.yml配置文件的属性值

application.yml配置参数 方式一&#xff1a;使用Value方式(常用) 语法 Value("${配置文件中的key:默认值}") Value("${配置文件中的key}")方法1&#xff1a;使用的类文件中定义变量&#xff0c;直接使用变量 import org.springframework.beans.factory.an…

通义千问2.5中文能力地表最强

随着人工智能技术的不断进步&#xff0c;智能问答系统已成为人们日常生活中不可或缺的一部分。阿里巴巴集团作为全球领先的科技公司&#xff0c;一直致力于AI领域的研发和创新。最近&#xff0c;阿里巴巴发布了其最新的智能问答系统——通义千问2.5。 通义千问2.5在AI问答领域…

抖音新店怎么对接达人?对接达人秘籍流程分享,让你学会找达人

大家好&#xff0c;我是电商花花。 新手怎么对接达人带货&#xff1f;这是我们新手商家 要考虑的问题。 很多新手抱怨自己新店铺不出单&#xff0c;没有销量&#xff0c;对接达人又怕达人看不上&#xff0c;没有达人愿意帮我带货&#xff0c;在面临这样的情况下不知道该怎么办…

基于自我对弈框架的偏好优化算法SPPO

传统的从人类反馈中进行强化学习&#xff08;RLHF&#xff09;的方法仰赖如Bradley-Terry模型等参数模型,但这样的模型难以充分捕捉人类偏好中的非递移性和非理性。最新的研究进展显示,直接使用偏好机率可以更准确地反映人类偏好,从而实现更灵活、更精确的语言模型对齐。本文提…

会话劫持攻击就在我们身边,我们要如何防范

会话劫持攻击&#xff08;Session Hijacking&#xff09;是一种网络攻击方式&#xff0c;攻击者通过某种手段获取到用户的会话标识&#xff08;Session ID&#xff09;&#xff0c;然后使用这个会话标识冒充合法用户进行恶意操作。这种攻击方式允许攻击者以合法用户的身份访问受…