机器学习实验五

《机器学习与数据挖掘》实验五

实验题目:   编程实现误差逆传播算法(BP算法)                                             

实验目的:   掌握误差逆传播算法(BP算法)的工作流程                                       

实验环境(硬件和软件)   Anaconda/Jupyter notebook/Pycharm                               

实验内容:

编码实现标准BP算法,在西瓜数据集3.0上用这个算法训练一个单隐层网络,并进行测试。

要求:

一、经给定部分代码,补充完整的代码,需要补充代码的地方已经用红色字体标注,在第(2)部分,包括:

#补充前向传播代码

#补充反向传播代码

#补充参数更新代码

#补充Loss可视化代码

二、将补充完整的第(2)部分的代码提交,并提交实验结果;(也可以自己重写这部分的代码提交

import pandas as pd

import numpy as np

from sklearn.preprocessing import LabelEncoder

from sklearn.preprocessing import StandardScaler

import matplotlib.pyplot as plt

seed = 2020

import random

np.random.seed(seed)  # Numpy module.

random.seed(seed)  # Python random module.

plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号

plt.close('all')

1)数据预处理

def preprocess(data):

    #将非数映射数字

    for title in data.columns:

        if data[title].dtype=='object':

            encoder = LabelEncoder()

            data[title] = encoder.fit_transform(data[title])        

    #去均值和方差归一化

    ss = StandardScaler()

    X = data.drop('好瓜',axis=1)

    Y = data['好瓜']

    X = ss.fit_transform(X)

    x,y = np.array(X),np.array(Y).reshape(Y.shape[0],1)

    return x,y

#定义Sigmoid

def sigmoid(x):

return 1/(1+np.exp(-x))

#求导

def d_sigmoid(x):

return x*(1-x)

2)标准BP算法

def standard_BP(x,y,dim=10,eta=0.8,max_iter=500):

    n_samples = 1

    w1 = np.random.random((x.shape[1],dim))

    w2 = np.random.random((dim,1))

    b1 = np.random.random((n_samples,dim))

    b2 = np.random.random((n_samples,1))

    losslist = []

    for ite in range(max_iter):

        loss_per_ite = []

        for m in range(x.shape[0]):

            xi,yi = x[m,:],y[m,:]

            xi,yi = xi.reshape(1,xi.shape[0]),yi.reshape(1,yi.shape[0])

            ##补充前向传播代码  

            u1 = np.dot(xi, w1) + b1

            out1 = sigmoid(u1)

            u2 = np.dot(out1, w2) + b2

            out2 = sigmoid(u2)

            loss = np.square(yi - out2)/2

            loss_per_ite.append(loss)

            print('iter:%d  loss:%.4f'%(ite,loss))

            ##反向传播

            ##补充反向传播代码

            ##补充参数更新代码

            g = (yi - out2) * d_sigmoid(out2)

            d_w2 = np.dot(np.transpose(out1), g)

            d_b2 = -g

            d_out1 = np.dot(g, np.transpose(w2))

            e = d_out1 * sigmoid(out1)

            d_w1 = np.dot(np.transpose(xi), e)

            d_b1 = -e

            w1 = w1 + eta * d_w1

            w2 = w2 + eta * d_w2

            b1 = b1 + eta * d_b1

            b2 = b2 + eta * d_b2

        losslist.append(np.mean(loss_per_ite))

    ##Loss可视化

    plt.figure()

##补充Loss可视化代码

plt.plot([i + 1 for i in range(max_iter)], losslist)

    plt.legend(['standard BP'])

plt.xlabel('iteration')

plt.ylabel('loss')

plt.show()

    return w1,w2,b1,b2

3)测试

def main():

data = pd.read_table('watermelon30.txt',delimiter=',')

data.drop('编号',axis=1,inplace=True)

x,y = preprocess(data)

dim = 10

w1,w2,b1,b2 = standard_BP(x,y,dim)

#根据当前的x,预测其类别;

u1 = np.dot(x,w1)+b1

out1 = sigmoid(u1)

u2 = np.dot(out1,w2)+b2

out2 = sigmoid(u2) 

y_pred = np.round(out2)

result = pd.DataFrame(np.hstack((y,y_pred)),columns=['真值','预测'] )    

result.to_excel('result.xlsx',index=False)

#补充测试代码,根据当前的x,预测其类别:

If _name_==’_main_’:

     main()

实验结果:

实验内容的代码补充见上述的红色标记的代码;

实验结果显示:

部分数据:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
作业一(Matlab) 假设x=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20),y=( 2.94, 4.53, 5.96, 7.88, 9.02, 10.94, 12.14, 13.96, 14.74, 16.68, 17.79, 19.67, 21.20, 22.07, 23.75, 25.22, 27.17, 28.84, 29.84, 31.78).请写出拟合的直线方程,并画图(包括原数据点及拟合的直线),请打印出来。 请使用线性回归模型来拟合bodyfat数据。数据集介绍可阅读:https://www.mathworks.com/help/nnet/examples/body-fat-estimation.html 在matlab中,在命令行中输入[X,Y] = bodyfat_dataset; 即可获得一个拥有13个属性,252个样本的数据集。使用前200个样本来获得模型,并写出你所获得的模型。使用后52个样本做测试,汇报你所获得的泛化误差。 编程实现对数回归,并给出教材89页上的西瓜数据集3.0上的结果。要求采用4折交叉验证法来评估结果。因为此处一共17个样本,你可以去掉最后一个样本,也可以用所有数据,然后测试用5个样本。在汇报结果时,请说明你的选择。请在二维图上画出你的结果(用两种不同颜色或者形状来标注类别),同时打印出完整的代码。 作业二 采用信息增益准则,基于表4.2中编号为1、2、3、6、7、9、10、14、15、16、17的11个样本的色泽、根蒂、敲声、文理属性构建决策树。(本次作业可以用笔算,鼓励编程实现,但都需要列出主要步骤,其中log2(3)=1.585,log2(5)=2.322,log2(6)=2.585,log2(7)=2.807,log2(9)=3.17,log2(10)=3.322,log2(11)=3.459) 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对上题的训练数据采用预剪枝策略构建决策树,并汇报验证集精度。 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对题1所构建的决策树进行后剪枝,并汇报验证集精度。 作业三(Matlab) 试编程实现累积BP算法,在西瓜数据集2.0上(用训练数据)训练一个单隐层网络,用验证集计算出均方误差。要自己实现,不能直接调用现成的库函数。 作业四 下载并安装libsvm,http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ,在西瓜数据集3.0a上分别用线性核训练一个SVM。用正类1-6和负类9-14作为训练集,其余作为测试集。C取不同的值,其它参数设为默认值。作出测试正确率随C取值变化的图,C=[1 100 10000 10^6 10^8]。 换成高斯核(宽度设为1),重复上题的步骤。 作业西瓜数据集2.0(见教材76页表4.1)中样本1--16为训练训练一个朴素贝叶斯分类器,对测试样本17进行分类。请写出详细的计算过程。 假设x_k是一个班上学生的分数,对应的分数及其分布是 x_1=30, P1=0.5,一共有14个学生; x_2=18, P2=mu,有6个学生; x_3=20, P3=2mu,有9个学生; x_4=23, P4=0.5-3mu,有10个学生; 通过最大对数似然法求出mu的值。 作业六(Python) 1 使用PCA对Yale人脸数据集进行降维,并分别观察前20、前100个特征向量所对应的图像。请随机选取3张照片来对比效果。数据集http://vision.ucsd.edu/content/yale-face-database

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值