机器学习 Day16 聚类算法 ,数据降维

news2025/7/16 8:04:21

聚类算法

1.简介

1.1 聚类概念

  • 无监督学习:聚类是一种无监督学习算法,不需要预先标记的训练数据

  • 相似性分组:根据样本之间的相似性自动将样本归到不同类别

  • 相似度度量:常用欧式距离作为相似度计算方法

1.2 聚类vs分类

  • 聚类:无监督,不知道类别数量或含义,基于相似性分组

  • 分类:有监督,使用已标记数据训练模型预测新数据类别

2. K-means聚类实现

2.1 API介绍

from sklearn.cluster import KMeans

# 主要参数
KMeans(n_clusters=8)  # n_clusters指定聚类中心数量

# 常用方法
estimator.fit(x)      # 训练模型
estimator.predict(x)   # 预测类别
estimator.fit_predict(x)  # 训练+预测

2.2 代码实现步骤

1.创建数据集

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

X, y = make_blobs(n_samples=1000, n_features=2, 
                  centers=[[-1,-1], [0,0], [1,1], [2,2]], 
                  cluster_std=[0.4, 0.2, 0.2, 0.2], 
                  random_state=9)

# 可视化
plt.scatter(X[:,0], X[:,1], marker='o')
plt.show()

2.聚类
from sklearn.cluster import KMeans

# 尝试不同聚类数量
y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X)

# 可视化结果
plt.scatter(X[:,0], X[:,1], c=y_pred)
plt.show()

3.聚类评估

from sklearn.metrics import calinski_harabasz_score

# 使用Calinski-Harabasz指数评估
print(calinski_harabasz_score(X, y_pred))

3.算法流程 

算法优化的是SSE,所以每一步都在把每个点分配到欧式距离最小的点。当然当优化的损失函数不同时,我们可以采取不同的距离。

K-means聚类步骤详解

  1. 初始化聚类中心

    • 随机选择(有改进)K个数据点作为初始聚类中心

    • 这些中心点位于特征空间内

  2. 分配数据点到最近中心

    • 对于每个数据点,计算它与所有K个中心的距离

    • 将该点分配到距离最近的聚类中心所属的簇

    • 常用距离度量:欧几里得距离(欧式距离)

  3. 重新计算聚类中心

    • 对每个簇,计算其中所有点的均值(每个特征维度的平均值)

    • 将均值点作为新的聚类中心

  4. 判断收敛

    • 比较新旧中心点的位置变化

    • 如果中心点不再移动(或移动小于阈值),算法终止

    • 否则,返回步骤2继续迭代

算法特点说明

  • 需要预先指定K值:这是算法的主要限制之一

  • 对初始中心敏感:不同的初始中心可能导致不同的最终结果

  • 对异常点敏感:涉及到求平均,异常点会产生误差很大。

  • 迭代过程保证收敛:算法一定会收敛,但可能只是局部最优

  • 适用于凸形数据分布:对非凸分布效果可能不佳

实际应用提示

  1. 可以通过多次运行取最优结果来缓解初始中心敏感问题

  2. 使用肘部法则(Elbow Method)或轮廓系数等方法帮助确定最佳K值

  3. 数据标准化很重要,因为K-means对特征的量纲敏感

4.算法评估:

4.1SSE(确定迭代次数)

 

就是计算每个簇中,每个点到中心点的距离平方,很明显当数据很多时,SSE计算会很计算量大、

4.2.肘方法(确定K)

4.3.轮廓系数(选择K)

a就是凝聚度,b就是分离度,我们希望高凝聚,高分离,也就是a小b大,所以那个公式就是SC越为一越好。但是,SC越1越好吗,我们在选择K的时候需要考虑希望使得样本不是很极端,比如

k=2的时候第一簇极度窄于第二簇,虽然它的SC小但是我们选择k=4.

4.4.C-H系数(选择K)

5.kmeans优缺点

6.Canopy算法

算法流程:

该算法之所以被称为预聚类,因为它的结果和选取的起始点可以作为以后的参考。 算法简而言之就是我先选一个点,在T1距离内视作这个类,在T2内我们不能再选出另一个起始点,然后选择一个随机点继续进行以上步骤。

