11.1 编程实现 Relief 算法,并在西瓜数据集上测试。

Relief 是过滤式特征选择算法,根据设计的 “相关统计量” 来度量特征的重要性。该方法和后续的学习器无关,只根据数据集就可完成特征选择。相关的思想理论介绍见书P249-250

代码实现如下:

import pandas as pd
import numpy as npclass Relief:def readData(self):dataset = pd.read_excel('./WaterMelon_3.0.xlsx',encoding = 'gbk')  # 读取数据self.Attributes = dataset.columns[1:-1]        #所有属性的名称#print(self.Attributes)dataset = np.matrix(dataset)dataset = dataset[:,1:]m,n = np.shape(dataset)      # 得到数据集大小#print(dataset)dataset[:,n-3:n-1] = (dataset[:,n-3:n-1]-np.min(dataset[:,n-3:n-1],0))/\(np.max(dataset[:,n-3:n-1],0)-np.min(dataset[:,n-3:n-1],0))     # 连续属性规范化self.goodindex = np.where(dataset[:,n-1]=='是')[0]        # 好瓜的索引self.badindex = np.where(dataset[:,n-1]=='否')[0]         # 坏瓜的索引self.dataset = dataset# 计算每个样本之间的距离def getDist(self):m,n = np.shape(self.dataset)distance = np.ones([m,m])for i in range(m):distance[i,i] = np.inffor j in range(i+1,m):dis = 0for k in range(n-1):if type(self.dataset[i,k])== str:        # 离散属性dis = dis + 1 - np.int(self.dataset[i,k]==self.dataset[j,k])else:                                   # 连续属性dis = dis + pow((self.dataset[i,k]-self.dataset[j,k]),2)distance[i,j] = disdistance[j,i] = disself.distance = distance# 过滤def fliter(self):m,n = np.shape(self.dataset)delte = np.zeros([n-1])for i in range(m):    # 依次对每一个样本进行delte = delte + self.getdelet(i)return delte# 计算一个样本中所有属性的权值deltedef getdelet(self,i):m,n = np.shape(self.dataset)distance = self.distance[i,:]            # 该样本i到每一个样本的距离gooddis = distance[self.goodindex]       # 到好瓜距离baddis = distance[self.badindex]         # 到坏瓜距离good = dict(zip(gooddis,self.goodindex))     # 生成字典,键为距离,值为样本索引bad = dict(zip(baddis,self.badindex))if self.dataset[i,-1] == '是':               # 样本i是好瓜minh = np.min(gooddis)       # 同类中最小距离indexh = good[minh]          # 最小距离对应的样本索引minm = np.min(baddis)        # 不同类中最小距离indexm = bad[minm]           # 不同类中最小距离对应的索引else:minh = np.min(baddis)       # 同类indexh = bad[minh]minm = np.min(gooddis)      # 不同类indexm = good[minm]delte = []for j in range(n-1):           # 遍历每一个属性,进行计算if type(self.dataset[i,j])== str:     # 离散属性dh = 1 - np.int(self.dataset[i,j]==self.dataset[indexh,j])     # 同类dm = 1 - np.int(self.dataset[i,j]==self.dataset[indexm,j])     # 不同类else:                                # 连续属性dh = np.float64(pow((self.dataset[i,j]-self.dataset[indexh,j]),2))   # 同类dm = np.float64(pow((self.dataset[i,j]-self.dataset[indexm,j]),2))   # 不同类delte.append(-dh+dm)return delte                    # 返回的是样本i计算得到的每一个属性上的权值def getAttr(self,delte):dic = dict(zip(self.Attributes,delte))       # 得到字典dd = sorted(dic.items(),key=lambda item:item[1],reverse=True)      # 根据值的大小进行排序,倒序for i,j in dd:print(i+':'+str(j),end='\t')def main():relief = Relief()relief.readData()relief.getDist()delte = relief.fliter()relief.getAttr(delte)if __name__ == '__main__':main()

最终得到的每个属性的权值(重要性程度)如下:

纹理:9.0   脐部:7.0  根蒂:4.0  含糖率:2.04491655411   密度:-0.500966445714  敲声:-1.0 触感:-4.0 色泽:-7.0 

11.2 Relief-F 算法描述

