算法小白的第一次尝试---BoostingTree(手撕提升树)

提升树(Boosting Tree)原理与案例 学习参考 阅读详情
import org.apache.spark.ml.feature.LabeledPoint
import org.apache.spark.ml.linalg.Vectors
import scala.collection.mutable.ArrayBuffer
/**
  * @author XiaoTangBao
  * @date 2019/3/10 16:00
  * @version 1.0
  * 基于统计学习方法--李航 例8.2 提升树(回归)
  */
object BoostingTree {
  def main(args: Array[String]): Unit = {
    //初始化训练数据
    var orignaldata = ArrayBuffer[LabeledPoint]()
    val arr = Array((1,5.56),(2,5.70),(3,5.91),(4,6.40),(5,6.80),(6,7.05),(7,8.90),(8,8.70),(9,9.00),(10,9.05))
    for(ar <- arr) orignaldata.append(LabeledPoint(ar._2,Vectors.dense(ar._1)))
    //定义切割点
    val cutpoints = ArrayBuffer[Double]()
    for(i <- 0 until arr.length-1) {cutpoints.append(arr(i)._1 + 0.5)}
    //定义满足条件的损失误差Li,当损失误差 <= Li时,退出训练
    val Li = 0.2
    //存放最终训练好的模型
    val modelArr = ArrayBuffer[Double => Double]()
    var flag = true
    while(flag){
      val bestModel = getTree(orignaldata.toArray,cutpoints.toArray)
      modelArr.append(bestModel)
      //更新训练数据data,生成残差表,供下次迭代使用
      for(i<-0 until orignaldata.length ){
        val newLabel = orignaldata(i).label - bestModel(orignaldata(i).features(0))
        orignaldata(i) = LabeledPoint(newLabel,Vectors.dense(orignaldata(i).features(0)))
      }
      //根据残差表计算平方损失误差lx
      var sle = 0.0
      for(s <- orignaldata) sle += math.pow(s.label,2)
      if(sle <= Li) flag = false
    }
    //定义最终的模型
    val finalModel =(x:Double) => {
      var result = 0.0
      for(model <- modelArr) result += model(x)
      result
    }
    //准备相关的测试数据
    val csdata = Array(1.4,2.5,2.8,3.5,4.0,4.5,5.6,6.5,6.7)
    for(cs <- csdata) println(finalModel(cs))
  }

  def getTree(data:Array[LabeledPoint],cutpoints:Array[Double])= {
    //存储每一次迭代产生的(cutpoint,(ms,c1,c2))
    val msArr = ArrayBuffer[(Double,(Double,Double,Double))]()
    for (cutpoint <- cutpoints) msArr.append((cutpoint,calms(cutpoint, data)))
    val best = msArr.sortBy(x => x._2._1).take(1)(0)
    //生成此次迭代的最佳模型更新训练数据data,生成残差表
    val bestModel =(x:Double) =>{
      val cp = best._1
      val c1 = best._2._2
      val c2 = best._2._3
      if(x < cp) c1 else c2
    }
    bestModel
  }

  //假设回归树的损失函数为平方误差损失函数 f(x) = min[min(yi-c1)**2 + min(yi-c2)**2]
  def calms(cutpoint:Double,data:Array[LabeledPoint])={
    //计算误差
    var ms = 0.0
    //min(yi-c1)**2
    var c1 = 0.0
    //min(yi-c2)**2
    var c2 = 0.0
    //c1、c2所对应的数据和
    var s1 = 0.0
    var s2 = 0.0
    //满足条件c1、c2的样本点个数
    var n1 = 0
    var n2 = 0
    for(dt <- data) if(dt.features(0) <= cutpoint) {n1 += 1;s1 += dt.label} else {n2 += 1;s2 += dt.label}
    c1 = s1 / n1
    c2 = s2 / n2
    for(dt <- data) if(dt.features(0) <= cutpoint) ms += math.pow((dt.label - c1),2) else ms += math.pow((dt.label - c2),2)
    (ms,c1,c2)
  }
}
----------------------------------------------------------result---------------------------------------
5.63
5.818310185185186
5.818310185185186
6.551643518518518
6.551643518518518
6.819699074074074
6.819699074074074
8.950162037037037
8.950162037037037
该实验结果完全等价于统计学习上的提升树函数
【机器学习】【提升方法-BoostingTree-3】提升树学习算法详解+示例讲解数学求解过程 20180510完成此博客。 阅读详情

相关推荐

Boosting集合算法详解(一)

本文是关于聚类算法的第二篇K-means,感兴趣的同学可以前往http://ihoge.cn/2018/clustering.html 阅读完整版。 二、K-means 1. 算法步骤 &lt;1&gt; 选择KKK个点作为初始质心 &lt;2&gt; Repeat: &lt;3&gt; 将每个点指派到最近的质心,形成KKK个簇 &lt;4&gt; 重新计...

机器学习算法 2553

手撕机器学习算法——纯手敲决策树代码(上)

本文主要介绍决策树的基本知识:信息熵、数据集划分函数、寻找最优划分维度

bpllzbh的博客 930

