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

news2024/9/22 3:38:47

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 * weights
    X_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_error

def projected_gradient_descent(X, y, lambda_reg, alpha=0.01, num_iters=1000):
    m, n = X.shape
    theta = np.zeros(n)
    
    for _ in range(num_iters):
        gradient = -2 * X.T @ (y - X @ theta) / m
        theta -= 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.coloradmin.cn/o/2051495.html

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

相关文章

Linux系统中的弹性计算功能

在当今数字化时代,弹性计算已经成为信息技术领域的重要概念之一。弹性计算指的是根据需要自动调整计算资源,以满足应用程序的需求。这种灵活性和自适应性使得弹性计算成为了云计算、大数据、人工智能等领域的核心技术之一。在这个领域中,Linu…

嵌入式软件--数电基础 DAY 4

1.SR锁存器 1》四种状态: S R Q Q set状态: 0 1 1 0 Reset状态: 1 0 0 1 维持状态: 1 1 维持上个状态 无意义状态…

VUE中出现Cannot find module ‘@/api/xxx.js‘ or its corresponding type declarations

在使用VSCode编写Vue程序时发现之前使用以下代码时却报出了错误 import {getEmployeeList} from /api/employee\ 保证文件地址正确且其中的方法也可以正常调用,只是报出了错误,该行代码上加入一个‘//ts-ignore’就可以解决。 修改后的代码 //ts-ig…

【mkdir rmdir】Centos/Linux mkdir rmdir命令详细介绍

【mkdir & rmdir】Centos/Linux mkdir & rmdir命令详细介绍 简介 mkdir rmdir 简介 mkdir 命令和 rmdir 命令是在 linux 当中比较常用的两个命令,这两个命令前者是创建空目录,后者是删除空目录。rmdir 命令的定位比较尴尬它的功能可以被 rm 命…

探索 Resolume Arena 7 - 引领 VJ 音视频创作的卓越软件

Resolume Arena 7 是一款专为 Mac 和 Windows 系统设计的强大 VJ 音视频软件,为创意专业人士和爱好者提供了丰富而出色的功能。 这款软件拥有直观且用户友好的界面,即使对于初学者来说,也能快速上手并开始创作。其强大的媒体管理功能&#x…

鸿蒙内核源码分析(物理内存篇) | 怎么管理物理内存

如何初始化物理内存? 鸿蒙内核物理内存采用了段页式管理,先看两个主要结构体.结构体的每个成员变量的含义都已经注解出来,请结合源码理解. #define VM_LIST_ORDER_MAX 9 //伙伴算法分组数量,从 2^0,2^1,...&a…

【JavaSec】反序列化初探(配合URLDNS)

JavaSec反序列化初探(配合URLDNS) 文章目录 JavaSec反序列化初探(配合URLDNS)基本demoMap入口类Java反射 基本demo 构建一个demo 实体类: package bli_seri;import java.io.Serializable;public class Person implem…

Crawlab 分布式部署指南:从 Scrapy 项目到单文件的全流程详解

crawlab分布式部署 远程服务器环境搭建 同之前gerapy分布式部署一样 添加服务器防火墙端口 redis:6379mysql:3306mogodb:27017scrapyd:6800crawlab:8080 访问crawlab服务:47.93.10.129 连接远程数据库 …

Unity Dots学习 (一)

先学习怎么使用,再研究底层代码。Dots大家都有所耳闻。一直没时间研究,最近研究一下 看上图可知,哪怕是CPU的第三级缓存也比内存要快2-5倍。 资料: 《DOTS之路》第零节——前导课(1)——DOTS的5W1H问题_哔哩哔哩_bilibili 《DOT…

javaweb的新能源充电系统pf

TOC springboot339javaweb的新能源充电系统pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域…

SVG中的paint-order属性实现文字描边

过去只支持 SVG 元素 paint-order&#xff0c;表示绘制的顺序。 对于一个图形的绘制&#xff0c;顺序还是非常重要的。例如用SVG来绘制一个带边框的矩形 <style>rect{fill: #FFE8A3;stroke: #9747FF;stroke-width: 4;} </style><svg viewBox"0 0 300 30…

XSS-DOM

文章目录 源码SVG标签Dom-Clobbringtostring 源码 <script>const data decodeURIComponent(location.hash.substr(1));;const root document.createElement(div);root.innerHTML data;// 这里模拟了XSS过滤的过程&#xff0c;方法是移除所有属性&#xff0c;sanitize…

[数据集][图像分类]波色绝缘子缺失分类数据集1440张2类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;1440 分类类别数&#xff1a;2 类别名称:["missing","norma…

轻量高效的ControlNet开源 | ControlNetXt:支持主流生成架构,可与LoRA无缝集成!

当前的可控生成方法如ControlNet、Adapaters和ReferenceNet等通常需要大量额外的计算资源&#xff0c;尤其是对于视频生成&#xff0c;并且在训练中面临挑战或表现出较弱的控制力。 对此&#xff0c;港中文提出了一种轻量级可控模块&#xff1a;ControlNeXt&#xff0c;这是一…

PCIe Linux MRRS和MPS参数设置策略

1.概述 MPS&#xff08;Max Payload Size&#xff09;和MRRS&#xff08;Max Read Request Size&#xff09;共同影响PCIe总线的传输效率。如果MPS和MRRS设置的过小&#xff0c;传输相同长度的数据&#xff0c;需要更多的TLP报文&#xff0c;导致PCIe总线传输效率降低&#xf…

PHP多项目多场景排队叫号系统源码

&#x1f514;&#x1f4c8;多项目多场景排队叫号系统&#xff0c;让等待也高效有序&#xff01; 一、告别无序等待&#xff0c;智能排队新风尚 你是否曾在医院、银行或政务大厅等地方&#xff0c;面对冗长的队伍感到无奈&#xff1f;多项目多场景排队叫号系统&#xff0c;正…

Mybatis的分页,延迟加载和缓存

目录 分页&#xff1a; 方式一&#xff1a;利用 limit 实现物理分页 利用limit的关键字分页 方式二&#xff1a;RowBounds集合逻辑分页 方式三&#xff1a;插件分页 延迟加载和立即加载&#xff1a; 什么是立即加载&#xff1a; 什么是延迟加载 延迟加载的配置 缓存&a…

XSS漏洞洞讲解

目录 一、XSS漏洞的定义 1.什么是XSS漏洞&#xff1f; 二、XSS漏洞的类型 1.反射型 XSS 2.DOM型 XSS 3.存储型 XSS 三、实战案例演练 第1关 Ma Spaghet 第2关 Jefff 第3关 Ugandan Knuckles 第4关 Ricardo Milos 第5关 Ah Thats Hawt 第6关 Ligma ​第7关 Mafia …

c++ 使用Tesseract5.0 识别图片文字示例

Tesseract5.0相对于旧版本的程序&#xff0c;识别精准度会提升不少&#xff0c;如下&#xff1a; 1、示例1&#xff1a; 图片&#xff1a; 结果&#xff1a; 2、示例2&#xff1a; 图片&#xff1a; 结果&#xff1a; c代码如下&#xff1a; #include <iostream> #in…

C++ 设计模式——建造者模式

建造者模式 建造者模式组成部分建造者模式使用步骤1. 定义产品类2. 创建具体产品类3. 创建建造者接口4. 实现具体建造者5. 创建指挥者类6. 客户端代码 建造者模式 UML 图建造者模式 UML 图解析建造者模式的优缺点建造者模式的适用场景完整代码 建造者模式 建造者模式&#xff…