机器学习第十一章-特征选择与稀疏学习

11.1子集收集与评价

        属性称为"特征" ,对当前学习任务有用的属性称为"相关特征" 、没什么用的属性称为"无关特 征" . 从给定的特征集合中选择出相关特征于集的过程,称为"特征选择"。

        特征选择是一个重要的"数据预处理" 过程。我们要从初始的特征集合中选取一个包含了所有重要信息的特征子集,首先,是子集搜索,给走特征集合 {a1,a2 ,... ad} ,我们可将每个特征看作一个候选子集,对这d个候选单特征子集进行评价,假定 {a2} 最优,于是将 {a2}作为第一轮的选定集;然后,在上一轮的选定集中加入一个特征,构成包含两个特征的候选子集,以此往复操作。其次,是子集评价,子集的信息增益为:\operatorname{Gain}(A)=\operatorname{Ent}(D)-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Ent}\left(D^{v}\right)

                                 信息熵定义为:\operatorname{Ent}(D)=-\sum_{i=1}^{|\mathcal{Y}|} p_{k} \log _{2} p_{k}

        信息增益 Gain(A) 越大,意味着特征子集 包含的有助于分类的信息越多.于是,对每个候选特征子集,我们可基于训练数据集来计算其信息增益,以此作为评价准则。
        常见的特征选择方法大致可分为三类:过滤式 、包裹式 和嵌入式.

11.2过滤式选择

        过滤式方法先对数据集进行特征选择,然后再训练学习器。

        Relief 是一种著名的过滤式特征选择方法,该方法设计了一个"相关统计量"来度量特征的重要性。该统计量是一个向量,其每个分量分别对应于一个初始特征,而特征子集的重要性则是由子集中每个特征所对应的相关统计量分量之和来决定。

下面是关于Relief算法的过滤式特征选择方法的实验代码及分析和结果:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
from skfeature.function.statistical import reliefF# 加载数据集
data = load_iris()
X = data.data
y = data.target# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 计算特征的ReliefF评分
reliefF_scores = reliefF.reliefF(X_train, y_train)# 将特征按ReliefF评分排序
ranked_features = np.argsort(reliefF_scores)[::-1]# 选择前k个特征
k = 2
selected_features = ranked_features[:k]# 用选定的特征训练分类器
X_train_selected = X_train[:, selected_features]
X_test_selected = X_test[:, selected_features]classifier = RandomForestClassifier(n_estimators=100, random_state=42)
classifier.fit(X_train_selected, y_train)# 在测试集上评估分类器
y_pred = classifier.predict(X_test_selected)
accuracy = accuracy_score(y_test, y_pred)print("Selected features:", selected_features)
print("Accuracy with selected features:", accuracy)

分析:

  1. ReliefF评分:该方法为每个特征计算一个重要性分数,反映了该特征对分类结果的影响。高分特征更为重要。
  2. 特征选择:根据ReliefF评分,选择排名前k的特征。这里选择了前2个特征。
  3. 分类性能:使用选定的特征训练随机森林分类器,并在测试集上评估准确性。最终的分类准确性显示了所选特征的有效性。

结果:

11.3包裹式选择

        包裹式特征选择直接把最终将要使用的学习器的性能作为特征于集的评价准则.从最终学习器性能来看,包裹式特征选择比过滤式特征选择更好,但另一方面,由于在特征选择过程中需多次训练学习器,因此包裹式特征选择的计算开销通常比过滤式特征边择大得多.
        LVW 是一个典型的包裹式特征选择方法,算法描述如下:
下面是关于LVW算法的实验代码及分析和结果:
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler# LVW 算法的伪实现
def lvw_algorithm(X_train, y_train, X_test, alpha=0.5):"""LVW算法的伪实现:假设权重为特征的均值"""feature_means = np.mean(X_train, axis=0)weights = np.exp(alpha * feature_means)  # 伪权重计算X_train_weighted = X_train * weightsX_test_weighted = X_test * weights# 用加权特征训练逻辑回归模型model = LogisticRegression()model.fit(X_train_weighted, y_train)return model, X_test_weighted# 1. 数据加载
data = load_iris()
X = data.data
y = data.target# 2. 数据预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 3. 数据划分
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)# 4. 应用 LVW 算法
model, X_test_weighted = lvw_algorithm(X_train, y_train, X_test, alpha=0.5)# 5. 预测与评估
y_pred = model.predict(X_test_weighted)
accuracy = accuracy_score(y_test, y_pred)print(f"Model accuracy with LVW algorithm: {accuracy:.2f}")

