机器学习基石作业二中的DECISION_STUMP实现

        概要:在林老的题目描述中,DECISION_STUMP(其实就是“决策桩”,也就是只有一层的决策树)。题目中提到了\theta的选去是把属性(一维的)按照从小到大的顺序排列以后取两个挨着的值的平均值,网上有人的实现会在开头和结尾的值手动去加一个小于最小的值,一个大于最大的值;添加的两个值的大小是多大合适,这是个问题。带来的另外一个问题就是,解释性变差了;就像《西瓜书》上说的,我们按西瓜的甜度区分西瓜的好坏,你收集到了甜度值是 0.1,0.2,.0.5,0.6,0.9(忽略了好瓜、坏瓜的标志),但最后你用了0.35(假设算法取在了0.2和0.5之间)作为了区别好瓜和坏瓜的标准,这个值没有在训练数据中出现过,给人的感觉就是:唉,为什么是这个值,怎么得来的?所以《西瓜书》提到了可以直接选择出现的这些值作为\theta,有更好的解释性。当然去均值的方式也是正确的。 但是本人更倾向于直接用出现的值来作为\theta,所以算法中没有对属性进行排序,加一个大于最大以及一个小于最小值(在《西瓜书》中,取均值的时候也没有做这个操作,而是直接排序,然后就取两个相邻值的平均值作为\theta了)、取平均值的操作。

     举例:有1,3, 2三个值:

(1)按照从小到大的顺序排列以后取两个挨着的值的平均值:1\theta\theta 3;会得到2个\theta

(2)按照从小到大的顺序排列以后取两个挨着的值的平均值,在开头和结尾的值手动去加一个小于最小的值,一个大于最大的值:0  \theta\theta 2  \theta 3  \theta 4;会得到4个\theta.

(3)直接取值,得到3个\theta

这三种方式有所区别,但对结果其实没什么影响。下面的代码使用的是(3)

 util.py(公共方法,加载数据用的)

