美文网首页R炒面
88-R单神经元神经网络手动实现

88-R单神经元神经网络手动实现

作者: wonphen | 来源:发表于2020-10-19 17:40 被阅读0次
    > library(pacman)
    > p_load(dplyr)
    

    1、生成虚拟数据

    > set.seed(123)
    > x1 <- runif(200, 0, 10)
    > 
    > set.seed(456)
    > x2 <- runif(200, 0, 10)
    > 
    > y <- sign(-0.89 + 2.07 * x1 - 3.09 * x2)
    > 
    > dat <- tibble(y = y, x1 = x1, x2 = x2)
    > 
    > str(dat)
    
    ## tibble [200 × 3] (S3: tbl_df/tbl/data.frame)
    ##  $ y : num [1:200] 1 1 -1 -1 -1 -1 1 1 1 -1 ...
    ##  $ x1: num [1:200] 2.88 7.88 4.09 8.83 9.4 ...
    ##  $ x2: num [1:200] 0.896 2.105 7.33 8.521 7.884 ...
    

    2、构造算法

    > # 如果小于0返回-1,大于0返回1
    > step_fun <- function(x) {
    +   x = ifelse(x < 0, -1, 1)
    +   return(x)
    + }
    > 
    > pocket_perceptron <- function(dat, learning_rate, max_iter) {
    +   # 行数
    +   n = nrow(dat)
    +   # 特征数等于总列数减去因变量
    +   n_fea = ncol(dat) - 1
    +   # 初始化权重
    +   w = rnorm(n_fea + 1, 0, 2)
    +   # 当前迭代次数初始值
    +   current_iter = 0
    +   # 是否收敛初始值
    +   has_converged = F
    +   # 最佳权重值设为当前初始值
    +   best_w = w
    +   # 初始最佳错误数为最坏情况,所有都错
    +   best_err = n
    +   # 只要算法还没收敛并且没有达到最大迭代次数,就开始一次循环
    +   while((has_converged == F) & (current_iter < max_iter)) {
    +     # 将收敛设置为TRUE
    +     has_converged = T
    +     # 当前错误数为0
    +     current_err = 0
    +     # 对输入数据框所有行循环
    +     for(i in 1:n) {
    +       # 添加x0为1
    +       xi = unlist(cbind(x0 = 1, dat[i, -1]))
    +       yi = dat$y[i]
    +       # 计算y的预测值
    +       yhat = step_fun(sum(w * xi))
    +       # 如果因变量y的实际值不等于预测值
    +       if(yi != yhat) {
    +         # 更新迭代次数 + 1
    +         current_iter = current_iter  + 1
    +         # 更新是否收敛为FALSE,此时会继续循环
    +         has_converged = F
    +         # 更新权重值
    +         w = w + learning_rate * sign(yi - yhat) * xi
    +       }
    +     }
    +     # 如果当前错误数比最佳错误数更低
    +     if(current_err < best_err) {
    +       # 设置当前错误数为最佳错误数
    +       best_err = current_err
    +       # 设置当前权重为最佳权重
    +       best_w = w
    +     }
    +     # 更新当前迭代次数 + 1
    +     current_iter = current_iter + 1
    +   }
    +   # 返回模型信息,权重、是否收敛和迭代次数
    +   model = list("weight" = best_w, "converged" = has_converged,
    +                 "iterations" = current_iter)
    +   return(model)
    + }
    

    3、验证

    输入数据框、学习率和最大迭代次数。

    > pocket_perceptron(dat, 0.1, 1000)
    
    ## $weight
    ##         x0         x1         x2 
    ## -0.1636973  0.9394905 -2.7558517 
    ## 
    ## $converged
    ## [1] TRUE
    ## 
    ## $iterations
    ## [1] 347
    

    模型在347次迭代后收敛。

    相关文章

      网友评论

        本文标题:88-R单神经元神经网络手动实现

        本文链接:https://www.haomeiwen.com/subject/hgrcmktx.html