Muse_Knight 发表于 2021-3-7 13:57:53

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

# 导入数据
data_train <- read.table("C:/Code/R/RData/iris_train.csv", header=TRUE, sep=",")
X_train <- as.matrix(data_train[, -5])
y_train <-matrix(data_train[, 5])

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

sigmoid <- function(X) {
    # 定义sigmoid函数
    # 依照sigmoid(X) = 1 / (1 + exp(-X))公式对该函数实现做以下修改
    # 对X中大于等于0的元素使用公式 1 / (1 + exp(-X))
    # 对X中小于0的元素使用公式 exp(X) / (1 + exp(X))
    X <- 1 / (1 + exp(-X));
    X <- exp(X) / (1 + exp(X));
    return (X);
}

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

fit_W <- function(X, y, alpha=0.01, eps=1e-5, n_iters=1e4) {
    # 训练函数,返回权重W
    X <- as.matrix(X);
    y <- as.matrix(y, length(X), 1);
   
    rows <- dim(X);
    columns <- dim(X);
    W <- matrix(0, columns, 1);
   
    i <- 0;
    # 简单的梯度下降
    while (T) {
      W_last <- W;
      sigma <- sigmoid(X %*% W);
      dw <- t(X) %*% (sigma - y);
      W <- W - alpha * dw;

      if (abs(loss(X, y, W_last) - loss(X, y, W)) < eps) {
            break;
      }
      
      if (i > n_iters) {
            print("超过最大迭代次数");
            break;
      }
      
      i = i + 1;
    }
   
    return (W);
}

predict <- function(X_test, W) {
    sigma <- sigmoid(X_test %*% W);
   
    sigma_last <- sigma;
    sigma <- 1;
    sigma <- 0;
   
    return (c(sigma))
}

score <- function(X_test, y_test, W) {
   
    y_length <- length(y_test);
    X_test <- as.matrix(X_test);
    y_test <- as.matrix(y_test, y_length, 1);
   
    y_pre <- matrix(predict(X_test, W), y_length, 1);
    score <- sum(y_test == y_pre) / y_length;
   
    return (score);
}
# 进行训练、返回结果


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

Muse_Knight 发表于 2021-3-7 13:59:45

# 进行训练、返回结果
w <- fit_W(X_train, y_train, alpha=0.01, eps=1e-5, n_iters=1e4)
score(X_test, y_test, w)

boboqiu 发表于 2021-5-19 08:49:17

厉害,厉害javascript:void(0)
页: [1]
查看完整版本: 刚入门R语言,尝试使用R编写一个逻辑回归