# -*- coding:utf-8 -*-
# Author: Evan Mi
import numpy as npdef load_data(file_name):x = []y = []with open(file_name, 'r+') as f:for line in f:line = line.rstrip("\n")temp = line.split(" ")temp.insert(0, '1')x_temp = [float(val) for val in temp[:-1]]y_tem = [int(val) for val in temp[-1:]][0]x.append(x_temp)y.append(y_tem)nx = np.array(x)ny = np.array(y)return nx, ny
decision_stump_one_dimension.py(对应一维的问题)
# -*- coding:utf-8 -*-
# Author: Evan Mi
import numpy as npdef sign_zero_as_neg(x):"""这里修改了np自带的sign函数,当传入的值为0的时候,不再返回0,而是-1;也就是说在边界上的点按反例处理:param x::return:"""result = np.sign(x)result[result == 0] = -1return resultdef data_generator(size):"""生成[-1, 1)之间的随机数, 然后加入20%的噪声,即20%的概率观测值取了相反数:param size::return:"""x_arr = np.random.uniform(-1, 1, size)y_arr = sign_zero_as_neg(x_arr)y_arr = np.where(np.random.uniform(0, 1, size) < 0.2, -y_arr, y_arr)print(x_arr)print(y_arr)return x_arr, y_arrdef err_in_counter(x_arr, y_arr, s, theta):"""计算E_in:param x_arr:[[x1, x2, x3, ... ,xn][x1, x2, x3, ... ,xn][x1, x2, x3, ... ,xn]...[x1, x2, x3, ... ,xn]]:param y_arr:[[y1, y2, y3, ... ,yn][y1, y2, y3, ... ,yn][y1, y2, y3, ... ,yn]...[y1, y2, y3, ... ,yn]]:param s:{-1,1}:param theta:[[theta1, theta1, theta1, ... ,theta1][theta2, theta2, theta2, ..., theta2][theta3, theta3, theta3, ..., theta3]...[thetak, thetak, thetak, ..., thetak]]:return:[err_theta1, err_theta2, ..., err_thetak] 中最小的以及下标"""result = s * sign_zero_as_neg(x_arr - theta)err_tile = np.where(result == y_arr, 0, 1).sum(1)return err_tile.min(), err_tile.argmin()def err_out_calculator(s, theta):return 0.5 + 0.3 * s * (abs(theta) - 1)def decision_stump_1d(x_arr, y_arr):theta = x_arrtheta_tile = np.tile(theta, (len(x_arr), 1)).Tx_tile = np.tile(x_arr, (len(theta), 1))y_tile = np.tile(y_arr, (len(theta), 1))err_pos, index_pos = err_in_counter(x_tile, y_tile, 1, theta_tile)err_neg, index_neg = err_in_counter(x_tile, y_tile, -1, theta_tile)if err_pos < err_neg:return err_pos / len(y_arr), err_out_calculator(1, theta[index_pos])else:return err_neg / len(y_arr), err_out_calculator(-1, theta[index_neg])if __name__ == '__main__':avg_err_in = 0avg_err_out = 0for i in range(5000):x, y = data_generator(20)e_in, e_out = decision_stump_1d(x, y)avg_err_in = avg_err_in + (1.0 / (i + 1)) * (e_in - avg_err_in)avg_err_out = avg_err_out + (1.0 / (i + 1)) * (e_out - avg_err_out)print("e_in:", avg_err_in)print("e_out:", avg_err_out)
decision_stump_multi_dimension.py(对应多维的问题)
# -*- coding:utf-8 -*-
# Author: Evan Mi
import numpy as np
from decison_stump import utildef sign_zero_as_neg(x):"""这里修改了np自带的sign函数,当传入的值为0的时候,不再返回0,而是-1;也就是说在边界上的点按反例处理:param x::return:"""result = np.sign(x)result[result == 0] = -1return resultdef err_in_counter(x_arr, y_arr, s, theta):"""计算E_in:param x_arr:[[x1, x2, x3, ... ,xn][x1, x2, x3, ... ,xn][x1, x2, x3, ... ,xn]...[x1, x2, x3, ... ,xn]]:param y_arr:[[y1, y2, y3, ... ,yn][y1, y2, y3, ... ,yn][y1, y2, y3, ... ,yn]...[y1, y2, y3, ... ,yn]]:param s:{-1,1}:param theta:[[theta1, theta1, theta1, ... ,theta1][theta2, theta2, theta2, ..., theta2][theta3, theta3, theta3, ..., theta3]...[thetak, thetak, thetak, ..., thetak]]:return:[err_theta1, err_theta2, ..., err_thetak] 中最小的以及下标"""result = s * sign_zero_as_neg(x_arr - theta)err_tile = np.where(result == y_arr, 0, 1).sum(1)return err_tile.min(), err_tile.argmin()def err_out_counter(x_arr, y_arr, s, theta, dimension):temp = s * sign_zero_as_neg(x_arr.T[dimension] - theta)e_out = np.where(temp == y_arr, 0, 1).sum() / np.size(x_arr, 0)return e_outdef decision_stump_1d(x_arr, y_arr):theta = x_arrtheta_tile = np.tile(theta, (len(x_arr), 1)).Tx_tile = np.tile(x_arr, (len(theta), 1))y_tile = np.tile(y_arr, (len(theta), 1))err_pos, index_pos = err_in_counter(x_tile, y_tile, 1, theta_tile)err_neg, index_neg = err_in_counter(x_tile, y_tile, -1, theta_tile)if err_pos < err_neg:return err_pos / len(y_arr), index_pos, 1else:return err_neg / len(y_arr), index_neg, -1def decision_stump_multi_d(x, y):x = x.Tdimension, e_in, theta, s = 0, float('inf'), 0, 0for i in range(np.size(x, 0)):e_in_temp, index, s_temp = decision_stump_1d(x[i], y)if e_in_temp < e_in:dimension, e_in, theta, s = i, e_in_temp, x[i][index], s_temp# 错误率相等的时候随机选择if e_in_temp == e_in:pick_rate = np.random.uniform(0, 1)if pick_rate > 0.5:dimension, e_in, theta, s = i, e_in_temp, x[i][index], s_tempreturn dimension, e_in, theta, sif __name__ == '__main__':x_train, y_train = util.load_data('data/train.txt')x_test, y_test = util.load_data('data/test.txt')determined_dimension, e_in_result, theta_result, s_result = decision_stump_multi_d(x_train, y_train)print("E_IN:", e_in_result)print("E_OUT:", err_out_counter(x_test, y_test, s_result, theta_result, determined_dimension))

  详细项目代码及代码使用的数据见:DECISION_STUMP

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

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