优点解读

  • 抗干扰能力提升:K - means 算法对噪声敏感,离群点易使聚类中心偏移。Canopy 算法在预处理阶段,通过设定距离阈值,可将包含少量样本点(NumPoint 较小)的 Cluster 直接去除。这些小 Cluster 很可能是由噪声或离群点形成的,去掉它们能减少噪声对后续聚类的干扰,提升聚类结果的稳定性 。
  • 聚类中心初始化优化:Canopy 算法在聚类过程中,会确定每个 Canopy 的中心点。将这些中心点作为 K - means 算法的初始聚类中心(K ),相较于 K - means 随机选取初始中心,Canopy 算法得到的中心更具代表性,能使 K - means 更快收敛到更优解,提高聚类精度 。
  • 计算量降低:Canopy 算法先将数据集划分成若干个相互重叠的子集(Canopy) 。后续对每个 Canopy 内部进行 K - means 聚类,无需在整个数据集上进行相似性计算,极大减少了计算量,尤其适用于大规模数据集,能有效提高聚类效率 。

缺点解读

  • 阈值确定难题:Canopy 算法依赖两个距离阈值 T1 和 T2 ,合适的阈值能使算法有效划分数据集。但实际应用中,很难事先确定最优的 T1 和 T2 值。若阈值设置不当,可能导致划分的 Canopy 过于稀疏或过于密集,影响聚类效果。同时,即使使用 Canopy 算法进行预处理,后续基于 Canopy 的 K - means 聚类依旧可能陷入局部最优解,因为 K - means 本身的迭代优化特性容易受初始条件和数据分布影响 。

7.k-means++算法

K - means++ 是 K - means 算法的改进版本,主要改进在于初始聚类中心的选择,目的是让选择的质心尽可能分散,以提升聚类效果,减少陷入局部最优的可能性

初始聚类中心选择概率公式

  • 公式原理其中D(x)表示数据点x到最近已选聚类中心的距离 。该公式计算每个数据点被选为下一个聚类中心的概率,分子是单个数据点到最近已选中心距离的平方,分母是所有数据点到最近已选中心距离平方的总和。通过这种方式,距离已选中心远的点有更大概率被选为新的聚类中心 。

8.二分k-means算法

 

9.K-中心聚类算法

k - medoids 算法抗噪性优势

  • 原理:k - medoids 算法选择实际数据点作为簇中心(medoids ,即中心点),通过最小化绝对误差(如曼哈顿距离等)来确定簇中心。与 k - means 计算均值作为质心不同,它更关注数据点本身的代表性。
  • 示例:样本点(1,1)、(1,2)、(2,1)相对接近,属于正常数据,而(1000,1000)是明显噪声点。k - means 会受噪声影响,使质心偏向噪声点方向;k - medoids 则在所有样本点中选择使簇绝对误差最小的点作为中心,由于噪声点会增大误差,所以更可能在前三个正常样本点中选中心,避免噪声干扰,体现出对噪声的鲁棒性。

k - medoids 算法局限性

  • 计算效率问题:k - medoids 算法计算量较大,随着样本数量增加,计算每个数据点作为中心点时的绝对误差并进行比较的操作会耗费大量时间和资源,导致算法运行速度变慢。
  • 与 k - means 对比:在大规模样本情况下,k - means 虽然对噪声敏感,但少量噪声对其质心计算影响有限,且 k - means 计算简单、效率高。所以综合来看,k - means 在实际应用中更为广泛,而 k - medoids 更适用于对噪声敏感且样本规模较小的场景。

数据降维

1.定义和主要方式

 方式主要是特征选择和主成分分析(因子分析等)

2.特征选择

2.1特征选择定义

旨在从数据中包含的众多特征(属性、指标等)里,找出主要特征,剔除冗余或无关变量。例如分析鸟类相关数据时,羽毛颜色、眼睛宽度等都是可能的特征,需筛选出对研究目的(如区分鸟类种类等)有重要作用的特征 。

