|
- # 导入数据
- 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[X>=0] <- 1 / (1 + exp(-X[X>=0]));
- X[X<0] <- exp(X[X<0]) / (1 + exp(X[X<0]));
- 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)[1];
- columns <- dim(X)[2];
- 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[sigma >= 0.5] <- 1;
- sigma[sigma < 0.5] <- 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的语法、函数不是很清楚。本次尝试编写了一个简单的二分类逻辑回归,但发现只能写一些函数进行调用,找不到办法对上述函数进行封装。希望各位大佬给点意见。
|
|