分析:

  1. 数据集:我们使用了Iris数据集,这是一个多分类数据集,包含150个样本和4个特征。数据集已经标准化,以便于比较。

  2. LVW算法实现:在这个伪实现中,LVW算法假设特征的均值用于计算权重。具体来说,我们将每个特征的均值取指数作为权重,并对训练数据和测试数据进行加权。这是一种简单的加权方法,实际的LVW算法可能会复杂得多。

  3. 模型训练与评估:我们使用加权后的训练数据训练逻辑回归模型,并在加权后的测试数据上进行预测。最后,计算模型的准确性。

结果:

11.4嵌入式选择与L1正则化

        嵌入式特征选择是将特征选择过程与学习器训练过程融为一体。

        给定数据集D=\left\{\left(\boldsymbol{x}_{1}, y_{1}\right),\left(\boldsymbol{x}_{2}, y_{2}\right), \ldots,\left(\boldsymbol{x}_{m}, y_{m}\right)\right\},最简单的线性回归模型,以平方误差为损失函数,则优化目标为:\min _{\boldsymbol{w}} \sum_{i=1}^{m}\left(y_{i}-\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}\right)^{2}

        当样本特征很多,而样本数相对较少时,很容易陷入过拟合.为了缓解过拟合问题,引入正则化项:\min _{\boldsymbol{w}} \sum_{i=1}^{m}\left(y_{i}-\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}\right)^{2}+\lambda\|\boldsymbol{w}\|_{2}^{2}
        L1范数和 L2 范数正则化都有助于降低过拟合风险,但前者还会带来一个额外的好处:它比后者更易于获得"稀疏" 解,即它求得的 会有更少的非零分量.

        L1正则化问题的求 可使用近端梯度下降法(PGD)

下面是关于近端梯度下降法(PGD)算法解决L1正则化问题的实验代码及分析和结果:

import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_errordef projected_gradient_descent(X, y, lambda_reg, alpha=0.01, num_iters=1000):m, n = X.shapetheta = np.zeros(n)for _ in range(num_iters):gradient = -2 * X.T @ (y - X @ theta) / mtheta -= alpha * gradient# Project onto L1 ball (soft thresholding)theta = np.sign(theta) * np.maximum(0, np.abs(theta) - alpha * lambda_reg)return theta# 1. 数据生成
X, y = make_regression(n_samples=100, n_features=20, noise=0.1, random_state=42)# 2. 设置参数
lambda_reg = 0.1  # L1正则化强度
alpha = 0.01  # 学习率
num_iters = 1000  # 迭代次数# 3. 使用PGD算法求解
theta_pgd = projected_gradient_descent(X, y, lambda_reg, alpha, num_iters)# 4. 用Lasso模型验证
lasso = Lasso(alpha=lambda_reg)
lasso.fit(X, y)
theta_lasso = lasso.coef_# 5. 计算误差
mse_pgd = mean_squared_error(y, X @ theta_pgd)
mse_lasso = mean_squared_error(y, X @ theta_lasso)print(f"PGD Mean Squared Error: {mse_pgd:.2f}")
print(f"Lasso Mean Squared Error: {mse_lasso:.2f}")

分析:

  1. 数据生成:我们使用make_regression函数生成了一个回归数据集。数据集包含100个样本和20个特征,带有一定的噪声。

  2. PGD算法实现:在projected_gradient_descent函数中,我们通过梯度下降法更新参数,并在每次迭代后对参数进行L1范数的软阈值投影。这个过程确保参数的L1范数约束被满足,即实施了L1正则化。

  3. Lasso模型验证:为了验证PGD算法的结果,我们还使用了Scikit-learn的Lasso模型,它本质上使用了相同的L1正则化技术。

  4. 误差计算:我们计算了PGD算法和Lasso模型的均方误差(MSE),以比较它们在数据上的表现。

结果:

11.5稀疏表示与字典学习

        将样品稀疏表示,可以使学习任务的难度可能有所降低?涉及的计算和存储开销会减少, 学得模型的可解释性也会提高。字典学习 亦称"稀疏编码"。是为普通稠密表达的样本找到合适的字典,将样本转化为合适的稀疏表示形式,从而使学习任务得以简化。

        给定数据集\left\{\boldsymbol{x}_{1}, \boldsymbol{x}_{2}, \ldots, \boldsymbol{x}_{m}\right\},字典学习最简单的形式为:

                                        ​​​​​​​        \min _{\mathbf{B}, \boldsymbol{\alpha}_{i}} \sum_{i=1}^{m}\left\|\boldsymbol{x}_{i}-\mathbf{B} \boldsymbol{\alpha}_{i}\right\|_{2}^{2}+\lambda \sum_{i=1}^{m}\left\|\boldsymbol{\alpha}_{i}\right\|_{1}