2.2特征选择方法

  • Filter(过滤式)也就是直接进行选择
    • 方差选择法:依据特征方差大小筛选。方差小意味着多数样本在该特征上取值相近,对区分样本作用小,可删除。如sklearn.feature_selection.VarianceThreshold(threshold = 0.0) ,默认删除所有样本取值相同(方差为 0 )的特征,也可指定阈值,删除方差低于该值的特征 。
    • 相关系数
      • 皮尔逊相关系数:衡量两变量线性相关程度,取值 [-1, 1] 。r > 0 为正相关,r < 0 为负相关;|r| = 1 完全相关,r = 0 无相关;0 < |r| < 1 存在一定程度相关,|r| 越接近 1 线性关系越密切。可通过from scipy.stats import pearsonr 计算,返回相关系数和 p 值 。
      • 斯皮尔曼相关系数:也是反映变量相关程度的统计指标,能表明变量相关方向,取值 [-1, 1] ,应用比皮尔逊相关系数更广泛 ,计算使用from scipy.stats import spearmanr 。
  • Embedded(嵌入式)也就是在某些算法中嵌入的
    • 决策树:利用信息熵、信息增益等指标,在构建决策树过程中自动选择与目标值关联紧密的特征 。
    • 正则化:如 L1、L2 正则化,在模型训练时通过约束参数,使部分特征系数趋近于 0 ,从而实现特征选择 。
    • 深度学习:如卷积神经网络等,在训练过程中自动学习数据特征,隐式进行特征选择 。

2.3低方差特征过滤

  • 原理:方差用于衡量数据的离散程度。在特征选择中,若某个特征的方差很小,说明该特征在不同样本间取值差异不大,对样本区分能力弱,可视为冗余特征进行删除。例如,在一个关于学生成绩的数据集里,如果 “学生姓名笔画数” 这个特征方差极小,说明该特征对区分学生成绩好坏没什么作用,就可考虑删除。
  • API 使用示例
import pandas as pd
from sklearn.feature_selection import VarianceThreshold

def variance_demo():
    """
    删除低方差特征——特征选择
    :return: None
    """
    data = pd.read_csv("factor_returns.csv")
    print(data)
    # 1、实例化一个转换器类,指定阈值方差为1
    transfer = VarianceThreshold(threshold=1)
    # 2、调用fit_transform进行转换,这里选取data.iloc[:, 1:10]部分数据
    data = transfer.fit_transform(data.iloc[:, 1:10])
    print("删除低方差特征的结果: \n", data)
    print("形状: \n", data.shape)
    return None

2.4相关系数 - 皮尔逊相关系数

  • 原理:皮尔逊相关系数衡量两个变量之间的线性相关程度(皮尔逊低说明的是线性关系弱,并不代表相关性弱,可能还有非线性关系)。它基于变量的均值、标准差等统计量计算。当两个变量的变化趋势呈现同向线性关系时,相关系数为正;反向线性关系时,相关系数为负;若不存在线性关系,相关系数接近 0 。比如研究身高和体重的关系,若身高增加时体重也倾向于增加,皮尔逊相关系数为正。
  • API 及案例
from scipy.stats import pearsonr

x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]
result = pearsonr(x1, x2)
print(result)

代码中,从scipy.stats导入pearsonr函数,定义两个数据列表x1x2 ,调用pearsonr计算二者的皮尔逊相关系数和 p 值,打印结果。这里得到的相关系数接近 0.994 ,说明x1x2之间存在高度线性正相关关系,p 值极小表明这种相关性在统计上非常显著。

2.5相关系数 - 斯皮尔曼相关系数

  • 原理:斯皮尔曼相关系数是一种非参数统计量,它基于变量的秩次(排序位置)计算,反映变量之间的单调相关关系,不局限于线性关系。例如,研究学生考试成绩排名和平时作业完成质量排名之间的关系,斯皮尔曼相关系数能有效衡量二者关联程度。
  • API 及案例
from scipy.stats import spearmanr

x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]
result = spearmanr(x1, x2)
print(result)

3.主成分分析(这里只将实现,具体原理参考李航机器学习)

PCA(主成分分析)API 

  • 类定义sklearn.decomposition.PCA(n_components=None) 是用于主成分分析的类,主成分分析是一种常用的数据降维技术,目的是将高维数据转换到较低维数空间,同时尽可能保留数据的关键信息。
  • 参数n_components :
    • 小数形式:表示要保留数据信息的比例。例如n_components = 0.9 ,意味着 PCA 会自动确定一个合适的低维空间维度,使得转换后的数据能够保留原始数据 90% 的信息 。
    • 整数形式:直接指定降维后数据的特征维度。如n_components = 3 ,就是将数据降到 3 维 。
  • 方法fit_transform(X) :X需是numpy array格式,形状为[n_samples, n_features] (n_samples是样本数量,n_features是特征数量) 。该方法先对数据进行拟合(学习数据的分布特征等),再进行转换(降维操作),返回降维后指定维度的数组 。

