西瓜书课后题——第十一章(特征选择与稀疏学习)
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 试述字典学习与压缩感知对稀疏稀疏性利用的异同。
字典学习使样本转化为稀疏表示的形式,是为了利用稀疏性来使学习任务得到简化,使模型的复杂度得到降低,从而可以学习到一个对于当前的学习任务比较好的一个学习器。
而压缩感知主要是想利用信号本身所具有的稀疏性,从而实现从部分观测样本中恢复出原始信号的目的。
西瓜书课后题——第十一章(特征选择与稀疏学习)相关推荐
- 《机器学习》周志华(西瓜书)学习笔记 第十一章 特征选择与稀疏学习
机器学习 总目录 第十一章 特征选择与稀疏学习 11.1 子集搜索与评价 给定属性集,其中有些属性可能很关键.很有用,另一些 属性则可能没什么用.我们将属性称为"特征" (feat ...
- 西瓜书课后题——第七章(贝叶斯分类器)
课后题7.1:极大似然估计西瓜数据集3.0前3个属性的类条件概率. 其实就是概率论中常见的极大似然估计问题. 参见这篇博客:https://blog.csdn.net/icefire_tyh/arti ...
- 机器学习(周志华) 第十一章特征选择与稀疏学习
关于周志华老师的<机器学习>这本书的学习笔记 记录学习过程 本博客记录Chapter11 文章目录 1 子集搜索与评价 2 过滤式选择 3 包裹式选择 4 嵌入式选择与L1正则化 5 稀疏 ...
- 《机器学习》第十一章 特征选择与稀疏学习
特征选择从多个特征中选出对学习有用的特征以实现降低维度,增加准确率的目的. 选择子集和对子集进行评价是重要的两步,本章主要介绍了过滤式选择,包裹式选择以及嵌入式选择等方法: 过滤式选择利用相关统计量在 ...
- 第十一章 特征选择与稀疏学习
11.1 子集搜索与评价 我们将属性称为特征,对当前学习任务有用的属性称为相关特征.没什么用的属性称为无关特征.还有一类特征称为冗余特征,它们所包含的信息能从其他特征中推演出来,冗余特征在很多时候不起 ...
- 机器学习----第十一章特征选择与稀疏学习 学习笔记
目录 子集搜索与评价 过滤式选择 包裹式选择 嵌入式选择与L1正则化 稀疏表示与字典学习 压缩感知 子集搜索与评价 我们先来理解以下概念: 相关特征:对当前学习任务有用的属性: 无关特征:对当前学习任 ...
- 机器学习入门-西瓜书总结笔记第十一章
西瓜书第十一章-特征选择与稀疏学习 一.子集搜索与评价 二.过滤式选择 三.包裹式选择 四.嵌入式选择与 L 1 L_1 L1正则化 五.稀疏表示与字典学习 六.压缩感知 一.子集搜索与评价 将属性 ...
- 机器学习第11章 特征选择与稀疏学习
第十一章 特征选择与稀疏学习 11.1 子集搜索与评价 对当前学习任务有用的属性称为"相关特征 ".没什么用的属性称为"无关特征".从给定的特征集合中选择出 ...
- 《机器学习》阅读心得——十一、特征选择和稀疏学习
十一.特征选择和稀疏学习 11.1 子集搜索和评价 对一个学习任务来说,给定属性集,其中有些属性可能很关键,另一些属性可能没什么用,我们将属性称为"特征",对当前学习任务有用的 ...
最新文章
- cannot find package “github.com/json-iterator/go“cannot find package “github.com/modern-go/reflect2“
- AVR开发 Arduino方法(附四) 参考文献与网址
- vue 拷贝 数组_Vue实现对数组、对象的深拷贝、复制
- 基于SSH实现的学生成绩管理系统
- 全面学习ORACLE Scheduler特性(5)Schedules调度Programs执行的Jobs
- Hystrix之Dashboard的常见问题
- 工业交换机单纤或双纤都只是占用一个端口吗?
- 基础编程题目集 6-3 简单求和 (10 分)
- timerfd_create Function not implemented问题
- 简单的代码提交,还能玩出这么多花样?
- SpringMVC访问流程
- 服务器 16路直连 英特尔,Intel 10nm服务器怪咖:八通道+16条内存
- Linux系统下卸载VMware Workstation软件
- PTA 7-114 用if-else语句编程百分制成绩转换为五分制成绩
- 要么旅行,要么读书,身体和灵魂必须有一个在路上
- 文本两端对齐及将表单打印在A4上
- java 获取ftp 文件路径_java在浏览器上获取FTP读文件路径
- 新手项目经理入坑指南
- (43)C#里使用WeifenLuo.WinFormsUI.Docking库时是怎么样保存当前布局?
- XSS小游戏的通关之路
热门文章
- Docker学习(3)-Docker镜像构建和使用
- 攻城狮生活-3 奇怪的司机
- LeakCanary使用
- QMUI全局样式配置
- 安装nvidia显卡驱动报错You appear to be running an X server; please exit X before installing
- 关于 GNSS 系统的信号频点频率 + 可用卫星
- c java gif 夺宝奇兵_java游戏:将GIF转 字符GIF
- FPGA PLL时钟经 ODDR送到管脚
- ceres_solver解PnP平差问题、Matlab数据制作
- Mac homebrew 资源下载加速设置