手撕Decision Tree(决策树:CART-分类与回归树 之 分类树)模型

weixin_43646592的博客 787

机器学习-决策树【手撕】

决策树是一个预测模型,它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表某个可能的属性值,而每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。

weixin_43186779的博客 2783

手撕Decision Tree(决策树:CART-分类与回归树 之 回归树)模型

回归树是学习树类集成模型(e.g. GBDT)的基础。 最后两个证明在GBDT里会用到。

weixin_43646592的博客 884

手撕GBDT(Gradient Boosting Decision Tree - 梯度提升树)模型

weixin_43646592的博客 845

手撕机器学习算法 | 决策树 | DecisionTree

基于Python(Numpy)和C++(Eigen)手撕常见的机器学习算法中的核心逻辑

m0_70254540的博客 1346

Adaboost:Adaboost(自适应提升)元算法的 Java 实现(机器学习)

Adaboost AdaBoost 是“Adaptive Boosting”的缩写,是一种机器学习元算法。 它可以与许多其他类型的学习算法结合使用,以提高它们的性能。 其他学习算法(“弱学习器”)的输出被组合成一个加权和,代表提升分类器的最终输出 执行 我更喜欢循环训练文件行而不是将所有文件加载到内存中,因此它必须适用于非常大的文件。 首先,学习文件必须在 PSV(管道分隔值)中。 resources/trainingSamples.psv 中已存在示例文件最后一列作为实体类类型必须为 { 1 , -1 } “目前仅支持二进制分类” 用法 File file = new File ( " resources/trainSamples.psv " ); Adaboost boosting = Adaboost . train(file, 10 , 10 , 0 ); int l

提升树(Boosting tree)算法总结

提升树(Boosting tree)算法总结 发表于 2018-05-20 | 分类于 机器学习 | 浏览 K 本文是综合了之前的以往多个笔记汇总而成,内容包含: 一、Boosting基本概念 二、前向分步加法模型 1. 加法模型 2. 前向分步算法 三、AdaBoost 1. 算法解析 2. 模型构建 3. 算法缺点 四、二叉分类树 五、回归分类树 1. 算法解析 2. 模型构建 六、梯度提...

qq_23018775的博客 2802

数据挖掘算法Java实现(源码)

包含很多知名算法实现,支持向量机,决策树,粗糙集,贝叶斯分类器等 http://rsproject.mimuw.edu.pl/ 不可用于商业目的

基于Landsat-8数据的山西省吕梁市地表温度反演研究过程(大气校正法)

1.数据下载:本实验采用的数据是 ①从地理空间数据云下载的来自landsat8 卫星,云量<=1%,时间为2017年5月12日的山西省吕梁市影像数据。为全面覆盖吕梁市,选用了两片影像。 ②吕梁市边界矢量图 2.数据预处理 ...

weixin_45747376的博客 6601

XGBoost——学习笔记

将属于第j个叶子节点的所有样本xi,划入到一个叶子节点样本集合中,描述如下:以上就是全部内容,本文仅简单记录了自己关于 XGBoost 的学习,如有疑问,欢迎一起交流。

ashley_hazel的博客 283

kettle9.0+ 连接Hadoop报错

kettle bug

x²+(y-√³x²)²=1的博客 1562

决策树算法(手撕)

以前照着别人的边敲边调试的,没怎么整理,有点乱 import numpy as np import pandas as pd import matplotlib.pyplot as plt from math import log import math import operator import sys # !pip install treePlotter def createDataSet(): dataset = [ [1,1,'yes'], [1,1,

qq_33489955的博客 1538

使用Qt Creator调用eBUS SDK

在新界面,勾选左下角“ Show unreachable Network Devices",可以看到没有成功连接的网络相机,原因是IP地址配置错误。每个版本的OpenCV的依赖项的名字都不同,我这里是opencv_world490.lib与opencv_world490d.lib。函数,可以看到在这里是图像缓存区,能够对捕获的图像进行一些操作。在Visual Studio打开项目属性,在VC++目录这里,把Opencv的路径添加进去。这时,会自动跳转到mainwindow.cpp,生成该按钮对应的槽函数。

qq_35685051的博客 1289

AURIX TC397开发板到手第一步:用iLLD库驱动LED流水灯(附完整代码)

本文详细介绍了如何使用英飞凌AURIX TC397开发板和iLLD库实现LED流水灯效果。从开发环境配置到硬件连接,再到完整的代码实现,逐步引导开发者完成项目。文章还提供了优化建议和常见问题解决方案,帮助嵌入式开发新手快速上手。

weixin_30911451的博客 394

从零开始实现决策树——手撕CART算法(C++)

CART决策树的基本原理见。本文的C++代码基于C++ 20标准(不包含C++ modules),对于之前的标准,可能需要做一些适配。CART分类树和回归树的内容各自在一个类中,分类树为CartClassifier类,回归树为CartRegression类。

qq_41043057的博客 824

避坑指南:Zabbix poller进程100%占用的5种常见原因及解决方案

