“正义的工具确实很脆弱。它必须在护送下履行其神圣职责。”
——阿弗洛尼安斯,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
}
}