其中 \mathbf{B} \in \mathbb{R}^{d \times k} 为字典矩阵 ,k 称为字典的词汇量,通常由用户指定,\alpha _{i} \in \mathbb{R}^{k} 是样本x_{i} \in \mathbb{R}^{d}  的稀疏表示.

       

11.6压缩感知

        在现实任务中,我们常希望根据部分信息来恢复全部信息。通常选择压缩的方法。压缩感知为精确地重构出原信号提供了方法。

        在很多应用中均可获得具有稀疏性的 例如图像或声音的数字信 号通常在时域上不具有稀疏性,但经过傅里叶变换、余弦变换、小波变换等处 理后却会转化为频域上的稀疏信号.与特征选择、稀疏表示不同,压缩感知关注的是如何利用信号本身所具有的稀疏性,从部分观测样本中恢复原信号。

        限定等距性( RIP)是一种用于描述稀疏信号恢复算法中矩阵性质的概念。它主要用于压缩感知(Compressed Sensing)和信号处理领域,用来确保一个矩阵能够以接近原始信号的方式保留稀疏信号的几何结构。

        给定一个m \times n的矩阵\Phi和一个正整数s,我们称 \Phi满足 (s, δ)限定等距性,如果对于所有的 s -稀疏向量 x(即只有 s个非零元素的向量),矩阵 \Phi满足以下条件:

(1 - \delta_s) \|x\|_2^2 \leq \|\Phi x\|_2^2 \leq (1 + \delta_s) \|x\|_2^2

其中:
- \|x\|_2表示向量x 的二范数(Euclidean norm)。
\delta_s是一个正的常数,称为(s, δ)等距性常数,它衡量了矩阵 \Phi保持 s-稀疏向量的几何结构的能力。

1. 稀疏恢复:RIP 是压缩感知理论中的一个关键性质,保证了使用特定矩阵(如随机矩阵或测量矩阵)时,稀疏信号可以从其线性测量中有效恢复。这意味着,即使我们仅从少量的测量中得到信息,也能准确地重建原始信号。

2. 优化算法的理论保证:RIP 为压缩感知中的许多优化算法提供理论保证,说明这些算法可以在有限的测量数量下恢复稀疏信号。

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

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

相关文章

Linux | Linux进程万字全解:内核原理、进程状态转换、优先级调度策略与环境变量

目录 1、从计算机组成原理到冯诺依曼架构 计算机系统的组成 冯诺依曼体系 思考:为什么计算机不能直接设计为 输入设备-CPU运算-输出设备 的结构? 2、操作系统(Operator System) 概念 设计OS的目的 描述和组织被管理对象 3、进程 基本概念 进程id和父进程…

数据结构入门——07堆

1.堆 堆(Heap)是一种特殊的完全二叉树数据结构,具有以下两个主要特性: 结构特性: 堆是一棵完全二叉树,即除了最后一层的叶子节点外,每一层都是满的,最后一层的叶子节点从左向右依次…

志愿服务管理系统--论文pf

TOC springboot360志愿服务管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和笔记本的广…

[SWPUCTF 2021 新生赛]babyrce

我们传cookie admin1 访问http://node5.anna.nssctf.cn:29911/rasalghul.php 在PHP中,preg_match函数是一个用于进行正则表达式匹配的内置函数。它可以通过正则表达式对一个字符串进行匹配,判断该字符串是否满足正则表达式的规则。 发现过滤空格&#x…

xss之DOM破坏

文章目录 DOM破坏漏洞的复现https://xss.pwnfunction.com/基于bp学院DOM破坏漏洞复现思路分析实现 常见的xss触发的标签没有过滤的情况存在过滤的情况 DOM破坏 DOM破坏就是⼀种将 HTML 代码注⼊⻚⾯中以操纵 DOM 并最终更改⻚⾯上 JavaScript ⾏为的技术。 在⽆法直接 XSS的情…

牛客JS题(四十五)数组去重

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; set的灵活用法去除的判别标准 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><style>/* 填写样式 */</style></head><bo…

【Docker】Docker Compose(容器编排)

一、什么是 Docker Compose docker-compose 是 Docker 官方的开源项目&#xff0c;使用 python 编写&#xff0c;实现上调用了 Docker 服务的 API 进行容器管理及编排&#xff0c;其官方定义为定义和运行多个 Docker 容器的应用。 docker-compose 中有两个非常重要的概念&…

趣映 v2.3.8 高级版 剪映替代品 解锁会员功能