PCA 代码示例

from sklearn.decomposition import PCA

def pca_demo():
    """
    对数据进行PCA降维
    :return: None
    """
    data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
    # 1、实例化PCA,小数——保留多少信息
    transfer = PCA(n_components=0.9)
    # 2、调用fit_transform
    data1 = transfer.fit_transform(data)
    print("保留90%的信息,降维结果为: \n", data1)
    # 1、实例化PCA,整数——指定降维到的维数
    transfer2 = PCA(n_components=3)
    # 2、调用fit_transform
    data2 = transfer2.fit_transform(data)
    print("降维到3维的结果: \n", data2)
    return None

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

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

相关文章

软件测试——面试八股文(入门篇)

今天给大家分享软件测试面试题入门篇&#xff0c;看看大家能答对几题 一、 请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff…

Yolov8的详解与实战-深度学习目标检测

Yolov8的详解与实战- 文章目录 摘要 模型详解 C2F模块 Loss head部分 模型实战 训练COCO数据集 下载数据集 COCO转yolo格式数据集&#xff08;适用V4&#xff0c;V5&#xff0c;V6&#xff0c;V7&#xff0c;V8&#xff09; 配置yolov8环境 训练 测试 训练自定义数据集 Labelme…

Python(1) 做一个随机数的游戏

有关变量的&#xff0c;其实就是 可以直接打印对应变量。 并且最后倒数第二行就是可以让两个数进行交换。 Py快捷键“ALTP 就是显示上一句的代码。 —————————————————————————————— 字符串 用 双引号或者单引号 。 然后 保证成双出现即可 要是…

【Bootstrap V4系列】学习入门教程之 组件-导航条(Navbar)

Bootstrap V4系列 学习入门教程之 组件-导航条&#xff08;Navbar&#xff09; 导航条&#xff08;Navbar&#xff09;一、How it works二、Supported content 支持的内容2.1 Brand 品牌2.2 Nav 导航2.3 Forms 表格 三、Color schemes 配色方案四、Containers 容器五、Placemen…

[Java实战]Spring Security 添加验证码(二十三)

[Java实战]Spring Security 添加验证码&#xff08;二十三&#xff09; 在现代的 Web 应用中&#xff0c;验证码是防止恶意攻击&#xff08;如暴力破解、自动注册等&#xff09;的重要手段之一。Spring Security 是一个功能强大的安全框架&#xff0c;提供了用户认证、授权等功…

万文c++继承

1、继承的概念与定义 1.1继承的概念 继承&#xff1a;是c代码复用的手段&#xff0c;允许在原有的基础上扩展&#xff0c;在此之前都是函数层次的复用&#xff0c;继承是类设计层次的复用。 下面有两个类Student和Teacher都有姓名/地址/电话/年龄等成员变量。都有identity身…

Linux grep -r 查找依赖包是否存在依赖类 Class

方法一&#xff1a;通过 Linux &#xff0c;grep -r ClassPath 命令 grep -f org.apache.kafka.connect.source.SourceRecord在 jar 包所在 lib 或者 lib/plugins 目录下执行&#xff0c;grep -r&#xff0c; flink-sql-connector-sqlserver-cdc-3.3.0.jar 中此 kafka Source…

41:像素坐标与实际坐标转化

采用上面的算子 将像素坐标点转换为实际坐标 image_points_to_world_plane(CamParam, Worldpose, Row, Column, m, X, Y) 第一个参数&#xff1a;标定得到的内参--根据标定助手得到的 第二个参数&#xff1a;标定得到的外参--根据标定助手得到的 第三个参数&#xff1a;计算…

大某麦演唱会门票如何自动抢

引言 仅供学习研究&#xff0c;欢迎交流 抢票难&#xff0c;难于上青天&#xff01;无论是演唱会、话剧还是体育赛事&#xff0c;大麦网的票总是秒光。大麦网是国内知名的票务平台&#xff0c;热门演出票往往一票难求。手动抢票不仅耗时&#xff0c;还容易错过机会。作为一名…