输入:数据集D过程:
1. 将数据集中连续属性取值规范化到[0,1]
2. 计算数据集D中各类样本所占的比例 p_l
3. 计算数据集D中每一对样本之间的距离distance
4. thete = [0,0,……,0] , 表示每一个属性的权值
5. for x_i in D:
6.     d_nh,d_nm = [0,0,……,0]  , 表示通过样本 x_i 在所有属性上计算得到的权值,对应于式11.4的前后两部分
7.     根据distance矩阵找出每个分类类别中与 x_i 距离最近的样本,构成集合 xmin
8.     for x_j in xmin:
9.          if(x_i和x_j类别相同):d_nh = diff(x_i,x_j)^2
10.         else: d_nm = d_nm + p_l * diff(x_i,x_j)^2       其中,p_l是x_j 所在类别的比例
11.    thete = thete + (-d_nh+d_nm)输出:thete

11.3  设计一个可以考虑每一对属性重要性的改进算法。

可以将所有的属性两两配对,然后将其看成一个整体,将整体带入类似于原来的 Relief 算法中进行运算,最终得到针对每一对的权重,即可实现每一对属性重要性的衡量。     (好像有点 low, 但是确实想不到其他的好的方法,如有什么新的思路还请指教!)

11.4  设计一个算法,即便有运行时间限制,LVW 算法也一定能给出解。

该算法的结束条件是 连续 t 次随机产生的特征子集在学习器上的效果都比当前的特征子集差。但是当数据集和特征集都很大时,这个条件很难满足,所以为了可以在规定的时间内结束算法,我们可以再人为设定一个最大的迭代次数,当达到最大的迭代次数之后,不论当前状态如何,都将当前的最佳特征子集返回。

11.5  L1正则化在何种情形下不能产生稀疏解。

L1正则化之所以可以产生稀疏解,主要是因为平方误差项等值线与L1等值线的第一个交点位于坐标轴上,如书上图11.2所示,当平方误差项等值线的曲率比较大时,就会导致其与L1等值线的第一个交点不再位于坐标轴上,此时就无法产生稀疏解。

11.6  试述岭回归和SVM的联系。

相同点: 两者的优化目标中都有权重参数项,都想得到较小的权重。

不同点:

岭回归的目标函数主要是 累积平方误差,主要的目的是减小这个误差。而后面加的权重参数项只是一个正则化的手段,以此来防止过拟合。整体上看就是想要实现  在尽量小的权重参数取值下尽可能地降低累积平方误差,两者之间通过系数进行权衡。

SVM则不同,它是直接将权重参数的二范数作为优化目标,没有考虑累积平方误差,而对应的约束条件是保证每一个样本和分隔线之间具有足够的间隔。 所以整体上是为了实现  在保证所有的样本都可以以指定的间隔分离的条件下(必须达到这个条件),取具有最小二范数值的权重参数。  所以,SVM 的优化目标决定了样本必须线性可分,否则就无法实现。

11.7 直接求解 L0 范数正则化会遇到的困难。

L0 范数是不连续的,而且是非凸函数,无法通过优化直接求解,必须采用遍历的方式,因此导致这个问题是个NP难问题。

11.8  L1范数求解最小化问题式 11.14 的推导。

参考自: https://blog.csdn.net/icefire_tyh/article/details/52254580

11.9 试述字典学习与压缩感知对稀疏稀疏性利用的异同。

字典学习使样本转化为稀疏表示的形式,是为了利用稀疏性来使学习任务得到简化,使模型的复杂度得到降低,从而可以学习到一个对于当前的学习任务比较好的一个学习器。

而压缩感知主要是想利用信号本身所具有的稀疏性,从而实现从部分观测样本中恢复出原始信号的目的。