本文深入剖析了Zabbix poller进程占用率高达100%的五大常见原因,包括监控项与进程数不匹配、不可达主机资源浪费、数据库性能瓶颈、监控项配置不合理以及版本缺陷。文章提供了从系统化诊断到针对性解决方案的完整指南,并重点介绍了如何通过优化zabbix_server.conf中的StartPollers等关键参数进行有效调优,帮助运维人员从根本上解决这一经典性能问题。

7z8x2c4v6b9的博客 253

提升树Boosting Tree算法实例详解

在前面一片文章中展示了AdaBoost算法实例详解,这篇文章中来大致看一下提升树Boosting Tree算法的主要计算过程。 提升树算法利用加法模型和前向分布算法实现迭代学习优化,当使用MSE或者指数损失函数时,通过计算第 K 轮迭代后的加法模型在训练集上的残差,优化损失函数在残差上的最小值,学习第 k + 1 轮新模型参数,并使用加法模型将新模型并入学习到的整个模型中。但是,当使用其他一般损失函数时,求解模型在训练集上的残差以及损失函数在残差的最优参数并不容易优化。然后提出梯度提升算法,这个在后面的文

胖胖大海的博客 2440

Vivado 2018.3 SDK烧写bin文件避坑指南:如何解决QSPI模式下的常见错误

本文深入解析了在Vivado 2018.3 SDK中为Zynq FPGA烧写QSPI Flash时遇到的常见问题,特别是启动模式为QSPI时出现的警告与失败。文章从Zynq启动机制入手,提供了修改FSBL代码以强制使用JTAG模式、调整硬件配置等核心解决方案,并分享了实战案例与最佳实践,帮助开发者高效避坑,确保bin文件烧写成功。

arduino9maker的博客 390

上位机图像处理和嵌入式模块部署(开篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉,以传统算法和光源控制为主,部分采用了深度学习技术。而生活当中,则主要以二维码识别、人脸识别、车牌识别和ocr识别为主,这中间深度学习与AI扮演了很重要的角色。过去,市场上的商业收费软件,主要还是以传统设备厂商提供的上位机软件为主,那这一部分是不是结合最新的npu技术,应该做出一些新的东西出来呢?

嵌入式-老费,一个分享专业嵌入式知识的blog 1338

集成学习——Boosting之提升树(Boosting tree)、梯度提升树(GBDT)、XGBoost

提升树是以回归树为基本分类器的提升方法。以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是分类树,对回归问题决策树为回归树。首先定义决策树用公式表示。 提升树算法: 1.首先确定初始提升树; 2.第二个提升树 第三个提升树 ……推出: 3.回忆一下CART回归树,它是采用平方误差损失函数最小来决定最佳分类点,,CART的优化模型为,就是这个最佳分类点...

人之初,性贪婪 5609

【图像拼接】论文精读:Content-Preserving Warps for 3D Video Stabilization(CPW)

论文题目:Content-Preserving Warps for 3D Video Stabilization——用于3D视频稳定的内容保持扭曲GSP、SPW、LPC等warp时多个项最小化问题的思想都是来自于这篇论文——CPW视频防抖。我们描述了一种从手持摄像机转换视频的技术,以便它看起来像是用定向相机运动拍摄的。我们的方法调整视频以出现,就好像它是从附近的视点拍摄的,允许模拟 3D 相机运动。通过仅针对感知合理性,而不是准确的重建,我们能够开发能够有效从单个源视频中重建动态场景的算法。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

Lucas带你手撕机器学习——决策树

决策树是一种基本的分类与回归方法,它通过树状结构对数据进行分类或预测。每个内部节点代表一个特征(属性),每个分支代表特征的一个可能值,而每个叶子节点代表一个分类或预测值。由于其直观和易于理解的特点,决策树广泛应用于机器学习、数据挖掘和决策分析等领域。决策树是一种强大且易于理解的机器学习模型,适用于分类和回归任务。通过选择最优特征进行划分,决策树能够有效地对数据进行建模。尽管决策树有许多优点,但在实际应用中也需要注意过拟合和不稳定性的问题,因此常常结合剪枝技术进行改进。

Lucas在澳洲 1052

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深入理解GBDT回归算法

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达来源:公众号Microstrong授权转载目录:1. GBDT简介2. GBDT回归算法 2.1 GBDT回归算法推导 2.2 GBDT回归算法实例3. 手撕GBDT回归算法 3.1 用Python3实现GBDT回归算法 3.2 用sklearn实现GBD...

小白学视觉 6067

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

机器学习算法总结之Boosting:Boosting Tree、GBDT

写在前面 上一篇 机器学习算法总结之Boosting family:AdaBoost提到Boost但是没说它的整个框架及分类,在这里记一下。 Boosting(提升方法) = 加法模型 + 前向分步算法 + 损失函数 AdaBoost = Boosting + 损失函数是指数函数(基函数任意) Boosting Tree(提升树) = Boosting + 基函数是决策树(损失函数任意...

Kaiyuan_sjtu的博客 4754

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 算法小白的第一次尝试---AdaBoost(手撕)
下一篇: 算法小白的第一次尝试---Kmeans (适用于任何维度数据)
小糖宝
博客等级 码龄9年 47粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值