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位于两个簇的边界附近。
    所以,轮廓系数越大越好,表示聚类效果越好。

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

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

相关文章

jenkins使用gitLab(极狐)认证登陆

jenkins安装 GitLab Authentication插件 我因为java版本和最新GitLab Authentication 1.19版本不兼容,选择了本地安装 找个历史版本1.13版本,然后下载到电脑上 - 本地上传插件并安装 在极狐上创建一个应用 - 配置应用信息 应用名:jenkinsLo…

你以为是个黄金程序员,结果是个王者

玩过王者荣耀的同学都知道,从青铜到王者,过程中需要步步修炼,可以说等级的提升是胜利的积累,也可以说是技术的提升。 而程序员行业也是这样,技术越高段位越高,当然段位越高技术也越高,这个行业大…

Oracle -在线回缩表

conn scott/tiger DROP TABLE EMP1 PURGE; CREATE TABLE EMP1 AS SELECT * FROM EMP; alter table emp1 enable row movement; -- 启动回缩特性 insert into emp1 select * from emp1; / / commit; -- 增加到14000行 -- 分析表的结构 analyze table emp1 comput…

小程序如何确定会员身份并批量设置会员积分或余额

因为一些原因,商家需要从其它系统里面批量导入会员,确定会员身份,然后给他们设置对应的账户余额。下面,就具体介绍如何进行这种操作。 一、客户进入小程序并绑定手机号 进入小程序:客户打开小程序,系统会自…

交友软件源码-源码+搭建+售后,上线即可运营聊天交友源码 专业语聊交友app开发+源码搭建-快速上线

交友小程序源码是一种可以帮助开发者快速搭建交友类小程序的代码模板。它通常包括用户注册、登录、个人信息编辑、匹配推荐、好友聊天等常见功能,以及与后台数据交互的接口。使用这种源码可以极大地缩短开发时间,同时也可以根据自己的需求进行二次开发和…

从0到1开发一个vue3+ts项目(一)

1. 环境配置 1.1 安装node 使用官方安装程序 前往 Node.js 官网:访问 Node.js 官网,下载适合你操作系统的安装程序。运行安装程序:下载完成后,双击安装程序并按照提示进行安装。验证安装:安装完成后,在终…

C++对象的拷贝构造函数

如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。 拷贝(复制)构造函数:利用同类对象构造一个新的对象 ●1.函数名和类同名 (构造函数) ●2.没有返回值 (构造函数) ●3.第一个参数必…

软考中级-软件设计师(九)数据库技术基础 考点最精简

一、基本概念 1.1数据库与数据库系统 数据:是数据库中存储的基本对象,是描述事物的符号记录 数据库(DataBase,DB):是长期存储在计算机内、有组织、可共享的大量数据集合 数据库系统(DataBas…

【C++】模拟实现string

文章目录 前言成员变量成员函数构造函数拷贝构造函数浅拷贝深拷贝拷贝构造函数实现 析构函数赋值重载 空间管理函数元素访问元素修改字符串运算流提取 & 流插入流提取流插入 迭代器begin & endrbegin & rend 总结 前言 模拟实现不是为了写得和库里面一样好。而是为…

OmniReader Pro mac激活版:智慧阅读新选择,开启高效学习之旅

在追求知识的道路上,一款优秀的阅读工具是不可或缺的。OmniReader Pro作为智慧阅读的新选择,以其独特的功能和卓越的性能,为您开启高效学习之旅。 OmniReader Pro具备高效的文本识别和处理技术,能够快速准确地提取文档中的关键信息…

《QT实用小工具·五十四》果冻弹出效果的动画按钮

1、概述 源码放在文章末尾 该项目实现动画按钮,鼠标放在按钮上可以弹性拉出的三个按钮,使用贝塞尔曲线实现,项目demo显示如下所示: 项目部分代码如下所示: #ifndef WATERCIRCLEBUTTON_H #define WATERCIRCLEBUTTON…

Day 43 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

最后一块石头重量Ⅱ 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&#xff0c;那么两…

Transformers中加载预训练模型的过程剖析

使用HuggingFace的Transformers库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…

【go项目01_学习记录10】

操作数据库 1 插入数据2 显示文章2.1 修改 articlesShowHandler() 函数2.2 代码解析 3 编辑文章3.1 添加路由3.2 编辑articlesEditHandler()3.3 新建 edit 模板3.4 代码重构3.5 完善articlesUpdateHandler()3.6 测试更新3.7 封装表单验证 1 插入数据 . . . func articlesStore…

厚德提问大佬答4:AI绘画生成的心得

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

车载电子电器架构 —— 应用软件开发(中)

车载电子电器架构 —— 应用软件开发(中) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

算法设计课第五周(贪心法实现活动选择问题)

目录 一、【实验目的】 二、【实验内容】 三、实验源代码 一、【实验目的】 &#xff08;1&#xff09;熟悉贪心法的设计思想 &#xff08;2&#xff09;理解贪心法的最优解与正确性证明之间的关系 &#xff08;3&#xff09;比较活动选择的各种“贪心”策略&#xff0c;…

动态IP避坑指南:如何挑选合适的动态代理IP?

在如今的网络环境中&#xff0c;使用动态IP代理成为实现隐私保护、访问受限内容和提高网络效率的一种常见方式&#xff0c;选择合适的国外动态IP代理可以让我们的业务处理事半功倍。面对市面上琳琅满目的选择&#xff0c;如何挑选购买适合自己的动态IP代理服务呢&#xff1f;在…

【数据结构】手把手带你玩转线性表

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

弱监督语义分割-对CAM的生成过程进行改进1

一、仿射变换图像结合正则项优化CAM生成 论文&#xff1a;Self-supervised Equivariant Attention Mechanism for Weakly Supervised Semantic Segmentation &#xff08;CVPR,2020&#xff09; 1.SEAM方法 孪生网络架构&#xff08;Siamese Network Architecture&#xff09…