相关文章

【MM系列】SAP 关于更改物料的价格控制类型

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【MM系列】SAP 关于更改物料的价格控制类型前言部分 大家可以关注我的公众号&#xff0c;公众号里的排版更好&#xff0c;阅读更舒适…

机器学习基石-作业三-第2题分析以及通过H证明EIN的讨论

题目&#xff1a; 这是机器学习基石作业三种的第二小题&#xff0c;额&#xff0c;在网上看了很多解答&#xff08;解答也不多&#xff09;感觉都没有说清楚为什么&#xff0c;所以励志清楚滴解决一下这个问题&#xff0c;经过努力&#xff0c;自认为得到了详细的解答&#xff…

Nginx的平滑升级记录---适用于编译安装的Nginx

一、查看自己的Nginx的版本号 [rootlocalhost sbin]# cd /usr/local/nginx/sbin/ [rootlocalhost sbin]# ls nginx [rootlocalhost sbin]# ./nginx -V nginx version: nginx/1.15.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) configure arguments: 二、确定自己要…

02(c)多元无约束优化问题-牛顿法

此部分内容接《02(a)多元无约束优化问题》&#xff01; 第二类&#xff1a;牛顿法(Newton method) \[f({{\mathbf{x}}_{k}}\mathbf{\delta })\text{ }\approx \text{ }f({{\mathbf{x}}_{k}}){{\nabla }^{T}}f({{\mathbf{x}}_{k}})\cdot \mathbf{\delta }\frac{1}{2}{{\mathbf{\…

推荐系统浅浅的例子

对于推荐系统&#xff0c;有很多的很强大的算法。这里作为练习&#xff0c;只介绍基本的协同过滤算法&#xff08;userbased&#xff09;和FM&#xff08;通过梯度下降的角度&#xff0c;还可以通过交替优化的角度来看&#xff09;。 这里的例子是在七月算法的视频中看的&#…

TPL Dataflow .Net 数据流组件,了解一下?

回顾上文 作为单体程序&#xff0c;依赖的第三方服务虽不多&#xff0c;但是2C的程序还是有不少内容可讲&#xff1b; 作为一个常规互联网系统&#xff0c;无外乎就是接受请求、处理请求&#xff0c;输出响应。 由于业务渐渐增长&#xff0c;数据处理的过程会越来越复杂和冗长&…

推荐系统实例

协同过滤与隐语义模型 在机器学习问题中&#xff0c;我们见到的数据集通常是如下的格式&#xff1a; input target ... ... &#xff0c;一个输入向量的集合以及对应的数据集合,就是我们想要去预测的值。 对于…

【转】深入理解JavaScript闭包(closure)

文章来源&#xff1a;http://www.felixwoo.com/archives/247 最近在网上查阅了不少Javascript闭包(closure)相关的资料&#xff0c;写的大多是非常的学术和专业。对于初学者来说别说理解闭包了&#xff0c;就连文字叙述都很难看懂。撰写此文的目的就是用最通俗的文字揭开Java…

从头开始建立神经网络翻译及扩展

目录翻译从头开始建立神经网络-简介导包和配置生成一个数据集实现用来展示决策边界的辅助函数Logistic Regression训练一个神经网络我们的神经网络如何进行预测学习神经网络的参数实现神经网络训练一个隐层有3个神经元的神经网络验证隐层神经元个数对神经网络的影响练习练习题解…

对比 C++ 和 Python,谈谈指针与引用

花下猫语&#xff1a;本文是学习群内 樱雨楼 小姐姐的投稿。之前已发布过她的一篇作品《当谈论迭代器时&#xff0c;我谈些什么&#xff1f;》&#xff0c;大受好评。本文依然是对比 C 与 Python&#xff0c;来探讨编程语言中极其重要的概念。祝大家读有所获&#xff0c;学有所…

