在预测模型中结合标量和向量变量

时间:2017-07-13 15:44:32

标签: r nlp linear-regression

重新提出问题

我有变量是标量

x1 <- 0.3
x2 <- 0.5

和矢量

的变量
X1 <- list()
X2 <- list()
X1[[1]] <- c(0.2, 0.1, 0.3)
X2[[1]] <- c(0.5, 0.1, 0.8)
X1[[2]] <- c(0.3, 0.9, 0.3)
X2[[2]] <- c(0.3, 0.9, 0.8)

我想建立一个预测模型来预测标量结果y。 有没有办法保持向量完整?描述here表明有用:

  

单个标量预测变量x和单个标量响应变量y的最简单情况称为简单线性回归。多个和/或向量值预测变量的扩展(用大写X表示)称为多元线性回归,也称为多变量线性回归。几乎所有真实世界的回归模型都涉及多个预测因子,线性回归的基本描述通常用多元回归模型来表达。

或者这是对我的误解吗?我可以将所有内容组合成一个数据帧作为变量,而不将变量作为标量和较大的向量的一部分进行区分吗?

我可以像cbind一样m <- cbind(x1,x2,X1,X2)并运行glm吗?显然不是,因为这个:

fit <- lm(m[,"X1"]~y)
# invalid type (list) for variable 'm[, "X1"]'

给出了关于列表的错误...

问题的原始提法

我是R的初学者,尝试构建预测模型,现在除了标量值之外还想添加wordvectors。 我使用text2vechttp://text2vec.org/glove.html)来构建用于单词表示的全局向量(基本上是n维中单词的语义表示)。现在我试图将这些向量包含在我的预测模型中。

示例数据:

# some users
user.id <- c(LETTERS[1:6])  
# that have rated k objects
k1 <- c(0.8, 1.0, 0.2, 0.2, 0.4, 0.2)
k2 <- c(1.0, 0.6, 0.4, 0.2, 0.2, 0.6)
k3 <- c(0.2, 0.4, 1.0, 0.8, 0.2, 0.4)

# combined in a dataframe
m <- data.frame(user.id, k1, k2, k3)  
#   user.id     k1     k2     k3
# 1       A    0.8    1.0    0.2
# 2       B    1.0    0.6    0.4
# 3       C    0.2    0.4    1.0
# 4       D    0.2    0.2    0.8
# 5       E    0.4    0.2    0.2
# 6       F    0.2    0.6    0.4

# a predictive model with three categories
pred <- as.data.frame(cbind(c(0.2, 0.2, 0.8, 0.8, 0.4, 0.5), 
                            c(0.8, 0.8, 0.2, 0.1, 0.4, 0.6),
                            c(0.2, 0.2, 0.2, 0.1, 0.9, 0.9)))

rownames(pred) <- user.id
# so user A would fall in categorie V2 with a 0.8 probability
#    V1  V2  V3
# A 0.2 0.8 0.2
# B 0.2 0.8 0.2
# C 0.8 0.2 0.2
# D 0.8 0.1 0.1
# E 0.4 0.4 0.9
# F 0.5 0.6 0.9

# now fit the predictive model with one of the variables
fit.A <- glm(m[, "kFotoA"]~., data = pred)

这应该给我一个模型来根据某些对象的评级来预测某人属于哪三个类别。 现在我有一大组wordvectors(一行矩阵,行中有224989个术语,列中有50个数字维度),我想将选定的wordvectors添加到模型中。简化的wordvectors样本,包含六个单词(每个用户一个)和五个维度:

rotterdam <- c(-0.5591611, 0.4638168, -0.6657301, -1.00970, -0.4964429)
haven <- c(-1.4801638, 0.9739170, -0.5680999, -0.68331, 0.3181312)
enneagram <- c(0.443401933, -0.147583544, -0.086073533, 0.004635453, -0.069459528)
zee <- c(-1.0437035, 0.6451703, 0.4914247, -0.8297554, -0.1023576)
oerol <- c(0.3234278, 0.3946120, -0.0951997, -0.2936957, -0.7962330)
uvh <- c(0.9152276, 0.2559245, -0.5879705, 0.7476653, 0.1205143)
glove <- rbind(rotterdam, haven, zee, enneagram, oerol, uvh)

我可以简单地将这些wordvector添加到数据框中,但我不想将它们分成标量并将它们保持为矢量。我不清楚如何继续。也许我应该尝试使用nest()包中的tidyr函数添加它们并继续使用glm?如果是这样,我该怎么做?或者我需要像lm这样的其他函数来组合模型中的标量和向量值变量吗?

我的目标是让具有相似语义结构的词语在预测模型中产生类似的影响,例如单词rotterdamhaven的相关性为0.73且应该具有或多或少的可比性影响。

library(text2vec)
sim2(glove, method = "cosine")
#            rotterdam       haven        zee  enneagram       oerol        uvh
# rotterdam  1.0000000  0.72923387  0.6174481 -0.3192074  0.50904216 -0.4043373
# haven      0.7292339  1.00000000  0.7734439 -0.8052958 -0.04653973 -0.4590087
# zee        0.6174481  0.77344390  1.0000000 -0.7948741  0.12561740 -0.8107657
# enneagram -0.3192074 -0.80529576 -0.7948741  1.0000000  0.30833610  0.6381868
# oerol      0.5090422 -0.04653973  0.1256174  0.3083361  1.00000000  0.1023369
# uvh       -0.4043373 -0.45900871 -0.8107657  0.6381868  0.10233689  1.0000000

0 个答案:

没有答案