机器学习实战之Adaboost之机器学习作业记录(三)

好久没更新作业了,,,

主要是李航统计学习方法的第八章,准确率80% 总感觉不对,先记录到这,,,

其中关于概念的理解参考了以下博客,觉得对我很有帮助,记录一下:
1
2
3
4
这篇
尤其这篇
还有这篇
这篇
这篇
这篇
这篇
这篇
这篇

然后我的代码放在这里啦:

# -*- coding: utf-8 -*-
""" Created on Sat Apr 14 20:46:00 2018 @author: xuanxuan """

#the second problem to the homework

import matplotlib.pyplot as plt
import math
import numpy as np





#每一次迭代,划分样本点,每一个s对应一个分类器
def splits(): 

    S=[]  #切分点集合
    for i in range(3):
        a=i+0.5
        S.append(a)
    return S    



#其实每一个s对应了本次迭代中的一个弱分类器,不断改变s的值就可以得到本次迭代中一系列分类器
#比较每一个分类器的错分率,选择错分率最小的作为本次迭代的最优弱分类器 
#(是本次迭代产生了好多个分类器,第一次使用哪个还需要判断)

def classifier1(X,L,W): #X是划分数据集,L是对应数据的标签,s是该分类器使用该值作为划分点


    S=splits()   #得到一系列分类点存成的列表
    Em=[] #存放本次迭代 各个分类器的错分样本率 选择最小的那个作为最优的

    for s in S:  #本次迭代,根据s的不同会产生一系列的分类器,需要选一个误分类样本率最小的那个作为本次迭代最优的弱分类器
        em=0  #该s值对应的弱分类器错分样本率 其实就是错分样本的样本权重累加
        n=0
        for x in X:
            if x<=s:
                L_pre=-1
            else:
                L_pre=1
            if L_pre!=L[n]:
                em=em+W[n]   #就是该分类器错分样本概率

            n+=1
        Em.append(em)   #Em中存放了一系列分类器的误分样本率
    #print("本轮迭代对于不同的s得到的各弱分类器的错分样本率分别为:\n{}".format(Em))
    mi_em,mi_s=find_min(Em,S)  #返回的是本次迭代中错分样本率最小的分类器(mis)以及相应的错分率miem 

    α=0.5*math.log((1-mi_em)/mi_em)  #本轮迭代之后该分类器的系数,仅由该分类器对样本的误分率决定


    W_new0=[]#存放本次迭代结束后的更新样本权重,方便下一轮迭代
    k=0
    L_preall=[]  #存放被该分类器预测的函数值
    for x in X:  #对于每一个样本 根据该样本是否被每轮迭代的最优分类器误分 来更新样本权重
        if x<=mi_s:
            L_pre=-1
        else:
            L_pre=1
        L_preall.append(L_pre)  #是被该分类器预测的值存成一个列表
        if L_pre==L[k]:
            value=W[k]*np.exp(-α)  #代表每一轮迭代后更新的样本权重,由该样本被本轮最优弱分类器是否误分决定该样本权重是增大还是减小
            W_new0.append(value)  #存储的仅是分子(还未进行归一化)
        else:
            value=W[k]*np.exp(α)
            W_new0.append(value)
        k+=1
    W_new=W_new0/np.sum(W_new0)   #存放本次迭代更新的归一化样本权重值,方便进行下一次迭代
    return W_new,mi_em,mi_s,α,L_preall    


#对于每一次迭代得到的各弱分类器,比较他们错分样本率 选择最小的作为本次迭代最优弱分类器
def find_min(Em,S):  

    miem=Em[0]
    loc=0
    for i in range(len(Em)):
        if miem>Em[i]:
            miem=Em[i]
            loc=i
    return miem,S[loc]  #返回本次迭代错分样本最小的分类器s以及样本错分率 方便计算该分类器的权重



if __name__=="__main__":

    X=[0,0,1,1,1,0,1,0,1,1]   #方便绘制散点图
    Y=[1,3,2,1,2,1,3,2,1,1]
    Z=[3,1,2,3,3,2,1,1,2,1]
    L=[-1,-1,-1,-1,-1,-1,-1,-1,1,1] 
    W=[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]
    alpha=[]
    L_prefinal=[]
    #第一轮迭代更新的输出(使用竖直特征构建分类器)
    for t in range(3):
        W_new,em,s,α,L_preall=classifier1(X,L,W)  #经过一次迭代之后得到的样本权重,样本误分率以及分类切分点
        print("本轮迭代之后样本权重更新为:\n{}\n最优弱分类器的误分样本率为:\n{}\n该最优弱分类器划分切分点为:\n{}\n该分类器的权重为:\n{}\n,该分类器预测的值:\n{}\n".format(W_new,em,s,α,L_preall))
        #print(α,L_preall)
        print("********************************************")
        alpha.append(α)
        L_prefinal.append(L_preall)


        #使用y作为划分特征(使用水平特征构建分类器)
        W_new1,em1,s1,α1,L_preall1=classifier1(Y,L,W_new)  #经过第二次迭代之后得到的样本权重,样本误分率以及分类切分点
        print("本轮迭代之后样本权重更新为:\n{}\n最优弱分类器的误分样本率为:\n{}\n该最优弱分类器划分切分点为:\n{}\n该分类器的权重为:\n{}\n,该分类器预测的值:\n{}\n".format(W_new1,em1,s1,α1,L_preall1))
        #print(α1,L_preall1)
        print("********************************************")
        alpha.append(α1)
        L_prefinal.append(L_preall1)


        W_new2,em2,s2,α2,L_preall2=classifier1(Z,L,W_new1)  #经过第二次迭代之后得到的样本权重,样本误分率以及分类切分点
        print("本轮迭代之后样本权重更新为:\n{}\n最优弱分类器的误分样本率为:\n{}\n该最优弱分类器划分切分点为:\n{}\n该分类器的权重为:\n{}\n该分类器预测的值:\n{}\n".format(W_new2,em2,s2,α2,L_preall2))
        #print(α2,L_preall2)
        alpha.append(α2)
        L_prefinal.append(L_preall2)

        W=W_new2

    finalvalue=0
    num=0

    for i in range(10):
        for j in range(3):
            finalvalue+=alpha[j]*L_prefinal[j][i]
        if finalvalue>0:
            finalvalue1=1
        else:
            finalvalue1=-1
        if finalvalue1==L[i]:
            num+=1
    print("正确率为:\n{}".format(num/10))

加油~

你可能感兴趣的:(python_ML)