AdaBoost For Swift

“正义的工具确实很脆弱。它必须在护送下履行其神圣职责。”

——阿弗洛尼安斯,5.91

 

尝试使用Swift重写Adaboost方法

 

//
//  AdaBoost.swift
//  Swift_Tensorflow_Test
//
//  Created by Ezio on 2020/5/15.
//  Copyright © 2020 Ezio. All rights reserved.
//


/*
#                                            ;@#@@$|;'`.                                            `
#                                            ;@#############&|:`                                    `
#                                            ;@####################|`                               `
#                                            ;@####################@@##$:                           `
#                                            :@#@#########################@!.                       `
#                                      .%####$;::;$###########################|.                    `
#                                      .%####|    |#############################&:                  `
#                       .;&#%.         .%####|    |###########$!$##################|.               `
#                    '&##@##@$`        `%####|    |#@@#######%.    '$################|              `
#                 `%##########&: `:|&########|     .`:%#####%.        `$##############@;            `
#                  :&#############@@#########|                       .%###############@@$'          `
#                   '$#######################|                      .|###################@!.        `
#                    `$#############@########%.                    .|######################$`       `
#                   !##############@|'       :@#####&!'             .!@#####################&`      `
#       .%@;.     |#############%`           ;######@@###$`            ;@##################@@&'     `
#      :&#####&:|##########@#&:              ;@#############$.           ;@#&;`   |###########&:    `
#     |########@###########&'                :@#############@#$`                   '&##########&'   `
#    !####################|.                 :@################@;                   '&##########$`  `
#   ;@@@#################!                   :@##################|                   ;@##########|  `
#     '$@###############!                    :@##################@;               ;&#############@: `
#        .%############$`                    :@###################$`           `$#@###############%.`
#        `$############|                     :@###################&'            |#################@:'
#        |#############|                     :@###################@:            '&#################|:
#       `$#############|.                    :@###################&'             |#################$!
#   ...`%##############&'                    :@#################@#%.             '$################@%
#&######################$.                   :@##################&:                      |##########$
#&#######################|                   :@#################@;                       ;@#########$
#&#######################@:                  :@#################%.                       :@#########$
#&########################|                  ;@#################!                        !##########$
#@########################|                  ;@#########@@@@#@#@;                       `%##########$
#       ;@###############$`    `::`          :@####@@###$:';&###&'               '&################@%
#       .%##############|    `$#@@###$;`.    ;@@##&|:        ;@##@:             .%#################$!
#        !#############&:    `$#######@@@#%. :@@;            |####|.            ;@#################|'
#        .%#############&:    :@#@@@##@%'    :@##@!`        '$#@@%`            .%#################@:'
#        :$##############&:    .::`.        :;;&######@%!:;$##@@%.             '$#################%.`
#    .;@##################|                ;@! `&######@@#@#####!                 '%##@##########&: `
#   '&@@###################!              `$#!  !#########@#@@#|                     |###########|  `
#    :@#####################&!'`:!|'      '' :@$!&#####$``;!;'                      ;@##########$`  `
#     :@#####################@#@@#|          ;&@########|                          |###########&'   `
#      `$#@##@|.'%#############@#$`          ;@########@$'              '%###$'  .%###########&:    `
#       .|$:      '$#############%.       .  ;@#$|&##@@#&:            `$#####################&'     `
#                   `%###########!  .'.  |!  ;##%:%#&;$##|          '$######################&'      `
#                    '$######################|.                     ;######################%.       `
#                   |########################|.                      '&##################@!         `
#                  %################@@#######|           `;:.         `$##############@@%`          `
#                 .|##@#####@#%.   `:|$@#####|    '|&####@&#$        .|@############@@&'            `
#                     :&###@@|.        .%####|    |##########&'   `%##@###########@@&:              `
#                        `|@|          .%####|    |############@@#################&:                `
#                                      .$#@@#|    |###########################@#%`                  `
#                                       :|%$&$$&&&###########################$'                     `
#                                            :@#@######################@@#$'                        `
#                                            :@###################@###$;.                           `
#                                            :@############@@####@|'                                `
#                                            ;@#@@########@%;'.                                     `
#
# "There is no truth in flesh, only betrayal."
# "There is no strength in flesh, only weakness."
# "There is no constancy in flesh, only decay."
# "There is no certainty in flesh but death."
# — Credo Omnissiah
#
*/