西瓜书课后题——第十一章(特征选择与稀疏学习)相关推荐

  1. 《机器学习》周志华(西瓜书)学习笔记 第十一章 特征选择与稀疏学习

    机器学习 总目录 第十一章 特征选择与稀疏学习 11.1 子集搜索与评价 给定属性集,其中有些属性可能很关键.很有用,另一些 属性则可能没什么用.我们将属性称为"特征" (feat ...

  2. 西瓜书课后题——第七章(贝叶斯分类器)

    课后题7.1:极大似然估计西瓜数据集3.0前3个属性的类条件概率. 其实就是概率论中常见的极大似然估计问题. 参见这篇博客:https://blog.csdn.net/icefire_tyh/arti ...

  3. 机器学习(周志华) 第十一章特征选择与稀疏学习

    关于周志华老师的<机器学习>这本书的学习笔记 记录学习过程 本博客记录Chapter11 文章目录 1 子集搜索与评价 2 过滤式选择 3 包裹式选择 4 嵌入式选择与L1正则化 5 稀疏 ...

  4. 《机器学习》第十一章 特征选择与稀疏学习

    特征选择从多个特征中选出对学习有用的特征以实现降低维度,增加准确率的目的. 选择子集和对子集进行评价是重要的两步,本章主要介绍了过滤式选择,包裹式选择以及嵌入式选择等方法: 过滤式选择利用相关统计量在 ...

  5. 第十一章 特征选择与稀疏学习

    11.1 子集搜索与评价 我们将属性称为特征,对当前学习任务有用的属性称为相关特征.没什么用的属性称为无关特征.还有一类特征称为冗余特征,它们所包含的信息能从其他特征中推演出来,冗余特征在很多时候不起 ...

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

    目录 子集搜索与评价 过滤式选择 包裹式选择 嵌入式选择与L1正则化 稀疏表示与字典学习 压缩感知 子集搜索与评价 我们先来理解以下概念: 相关特征:对当前学习任务有用的属性: 无关特征:对当前学习任 ...

  7. 机器学习入门-西瓜书总结笔记第十一章

    西瓜书第十一章-特征选择与稀疏学习 一.子集搜索与评价 二.过滤式选择 三.包裹式选择 四.嵌入式选择与 L 1 L_1 L1​正则化 五.稀疏表示与字典学习 六.压缩感知 一.子集搜索与评价 将属性 ...

  8. 机器学习第11章 特征选择与稀疏学习

    第十一章 特征选择与稀疏学习 11.1 子集搜索与评价 ​ 对当前学习任务有用的属性称为"相关特征 ".没什么用的属性称为"无关特征".从给定的特征集合中选择出 ...

  9. 《机器学习》阅读心得——十一、特征选择和稀疏学习

    十一.特征选择和稀疏学习 11.1 子集搜索和评价   对一个学习任务来说,给定属性集,其中有些属性可能很关键,另一些属性可能没什么用,我们将属性称为"特征",对当前学习任务有用的 ...

最新文章

  1. cannot find package “github.com/json-iterator/go“cannot find package “github.com/modern-go/reflect2“
  2. AVR开发 Arduino方法(附四) 参考文献与网址
  3. vue 拷贝 数组_Vue实现对数组、对象的深拷贝、复制
  4. 基于SSH实现的学生成绩管理系统
  5. 全面学习ORACLE Scheduler特性(5)Schedules调度Programs执行的Jobs
  6. Hystrix之Dashboard的常见问题
  7. 工业交换机单纤或双纤都只是占用一个端口吗?
  8. 基础编程题目集 6-3 简单求和 (10 分)
  9. timerfd_create Function not implemented问题
  10. 简单的代码提交,还能玩出这么多花样?
  11. SpringMVC访问流程
  12. 服务器 16路直连 英特尔,Intel 10nm服务器怪咖:八通道+16条内存
  13. Linux系统下卸载VMware Workstation软件
  14. PTA 7-114 用if-else语句编程百分制成绩转换为五分制成绩
  15. 要么旅行,要么读书,身体和灵魂必须有一个在路上
  16. 文本两端对齐及将表单打印在A4上
  17. java 获取ftp 文件路径_java在浏览器上获取FTP读文件路径
  18. 新手项目经理入坑指南
  19. (43)C#里使用WeifenLuo.WinFormsUI.Docking库时是怎么样保存当前布局?
  20. XSS小游戏的通关之路

热门文章

  1. Docker学习(3)-Docker镜像构建和使用
  2. 攻城狮生活-3 奇怪的司机
  3. LeakCanary使用
  4. QMUI全局样式配置
  5. 安装nvidia显卡驱动报错You appear to be running an X server; please exit X before installing
  6. 关于 GNSS 系统的信号频点频率 + 可用卫星
  7. c java gif 夺宝奇兵_java游戏:将GIF转 字符GIF
  8. FPGA PLL时钟经 ODDR送到管脚
  9. ceres_solver解PnP平差问题、Matlab数据制作
  10. Mac homebrew 资源下载加速设置