看到名字&#xff0c;想必很多网友会联想到剪映&#xff0c;没错&#xff0c;趣映也是一款类似剪映的视频编辑工具。趣映为用户提供了全面的视频编辑和制作&#xff0c;更专注于动画视频制作的软件。功能齐全&#xff0c;操作简单&#xff0c;可以帮助用户从灵感创作到成片输出…

MYSQL----表的创建

1.创建表 create table 表名&#xff08; field1 datetype, field2 datetype, field3 datetype &#xff09; 1.field字段名&#xff0c;也就是属性&#xff0c;相当于java类里面的成员属性 2.datetype 数据类型 3.最后一个字段的定义&#xff0c;结束没有逗号 4.字段的定义在…

【学习总结】JVM篇

JVM JVM基础知识 主力机型 HotSpot VM HotSpot虚拟机时OpenJDK和OracleJDK中默认的Java虚拟机。它最初并非由Sun公司所开发&#xff0c;而是由一家名为“Longview Technologies”的小公司设计。Sun公司注意到这款虚拟机在即时编译等多个方面有着优秀的理念和实际成果&#…

解决问题:Arcgis10.8“数据“-“导出至CAD“时就卡死了

问题现象&#xff1a;我们在使用Arcgis10.8软件&#xff0c;执行 “数据导出至CAD”操作时&#xff0c;会出现卡死的情况&#xff0c;步骤如下图所示&#xff1a; 解决方案&#xff1a;在菜单栏依次选择“地理处理”-“地理处理选项”&#xff0c;然后在“后台处理”和“发生错…

金价多次尝试刷新最高纪录,美国零售销售数据是绊马索

金价一直在试探新高&#xff0c;该纪录为每盎司2,485美元。而且&#xff0c;强劲的美国零售销售报告正在阻止金价的上涨。 由于强大的阻力&#xff0c;金价无法继续上涨。一周的净空头头寸大增。 发布了强于预期的美国零售销售报告后&#xff0c;金价承受了压力。期望的50个基…

递归--数据结构--黑马

递归 总结一句话&#xff0c;上手直接多刷Leetcode&#xff0c;比看这个更有用。 定义 递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集。 例如&#xff0c;单链表递归遍历的例子&#xff1a; void f(Node node) {if (node null) {retu…

Ubuntu18.04 配置EtherCAT主站IGH SOEM

IGH IGH 是开源的EtherCAT 主站软件 一、安装依赖 sudo apt update sudo apt install build-essential linux-headers-$(uname -r) mercurial autoconf libtool 也不知道安装的完全不完全 uname -r 可以查看内核&#xff0c;我安装的ubuntu18.04的内核版本是 5.4.0-84-gen…

Koa商城项目-轮播图模块(后端)

前言 通过这次独自做前后端发现有很多需要提升的地方&#xff0c;很多细节处理不到位。下面简单看一下本人自己做的效果吧~~ Git地址 https://gitee.com/ah-ah-bao/koa_system 效果图 后端逻辑分析 首先编写route->banner.router.js /*** author: zxb* date: 2024-08-06…

k8s 部署polardb-x集群

前言 体验了基于源码构建的部署polardb-x 单机部署&#xff0c;当然也想体验性能更好的完全分布式集群。这边文章将重点介绍如何部署polardb-x集群 简介 PolarDB-X 是一款面向超高并发、海量存储、复杂查询场景设计的云原生分布式数据库系统。其采用 Shared-nothing 与存储计…

二叉树详解(1)

文章目录 目录1. 树的概念及结构1.1 树的相关概念1.2 树的表示1.3 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2. 二叉树的概念及结构2.1 概念2.2 特殊的二叉树2.3 二叉树的存储结构 3. 二叉树的顺序结构及实现3.1 二叉树的顺序结构3.2 堆的概念及结构…

Ubuntu基础使用

1.首先我们先获取ubuntu的操作相同其中也分为4部分&#xff1a; 1.云服务器。在服务器里面我们可以去选择3种服务器分别为阿里云&#xff0c;腾讯云&#xff0c;华为云&#xff0c;这3个&#xff0c;有服务器才可以进去进行操作。 2.双系统。双系统有一个特点就是只能同时启动一…

机器学习:线性回归算法(一元和多元回归代码)

1、线性回归 1、数据准备&#xff1a; 描述如何获取和准备数据。 2、图像预处理&#xff1a; 包括图像读取。 3、将数据划分为训练集和测试集。 4、计算数据的相关系数矩阵。 5、模型训练&#xff1a; 详细说明如何使用线性回归算法训练模型&…

AI视频创作原理

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…