You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据非正态分布时,如何在RStudio中实现基于似然的判别分析?

基于似然性的判别分析在RStudio中的实现

当然可以在RStudio中实现基于观测值似然性的判别分析,这类方法无需假设变量服从正态分布,核心是通过非参数方法估计每个类别的类条件密度,再借助贝叶斯公式计算后验概率完成判别。以下是几种实用的实现方式:

1. 核密度估计结合贝叶斯判别

使用np包做非参数核密度估计,手动计算样本的类别后验概率:

# 安装并加载包
install.packages("np")
library(np)

# 示例:拆分训练集与测试集(可根据需求调整)
set.seed(123)
train_idx <- sample(nrow(data), 0.7*nrow(data))
train_data <- data[train_idx,]
test_data <- data[-train_idx,]

# 估计每个类别的核密度
classes <- unique(train_data$y)
dens_list <- list()
for (cls in classes) {
  cls_feature <- train_data[train_data$y == cls, !(names(train_data) %in% "y")]
  dens_list[[as.character(cls)]] <- npudens(~., data = cls_feature)
}

# 定义判别函数
predict_class <- function(test_row) {
  prob_vec <- c()
  for (cls in classes) {
    dens_val <- predict(dens_list[[as.character(cls)]], newdata = test_row)
    prior_prob <- mean(train_data$y == cls)
    prob_vec <- c(prob_vec, dens_val * prior_prob)
  }
  # 取归一化后概率最大的类别
  classes[which.max(prob_vec / sum(prob_vec))]
}

# 批量预测并评估准确率
test_data$pred_y <- apply(test_data[, !(names(test_data) %in% "y")], 1, predict_class)
mean(test_data$pred_y == test_data$y)

2. 非参数判别分析(MDA包)

mda包提供了封装好的非参数判别分析实现,无需正态假设:

install.packages("mda")
library(mda)

# 拟合模型
mda_model <- mda(y ~ ., data = train_data)

# 预测并评估
test_data$pred_y <- predict(mda_model, newdata = test_data)
mean(test_data$pred_y == test_data$y)

3. k近邻判别(kNN)

k近邻方法本质是基于局部观测的似然思想,通过邻居类别完成判别,使用class包即可实现:

install.packages("class")
library(class)

# 提取特征与类别列
train_x <- train_data[, !(names(train_data) %in% "y")]
train_y <- train_data$y
test_x <- test_data[, !(names(test_data) %in% "y")]

# 拟合并预测(以k=5为例)
pred_y <- knn(train = train_x, test = test_x, cl = train_y, k = 5)

# 评估准确率
mean(pred_y == test_data$y)

你可以根据数据集的规模、特征维度选择合适的方法,上述代码均可在RStudio中直接运行。

内容的提问来源于stack exchange,提问作者Billy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:05:28