如何在R中的这2个场景中生成高斯分布的数据?

时间:2015-09-04 12:01:17

标签: r normal-distribution

在Tibshirani的“统计学习要素”中,当比较最小二乘/线性模型和knn时,这两种情况被陈述:

  

场景1:每个班级的训练数据都是由具有不相关分量和不同均值的双变量高斯分布生成的。

     

场景2:每个班级的训练数据来自10的混合   低方差高斯分布,单独表示自身   以高斯分布。

这个想法是第一个更适合于最小二乘/线性模型,第二个更适合类似模型(那些具有更高方差的因为我知道因为knn考虑了最接近的点而不是所有点)。

在R中,我如何模拟这两种情况的数据?

最终目标是能够重现这两种情景,以证明线性模型比第二种情况有效地解释了第一种情况。

谢谢!

3 个答案:

答案 0 :(得分:1)

在下面的代码中,我首先创建了10种不同的类,然后使用这些方法从这些方法中绘制随机值。这两种情况的代码是相同的,但您必须调整类内和类之间的方差以获得所需的结果。

情景1:

在这里你想用不同的方法生成10个类(我假设这些方法遵循双变量高斯分布)。类之间的差异远小于类中的差异。

library(MASS)
n <- 20
# subjects per class
classes <- 10
# number of classes
mean <- 100
# mean value for all classes
var.between <- 25
# variation between classes
var.within <- 225
# variation within classes
covmatrix1 <- matrix(c(var.between,0,0,var.between), nrow=2)
# covariance matrix for the classes
means <- mvrnorm(classes, c(100,100), Sigma=covmatrix1)
# creates the means for the two variables for each class using variance between classes
covmatrix2 <- matrix(c(var.within,0,0,var.within), nrow=2)
# creates a covariance matrix for the subjects
class <- NULL
values <- NULL
for (i in 1:10) {
  temp <- mvrnorm(n, c(means[i], means[i+classes]), Sigma=covmatrix2)
  class <- c(class, rep(i, n))
values <- c(values, temp)
}
# this loop uses generates data for each class based on the class means and variance within classes
valuematrix <- matrix(values, nrow=(n*classes))
data <- data.frame (class, valuematrix)
plot(data$X1, data$X2)

或者,如果您不关心指定类之间的差异,并且您不希望在类中进行任何关联,则可以这样做:

covmatrix <- matrix(c(225, 0, 0, 225), nrow=2)
# specifies that the variance in both groups is 225 and no covariance
values <- matrix(mvrnorm(200, c(100,100), Sigma=covmatrix), nrow=200)
# creates a matrix of 200 individuals with two values each.

情景2:

这里唯一的区别是类之间的差异大于类中的变化。尝试将变量var.between的值交换为大约500,将变量var.within交换为25,您将在散点图中看到清晰的聚类:

n <- 20
# subjects per class
classes <- 10
# number of classes
mean <- 100
# mean value for all classes
var.between <- 500
# variation between classes
var.within <- 25
# variation within classes
covmatrix1 <- matrix(c(var.between,0,0,var.between), nrow=2)
# covariance matrix for the classes
means <- mvrnorm(classes, c(100,100), Sigma=covmatrix1)
# creates the means for the two variables for each class using variance between classes
covmatrix2 <- matrix(c(var.within,0,0,var.within), nrow=2)
# creates a covariance matrix for the subjects
class <- NULL
values <- NULL
for (i in 1:10) {
  temp <- mvrnorm(n, c(means[i], means[i+classes]), Sigma=covmatrix2)
  class <- c(class, rep(i, n))
values <- c(values, temp)
}
# this loop uses generates data for each class based on the class means and variance within classes
valuematrix <- matrix(values, nrow=(n*classes))
data <- data.frame (class, valuematrix)
plot(data$X1, data$X2)

图表应确认数据已聚集。

希望这有帮助!

答案 1 :(得分:1)

这可能是情景1

library(mvtnorm)

N1 = 50
N2 = 50
K = 2

mu1 = c(-1,3)
mu2 = c(2,0)

cov1 = 0
v11 = 2
v12 = 2
Sigma1 = matrix(c(v11,cov1,cov1,v12),nrow=2)

cov2 = 0
v21 = 2
v22 = 2
Sigma2 = matrix(c(v21,cov2,cov2,v22),nrow=2)

x1 = rmvnorm(N1,mu1,Sigma1)
x2 = rmvnorm(N2,mu2,Sigma2)

这可能是从高斯混合模拟的候选者:

BartSimpson <- function(x,n = 100){ 
   means <- as.matrix(sort(rnorm(10)))
   dens <- .1*rowSums(apply(means,1,dnorm,x=x,sd=.1)) 
   rBartSimpson <- c(apply(means,1,rnorm,n=n/10,sd=.1))
   return(list("thedensity" = dens,"draws" = rBartSimpson))
}

x <- seq(-5,5,by=.01)

plot(x,BartSimpson(x)$thedensity,type="l",lwd=4,col="yellow2",xlim=c(-4,4),ylim=c(0,0.6))

答案 2 :(得分:0)

在这两个答案的帮助下,我最终使用了这个:

{{1}}

所以基本上情景1中的数据在2个类中干净地分开,情景2中的数据有大约10个聚类,并且不能用直线干净地分开。实际上,在两种情况下运行线性模型可以看出,平均而言,它将更好地应用于方案1而不是方案2。