LVS负载均衡群集和keepalive

目录 一. 集群概述 1.1 集群的定义 1.2 集群的分类 1. 高可用集群 HA 2. 高性能运输群集 HPC 3.负载均衡群集 LB 4. 分布式存储集群 二. LVS概述 2.1 LVS的定义 2.2 LVS的工作原理 2.3 LVS 的三种工作模式 2.4 LVS 三种工作模式的对比 2.5 LVS 调度算法 1. 静态…

Apache Pulsar 消息、流、存储的融合

Apache Pulsar 消息、流、存储的融合 消息队列在大层面有两种不同类型的应用&#xff0c;一种是在线系统的message queue&#xff0c;一种是流计算&#xff0c;data pipeline的streaming高throughout&#xff0c;一致性较低&#xff0c;延迟较差的过程。 存算分离 扩容和缩容快…

最优化方法Python计算:有约束优化应用——线性可分问题支持向量机

设问题的数据样本点 ( x i , y i ) (\boldsymbol{x}_i,y_i) (xi​,yi​)&#xff0c; x i ∈ R n \boldsymbol{x}_i\in\text{R}^n xi​∈Rn&#xff0c; y i 1 y_i\pm1 yi​1&#xff0c; i 1 , 2 , ⋯ , m i1,2,\cdots,m i1,2,⋯,m。由于标签数据 y i ∈ { − 1 , 1 } y_i\…

SpringBoot学习(上) , SpringBoot项目的创建(IDEA2024版本)

目录 1. SpringBoot介绍 SpringBoot特点 2. SpringBoot入门 2.1 创建SpringBoot项目 Spring Initialize 第一步: 选择创建项目 第二步: 选择起步依赖 第三步: 查看启动类 2.2 springboot父项目 2.3 测试案例 2.3.1 数据库 2.3.2 生成代码 1. SpringBoot介绍 Spring B…

【Redis 进阶】哨兵模式

思维导图&#xff1a; 一、哨兵模式概述 &#xff08;一&#xff09;传统主从复制模式的局限性 在传统的Redis主从复制架构中&#xff0c;若主节点发生故障&#xff0c;运维人员需手动执行故障转移操作&#xff0c;将一个从节点提升为新主节点&#xff0c;并逐一通知所有客户…

CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开

苹果公司近日针对macOS系统中新披露的CVE-2025-31258漏洞发布补丁&#xff0c;该漏洞可能允许恶意应用程序突破沙箱限制&#xff0c;获取未授权的系统资源访问权限。在安全研究员Seo Hyun-gyu公开概念验证&#xff08;PoC&#xff09;利用代码后&#xff0c;该漏洞已在macOS Se…

武汉大学无人机视角下的多目标指代理解新基准!RefDrone:无人机场景指代表达理解数据集

作者&#xff1a;Zhichao Sun, Yepeng Liu, Huachao Zhu, Yuliang Gu, Yuda Zou, Zelong Liu, Gui-Song Xia, Bo Du, Yongchao Xu 单位&#xff1a;武汉大学计算机学院 论文标题&#xff1a;RefDrone: A Challenging Benchmark for Drone Scene Referring Expression Compreh…

【递归、搜索和回溯】二叉树中的深搜

个人主页 &#xff1a; zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 前言1 2331. 计算布尔二叉树的值1.1 分析1.2 代码 2 129. 求根节点到叶节点数字之和2.1 分析2.2 代码 3 814. 二叉树剪枝3.1 分析3.2 代码 4 98. 验证…

Algolia - Docsearch的申请配置安装【以踩坑解决版】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

Linux513 rsync本地传输 跨设备传输 一

ping节点bPing通 仅主机模式不需要设置网关节点a也可以Ping通节点b 同步成功 下载文件夹成功 今日源码 节点a 节点b

leetcode 383. Ransom Note

题目描述 代码 class Solution { public:bool canConstruct(string ransomNote, string magazine) {vector<int> table(26,0);for(char ch : magazine){table[ch-a];}for(char ch : ransomNote){table[ch-a]--;if(table[ch-a] < 0)return false;}return true;} };