找回密码
 立即注册
查看: 9191|回复: 2

刚入门R语言,尝试使用R编写一个逻辑回归

[复制链接]
发表于 2021-3-7 13:57:53 | 显示全部楼层 |阅读模式
  1. # 导入数据
  2. data_train <- read.table("C:/Code/R/RData/iris_train.csv", header=TRUE, sep=",")
  3. X_train <- as.matrix(data_train[, -5])
  4. y_train <-  matrix(data_train[, 5])

  5. data_test <- read.table("C:/Code/R/RData/iris_test.csv", header=TRUE, sep=",")
  6. X_test <- as.matrix(data_test[, -5])
  7. y_test <-  matrix(data_test[, 5])
复制代码
  1. # 各个函数定义

  2. sigmoid <- function(X) {
  3.     # 定义sigmoid函数
  4.     # 依照sigmoid(X) = 1 / (1 + exp(-X))公式对该函数实现做以下修改
  5.     # 对X中大于等于0的元素使用公式 1 / (1 + exp(-X))
  6.     # 对X中小于0的元素使用公式 exp(X) / (1 + exp(X))
  7.     X[X>=0] <- 1 / (1 + exp(-X[X>=0]));
  8.     X[X<0] <- exp(X[X<0]) / (1 + exp(X[X<0]));
  9.     return (X);
  10. }

  11. loss <- function(X, y, W) {
  12.     # 定义损失函数(二分类交叉熵)
  13.     sigma <- sigmoid(X %*% W);
  14.     # 其中加上1e-5是为了防止出现log(0)的情况
  15.     L <- sum(y * log(sigma + 1e-5) + (1- y) * log(1 - sigma + 1e-5));
  16.     return (-L);
  17. }

  18. fit_W <- function(X, y, alpha=0.01, eps=1e-5, n_iters=1e4) {
  19.     # 训练函数,返回权重W
  20.     X <- as.matrix(X);
  21.     y <- as.matrix(y, length(X), 1);
  22.    
  23.     rows <- dim(X)[1];
  24.     columns <- dim(X)[2];
  25.     W <- matrix(0, columns, 1);
  26.    
  27.     i <- 0;
  28.     # 简单的梯度下降
  29.     while (T) {
  30.         W_last <- W;
  31.         sigma <- sigmoid(X %*% W);
  32.         dw <- t(X) %*% (sigma - y);
  33.         W <- W - alpha * dw;

  34.         if (abs(loss(X, y, W_last) - loss(X, y, W)) < eps) {
  35.             break;
  36.         }
  37.         
  38.         if (i > n_iters) {
  39.             print("超过最大迭代次数");
  40.             break;
  41.         }
  42.         
  43.         i = i + 1;
  44.     }
  45.    
  46.     return (W);
  47. }

  48. predict <- function(X_test, W) {
  49.     sigma <- sigmoid(X_test %*% W);
  50.    
  51.     sigma_last <- sigma;
  52.     sigma[sigma >= 0.5] <- 1;
  53.     sigma[sigma < 0.5] <- 0;
  54.    
  55.     return (c(sigma))
  56. }

  57. score <- function(X_test, y_test, W) {
  58.    
  59.     y_length <- length(y_test);
  60.     X_test <- as.matrix(X_test);
  61.     y_test <- as.matrix(y_test, y_length, 1);
  62.    
  63.     y_pre <- matrix(predict(X_test, W), y_length, 1);
  64.     score <- sum(y_test == y_pre) / y_length;
  65.    
  66.     return (score);
  67. }
复制代码
  1. # 进行训练、返回结果
复制代码



       本人刚刚接触R语言,有一点Python的基础,同时对很多R的语法、函数不是很清楚。本次尝试编写了一个简单的二分类逻辑回归,但发现只能写一些函数进行调用,找不到办法对上述函数进行封装。希望各位大佬给点意见。

回复

使用道具 举报

 楼主| 发表于 2021-3-7 13:59:45 | 显示全部楼层
  1. # 进行训练、返回结果
  2. w <- fit_W(X_train, y_train, alpha=0.01, eps=1e-5, n_iters=1e4)
  3. score(X_test, y_test, w)
复制代码
回复

使用道具 举报

发表于 2021-5-19 08:49:17 | 显示全部楼层
厉害,厉害javascript:void(0)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|R语言中文网

GMT+8, 2024-11-22 02:35 , Processed in 0.034265 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表