zoukankan      html  css  js  c++  java
  • 从零开始写代码AdaBoost算法的python实现

    视频版见B站:Python实现AdaBoost算法-从零开始写代码_哔哩哔哩_bilibili

    源文件、训练数据、说明图片下载:https://files.cnblogs.com/files/ljy1227476113/AdaBoost%E5%88%86%E7%B1%BB%E7%AE%97%E6%B3%95.7z

     

     

     

    # author:会武术之白猫
    # date:2021-11-11
    
    import csv
    import numpy as np
    import random
    
    def read_csv(csv_name):
        with open(csv_name) as f:
            reader = csv.reader(f)
            rows = [row for row in reader]
    
        data_x = []
        res_y = []
        for item in rows:
            if item[-1] == 'label':
                continue
            jtem = [float(t) for t in item[:-2]]
            data_x.append(jtem)
            res_y.append(int(item[-1]))
        # for item in data_x:
        #     print(item)
        # print(res_y)
        return data_x, res_y
    
    # read_csv("iris_data.csv")
    
    def train(x, y, w):
        min_loss = 1
        m = x.shape[1]
        res_k = None
        nums = 10
        for t in range(nums):
            k_random = []
            for i in range(m):
                k_random.append(random.uniform(0, 1))
            k_random = np.array(k_random)
            mis = (k_random*x).sum(axis = 1)
            mis = mis - min(mis)
            mis = mis / max(mis)
            res = []
            for item in mis:
                if item <= 0.33:
                    res.append(0)
                elif item <= 0.66:
                    res.append(1)
                else:
                    res.append(2)
            res = np.array(res)
            miss = sum((res != y)*w)
            if miss < min_loss:
                min_loss = miss
                res_k = k_random
            # percent = sum(res == y)/n
            # print("正确率为{}%".format(percent*100))
        #print(min_loss)
        return min_loss, res_k
    
    # x, y = read_csv("iris_data.csv")
    # x = np.array(x)
    # y = np.array(y)
    # n = x.shape[0]
    # M = 1
    # w_m = np.array([1/n]*n)
    # res = np.zeros(n)
    # train(x, y, w_m)
    
    def predict(x, res_k):
        mis = (res_k*x).sum(axis = 1)
        mis = mis - min(mis)
        mis = mis / max(mis)
        res = []
        for item in mis:
            if item <= 0.33:
                res.append(0)
            elif item <= 0.66:
                res.append(1)
            else:
                res.append(2)
        res = np.array(res)
        return res
    
    def adaboost(csv_name):
        x, y = read_csv(csv_name)
        x = np.array(x)
        y = np.array(y)
        n = x.shape[0]
        M = 4
        w_m = np.array([1/n]*n)
        res = np.zeros(n)
        for m in range(M):
            e_m, res_k = train(x, y, w_m)
            a_m = 1/2 * np.log((1 - e_m)/e_m)
            y_m = predict(x, res_k)
            w_m = w_m * np.exp(-a_m*y*y_m)
            z_m = np.sum(w_m)
            w_m = w_m/z_m
            res += a_m*y_m
        res = res - min(res)
        res = res / max(res)
        result = []
        for item in res:
            if item <= 0.33:
                result.append(0)
            elif item <= 0.66:
                result.append(1)
            else:
                result.append(2)
        result = np.array(result)
        # print(result)
        percent = sum(result == y)/n
        print("正确率为{}%".format(percent*100))
    
    csv_name = "iris_data.csv"
    adaboost(csv_name)
  • 相关阅读:
    php 删除指定文件夹
    php 批量进行复制文件
    php 导入/导出 csv 文件
    Java8 Nashorn JavaScript引擎
    Java8 Optional类
    Java8数据流
    Java8默认方法
    异常的其他问题
    package和import语句_5
    继承和权限控制_1
  • 原文地址:https://www.cnblogs.com/ljy1227476113/p/15549810.html
Copyright © 2011-2022 走看看