我想找到最小化我方程的u
的值(最小二乘)sum(w*(x-u)^2)
有可能在R中绘制这个等式吗?这可能会让我直观地选择最小化等式的值u
。
是否也可以求解最小化方程的u
值?
x <- c(0.18, -1.54, 0.42, 0.95)
w <- c(2, 1, 3, 1)
sum(w*(x-u)^2)
答案 0 :(得分:3)
您必须参加回归模型 coursera.org
课程。这是第一次测验的第一个问题。如果您从课堂上回想起来,那么最小化该总和的值就是x
中您的值的平均值。没有必要绘制这个。
然而,您现在有权重来处理。这些权重意味着这些显示多少次您看到特定值。使用您的示例,您会看到0.18
2次,-1.54
1次,0.42
3次,0.95
1次。因此,我们共有7个数字。
如果你想找到这个的实际平均值/平均值,你可以这样做:
values <- (0.18 + 0.18 - 1.54 + 0.42 + 0.42 + 0.42 + 0.95)
numberElements <- 7
mu <- values / numberElements
但是,如果你想更优雅地做到这一点,那真的只是:
values <- (2*0.18 + 1*(-1.54) + 3*(0.42) + 0.95)
numberElements <- 7
mu <- values / numberElements
这不是R
友好的。因此,我们只需使用x
和w
即可为我们执行此操作。你会这样做:
mu <- sum(x*w) / sum(w)
计算的第一部分(分子)实现了我在向你展示的第二段代码中使用values
所做的事情。它需要每个数字并乘以相应的权重。分母只是将所有权重加在一起,这与我们在数据中看到的总数相对应。
一旦你计算出来,答案就是0.1471
。这将是最小化方差的加权和的值。
如果您想绘制该值,则可以。只需创建一个封装此加权总和的新函数,其值为u
,以及x
和w
的值。我们可以通过以下function
:
squaredError <- function(x, w, r=seq(0,1,0.001)) {
se <- function(u) {
sum(w*(x-u)^2)
}
sapply(r, se)
}
这定义了一个名为squaredError
的函数,它接受两个输入,可选三个输入。第一个和第二个输入是先前定义的x
和w
向量,r
表示要测试的mu
值范围,用于查找平方误差的总和。默认情况下,我在0
和1
之间以0.001
为步长进行了此操作。我在x
和w
已经有词法范围的地方创建了一个辅助函数。该函数只需要一个值u
,即我们正在测试的平均值。然后,我们调用sapply
来迭代我们在mu
中指定的squaredError
的所有值。 squaredError
的输出将为您指定为mu
的每个值的平方误差总和。然后我们可以绘制结果。
# Figure out which index gives us the minimum value
# Assume x and w are defined as before
r <- seq(0,1,0.001)
out <- squaredError(x, w, r)
minIndex <- which.min(out)
minMu <- r[minIndex] # This reports 0.147... not exact but that depends on the resolution of r
minObjective <- out[minIndex] # This reports 3.716543 which is the least sum of squared error
plot(r, out)
abline(v=minMu, lwd=5, col="red")
上面的代码找到最小值的位置,并使用y
- 轴上选定的mu
值绘制x
- 轴上的平方误差总和。然后,我们绘制一条垂直线,表示最小值的位置。你得到:
请注意,您可以使用@MrFlick所述的optimize
。但是,如果您想以图形方式进行,这是一种可能的方法。
答案 1 :(得分:3)
通常,如果要为单个参数优化函数,可以使用optimize
函数
x <- c(0.18, -1.54, 0.42, 0.95)
w <- c(2, 1, 3, 1)
optimize( function(u){ sum(w*(x-u)^2) }, interval=c(-100,100))
# $minimum
# [1] 0.1471429
#
# $objective
# [1] 3.716543
如果需要,您也可以为u
的不同值绘制此目标函数。在这里,我们定义u
的函数(我们使用sapply
,否则sum()
会在运行多个点的函数时折叠结果)并使用curve()
obj <- function(U){sapply(U, function(u) sum(w*(x-u)^2))}
curve(obj, from=-2, to=2)
你可以看到最小值出现在0.1471429附近。