在R中绘制并求解方程

时间:2014-06-17 19:04:08

标签: r mathematical-optimization differential-equations

我想找到最小化我方程的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)

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友好的。因此,我们只需使用xw即可为我们执行此操作。你会这样做:

mu <- sum(x*w) / sum(w)

计算的第一部分(分子)实现了我在向你展示的第二段代码中使用values所做的事情。它需要每个数字并乘以相应的权重。分母只是将所有权重加在一起,这与我们在数据中看到的总数相对应。

一旦你计算出来,答案就是0.1471。这将是最小化方差的加权和的值。


如果您想绘制该值,则可以。只需创建一个封装此加权总和的新函数,其值为u,以及xw的值。我们可以通过以下function

执行此操作
squaredError <- function(x, w, r=seq(0,1,0.001)) {
    se <- function(u) {
        sum(w*(x-u)^2)
    }
    sapply(r, se)
}

这定义了一个名为squaredError的函数,它接受两个输入,可选三个输入。第一个和第二个输入是先前定义的xw向量,r表示要测试的mu值范围,用于查找平方误差的总和。默认情况下,我在01之间以0.001为步长进行了此操作。我在xw已经有词法范围的地方创建了一个辅助函数。该函数只需要一个值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 - 轴上的平方误差总和。然后,我们绘制一条垂直线,表示最小值的位置。你得到:

enter image description here

请注意,您可以使用@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附近。

enter image description here