/*

    AdaBoost For Swift

 */
import Foundation
//import Tensor
//import TensorFlow

class AdaBoostClass : NSObject {

    //输入与实际结果
    var inputDatas: [[Float]] = []
    var Labels: [Float] = []

    //每次迭代更新的权值向量值列表, 初始时总值为1
    var D_Arr: [Float] = []

    //初级分类器集合
    var weakClassierArr: [([Float])->Float] = []
    //初级分类器对应的Alpha
    var weakClassierAlpha: [Float] = []

    //用输入数据和对应的结果数据作为初始化参数
    public init(inputDatas: [[Float]], Labels: [Float]) {
        super.init()
        self.inputDatas = inputDatas
        self.Labels = Labels
    }

// MARK: - Main Function

    //组装需要的分类器
    func installClassiers() {

        //更新权值列表
        D_Arr = [Float](repeating: 1.0/Float(weakClassierArr.count), count: weakClassierArr.count)

        weakClassierArr = []
        weakClassierAlpha = [Float](repeating: 0.0, count: weakClassierArr.count)
    }


    //AdaBoost
    func adaBoost(classierArr: [([Float])->Float?], iterCount: Int, inputData: [Float]) -> Float {

        //迭代次数(设置为分类器个数可视为最优值,否则在分类器数量较少情况下会导致alpha 无线趋于零)
        for _ in 0...iterCount {

            //在权值分布D的情况下,再取N个弱分类器h1、h2和h3中误差率最小的分类器作为第t次迭代的基本分类器H_t(x)

            //获取本次迭代最佳分类器
            weakClassiersTrain()
        }


        return getFinalResult(input:inputData)
    }

    //弱分类器训练,并更新alpha值
    func weakClassiersTrain() -> () {

        //循环以得到最少错误分类器
        for (classierIndex_, classier) in weakClassierArr.enumerated() {

            //统计当前分类器的错误权值
            var error: Float = 0.0
            //错误总数
            var errorCount: Int = 0

            //获取当前样本权重
            let D: Float = D_Arr[classierIndex_]

            //用测试数据更新ε
            //ε = ∑(h_t(x_i) ≠ y_i)D_t
            for (inputIndex_, inputData_) in inputDatas.enumerated() {
                let label_: Float = Labels[inputIndex_]
                let result_: Float? = classier(inputData_)

                if result_ == nil {
                    //错误
                    print("Error weak Classier has run Failed")
                }

                //对比分类结果与实际结果
                if result_ != label_ {
                    //错误
                    errorCount += 1
                }
            }

            //更新错误率ε
            error = Float(errorCount/inputDatas.count)

            //更新弱分类器G的权重系数α
            //α = 1/2 * ln(1-ε / ε)
            let alpha: Float = 0.5 * log((1.0 - error) / error)
            weakClassierAlpha[classierIndex_] = alpha

            //更新训练数据集的样本权值分布D
            var Z: Float = 0.0
            for _ in 0...errorCount {
                Z = Z + D * exp(alpha)
            }
            for _ in 0...(inputDatas.count-errorCount) {
                Z = Z + D * exp(-alpha)
            }
            //更新D列表
            D_Arr[classierIndex_] = Z/D_Arr.reduce(0, +)
        }
    }

    //获取最终结果
    func getFinalResult(input: [Float]) -> Float {
        //联合分类器H(X),计算出最终结果
        //H(X) = sign(∑ h_t(x) * α)
        var total_: Float = 0.0
        for (classierIndex_, classier) in weakClassierArr.enumerated() {
            let alpha_: Float = weakClassierAlpha[classierIndex_]
            total_ = total_ + alpha_ * classier(input)
        }


        return 0
    }


// MARK: - Weak Classier

    func build_RNN(input:[Float]) -> Float? {

        return 0.0
    }


    //NN
    func build_NN(input:[Float]) -> Float? {

        return 0.0
    }


    //SVM
    func build_SVM(input:[Float]) -> Float? {

        return 0.0
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值