《吴恩达深度学习》第一课第四周任意层的神经网络实现及BUG处理

目录一、实现1、吴恩达提供的工具函数sigmoidsigmoid求导relurelu求导2、实现代码导包和配置初始化参数前向运算计算损失后向运算更新参数组装模型3、问题及思考一、实现 1、吴恩达提供的工具函数 这几个函数这里只是展示一下&#xff0c;这是吴恩达写好的工具类&#xff0c;…

球形坐标和Cartesian 坐标的转换 spherical coordinate

spherical coordinate 和cartesian坐标的转换&#xff0c; 个人认为在控制camera的时候最为有用&#xff0c;比如CS中的操作方式&#xff0c; 鼠标负责方向的改变&#xff0c;其恰恰就是球形坐标的改变。而camera的位置改变就是cartesian的改变&#xff0c;所以这两者的转换就必…

【HANA系列】SAP HANA Studio出现Fetching Children...问题

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【ABAP系列】SAP HANA Studio出现"Fetching Children..."问题前言部分 大家可以关注我的公众号&#xff0c;公众号里的排版…

朴素Bayse新闻分类实践

目录1、信息增益&#xff08;互信息&#xff09;介绍&#xff08;1&#xff09;西瓜书中的信息增益[^1]&#xff08;2&#xff09;PRML中的互信息[^2]&#xff08;3&#xff09; 其实他们是一个东西2、朴素Bayse新闻分类[^3]&#xff08;1&#xff09;常量及辅助函数&#xff0…

【数据仓库】OLTP系统和OLAP系统区别

OLTP&#xff1a;联机事务处理系统(OnLine Transaction Processing) OLAP&#xff1a;联机分析处理系统(OnLine Analytical Processing) 参考文档&#xff1a; 操作数据库系统(OLTP)和联机分析处理系统(OLAP)的区别转载于:https://www.cnblogs.com/badboy200800/p/11189478.htm…

Good Numbers(HDU5447+唯一分解)

题目链接 传送门 题面 题意 首先定义对于\(k\)的好数\(u\)&#xff1a;如果\(u\leq k\)且\(u\)的所有质因子与\(k\)的质因子一样则称\(u\)对于\(k\)是一个好数。 现给你两个数\(k1,k2(1\leq k1,k2\leq 10^{24})\)&#xff0c;要你求\(k1,k2\)的好数个数&#xff0c;对于\(k1,k2…

从机器码到面向对象

1.从机器码到面向对象 本章节主要探讨是什么驱动着编程从机器码发展到了汇编语言&#xff0c;又从汇编语言发展到了面向过程编程&#xff0c;最后从面向过程编程发展到面向对象编程。通过这些探讨最终明确多年来的软件工程发展我们都解决了哪些棘手的问题。 1.1机器码 在真正…

spfa_队列

spfa:1.当给定的图存在负权边时&#xff0c;Dijkstra等算法便没有了用武之地&#xff0c;而Bellman-Ford算法的复杂度又过高&#xff0c;SPFA算法便派上用场了.2.我们约定有向加权图G不存在负权回路&#xff0c;即最短路径一定存在3.思路&#xff1a;用数组d记录每个结点的最短…

Tomcat配置解析

Tomcat文件配置 tomcat解压后目录 bin&#xff1a;可执行文件&#xff08;startup.bat shutdown.bat) conf&#xff1a;配置文件&#xff08;server.xml&#xff09; lib&#xff1a;tomcat依赖的jar文件 log&#xff1a;日志文件&#xff08;记录出错等信息&#xff09; temp&…

教你配置安全的ProFTPD服务器(中)

二、 基本加固ProFTPD服务器步骤 1.升级版本 注&#xff1a;如果当前版本已经是最新版本&#xff0c;可以跳过第一步。 升级陈旧的ProFTPD版本&#xff0c;因为早期的ProFTPD版本存在的安全漏洞。对于一个新配置的ProFTPD服务器来说使用最新稳定版本是最明智的选择&#xff0c;…