В приведенном ниже коде я сначала создаю 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.bet между примерно 500 и переменной var.ithin до 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)
График должен подтверждать кластеризацию данных.
Надеюсь это поможет!
person
JonB
schedule
04.09.2015
R
заставил его собирать чисто программно-ориентированные ответы, что сделало его вне темы CV. - person whuber   schedule 04.09.2015