Optimization issue - Solution converges for any initial value

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Optimization issue - Solution converges for any initial value

Paul Gilbert-2
Narendra

You should check the definition of your objective function, something
seems to be wrong.  When you evaluate the objective function with your
initial guess, and then with some different value, you should expect the
returned value will be different, but it is not:

 > print(Koval.Error.func(vp.kval, n=1), digits=20)
[1] 2767.1357969742521163
 > print(Koval.Error.func(2*vp.kval, n=1), digits=20)
[1] 2767.1357969742521163

So the objective function is flat. Optim converges with the message
"CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL". Of course, the
gradient is zero because the objective function is flat.

This would normally be considered a "user error" but perhaps John's
newer code can catch it?

Paul

> Date: Thu, 29 Sep 2016 14:53:08 -0500
> From: Narendra Modi <[hidden email]>
> To: "[hidden email]" <[hidden email]>
> Subject: [R] Optimization issue - Solution converges for any initial
> value
> Message-ID:
> <CAPq=[hidden email]>
> Content-Type: text/plain; charset=UTF-8
>
> I have put together a R snippet wherein I am trying to get optimum
> values for which error is minimized. The error is the difference
> between two matrices.
> Every time I run the below code, I don't see any optimization
> happening as in the final answer is the same as the initial estimate
> regardless of what I mention as initial estimate.
> Could you please advise on how can I improve it?
> I have also tried using nloptr but to no avail.
>
> To optimize vp.kval
>
>
>
>
> my.data.matrix.prod <- matrix(a,nrow = length(a),1)
> Estimated.Qt.mat <- matrix(b,nrow = nrow(my.data.matrix.prod), ncol = 1)
> Cum.WInj.matrix <- matrix (c,nrow = nrow(my.data.matrix.prod), ncol = 1)
> Koval.tD <- matrix(,nrow = nrow(my.data.matrix.prod), ncol = 1)  # tD Matrix
> Koval.fw <- matrix(,nrow = nrow(my.data.matrix.prod), ncol = 1) # fw Matrix
>
> Koval.Error.func <- function(vp.kval,n)
> {
>   #First convert vector(Koval.InitialData.list) to MATRIX and send it
> to calculate estimated matrix
>
>   Koval.InitialData.Matrix <- matrix(vp.kval,nrow = 2, 1,byrow = TRUE)
>  # Define Koval Parameters Matrix for the "n"
>
>   Qo.Koval <- Qo.Koval(Koval.InitialData.Matrix)  # Get Qo Estimation from Koval
>
>   diff.values <- my.data.matrix.prod[,n] - Qo.Koval  #FIND DIFFERENCE
> BETWEEN CAL. MATRIX AND ORIGINAL MATRIX
>
>   Error <- ((colSums ((diff.values^2), na.rm = TRUE, dims =
> 1))/nrow(my.data.matrix.prod))^0.5    #sum of square root of the diff
>
>   Error   # return error value
> }
>
> Qo.Koval <- function(Koval.InitialData.Matrix)
> {
>   Qo.Koval.Est <- matrix(,nrow(my.data.matrix.prod), 1)
> #ncol(my.data.matrix.prod)
>
>   for(rowno in 1:nrow(my.data.matrix.prod)) #number of rows of data
>   {
>     Koval.tD[rowno,1] = Cum.WInj.matrix[rowno,1] *
> Koval.InitialData.Matrix[1,1]   # Evaluate tD matrix
>
>     if(Koval.tD[rowno,1] < (1/Koval.InitialData.Matrix[2,1]))
>     {
>       Koval.fw[rowno,1] = 0
>     }
>     else
>     {
>       if(Koval.tD[rowno,1] > Koval.InitialData.Matrix[2,1])
>       {
>         Koval.fw[rowno,1] = 1
>       }else
>       {
>         Koval.fw[rowno,1] = (Koval.InitialData.Matrix[2,1] -
> sqrt(Koval.InitialData.Matrix[2,1]/Koval.tD[rowno,1]))/(Koval.InitialData.Matrix[2,1]-1)
>       }
>     }
>
>     Qo.Koval.Est[rowno,1] = Koval.fw[rowno,1] * Estimated.Qt.mat[rowno,1]
>   }
>
>   Qo.Koval.Est    # Return Estimated matrix
> }
>
> vp.kval <- c(100000,1)  #initial estimate
> Koval.lb = c(0,0)
> Koval.ub = c(Inf,Inf)
> n <- 1
> Koval.result <- optim(vp.kval,Koval.Error.func, method = "L-BFGS-B",
> lower = Koval.lb,
>                      upper = Koval.ub, n=n)
> print(paste(Koval.result$convergence))
> print(paste(Koval.result$par))
>
>
> Here is the input data:
>
> a:
>
> structure(c(414, 40, 639, 616, 677, 598, 586, 494, 322, 351,
> 322, 213, 395, 358, 406, 384, 409, 404, 370, 376, 412, 404, 369,
> 391, 341, 350, 349, 313, 302, 196, 386, 330, 350, 323, 454, 465,
> 465, 399, 416, 396, 453, 388, 496, 379, 472, 491, 492, 503, 516,
> 454, 630, 547, 578, 312, 764, 672, 548, 611, 546, 552, 520, 486,
> 581, 559, 433, 262, 650, 615, 542, 571, 542, 529, 577, 469, 557,
> 540, 546, 519, 376, 605, 520, 435, 299, 531, 538, 475, 511, 487,
> 490, 494, 537, 482, 438, 498, 312, 476, 383, 382), .Dim = c(98L,
> 1L), .Dimnames = list(NULL, "Q2"))
>
> b:
>
> structure(c(2342.12883525675, 2595.06229039124, 2715.2774272809,
> 2742.14586849367, 2678.48814516156, 2769.17482063132, 2809.26904957691,
> 2647.26143288146, 2142.48588931211, 1986.26692938822, 2417.80180308667,
> 2539.99173834861, 2889.68696098066, 2949.03395956634, 3345.265659123,
> 3178.09552101488, 3202.97894028497, 3294.04615708455, 3273.96002181006,
> 3290.59294404149, 3074.57078080845, 2809.00966959208, 2870.20594457832,
> 2994.89960881099, 3031.51083818418, 2838.72778780229, 2779.83367818986,
> 2471.70302686638, 2277.52074079803, 2313.67080371772, 2415.57558854185,
> 2593.57170885689, 2579.65222779155, 2542.47630393453, 2610.16334633228,
> 2715.1622580481, 2680.04491562794, 2676.08878142995, 2890.5657368073,
> 2939.98447437336, 2932.41354171428, 2699.29100102243, 2748.9757584712,
> 2885.90115387751, 2841.03004973532, 3111.28842226602, 3293.09352655985,
> 3448.16679970445, 3470.58231818316, 3077.6191619663, 2892.81263635983,
> 2563.00601428125, 2410.40833201752, 2696.80369889632, 3250.95996536945,
> 3900.33363068933, 3571.89127039948, 3569.09158205254, 3718.94141619046,
> 3963.05018539626, 4317.67764180387, 4143.2306512351, 4482.33003541385,
> 4313.47162218783, 4162.58533919444, 4119.75974744111, 4080.01960112015,
> 4146.78116940934, 3848.98992961189, 3507.00912988581, 3336.3269842557,
> 3691.50683899193, 3616.0923981163, 3325.14304882807, 3471.79805853069,
> 3229.60965194249, 3106.05768279943, 3184.66721766981, 3140.79657087168,
> 3242.97205541341, 3090.78617601495, 3086.74973135927, 3317.74000570974,
> 3594.90929884806, 3716.02759860505, 3622.91307702134, 3793.8518218782,
> 3666.82966979173, 3779.4557494045, 3750.98605852729, 3333.45681985961,
> 3057.22984206785, 3395.04273620089, 3623.47886822009, 3690.34495906538,
> 3827.97665203175, 3933.61679986677, 3762.82354740958), .Dim = c(98L,
> 1L))
>
> c:
>
> structure(c(2854.17262019504, 91576.5893971961, 171680.262910889,
> 257565.867448752, 335812.78671975, 424624.296030534, 510229.898689908,
> 586994.432148103, 636896.230541501, 691311.784820203, 780382.614051205,
> 860628.109248455, 961649.745761829, 1055011.51571743, 1162113.22730208,
> 1255164.70993334, 1352077.97513698, 1457172.94644257, 1554726.68952114,
> 1657279.26732716, 1745523.14071769, 1821000.62788843, 1911979.2340704,
> 2005954.86455037, 2101129.54803795, 2182822.62676551, 2258661.15941603,
> 2325202.52364728, 2387098.71588595, 2460005.26984465, 2535846.63352407,
> 2622071.03988945, 2701584.84087477, 2776628.22472118, 2859757.87551639,
> 2944689.28669068, 3026621.7086177, 3109451.02390273, 3200463.68736646,
> 3293220.09008416, 3380941.82063061, 3456992.53009029, 3541106.87910663,
> 3635049.74483035, 3721653.58199201, 3823940.56521733, 3931974.7704047,
> 4040554.293988, 4148875.73758196, 4231424.94909108, 4306157.82023537,
> 4374820.38189491, 4442080.07977206, 4535051.28823047, 4650928.35668784,
> 4793084.92990124, 4893067.57046614, 5000047.61946087, 5120237.59556207,
> 5247211.61097682, 5392662.33159569, 5515394.91894634, 5652397.35652795,
> 5780590.26125026, 5900471.93425283, 6026783.31719041, 6147868.09782702,
> 6278602.62144284, 6388178.16489299, 6482065.35854026, 6579907.11054506,
> 6702412.42037957, 6812043.87236422, 6905604.01572694, 7007786.71329603,
> 7099980.68361161, 7189071.57372477, 7290368.20702837, 7383139.53472758,
> 7487014.64958016, 7577849.79802546, 7670318.64215094, 7780726.13033402,
> 7897750.56237753, 8016910.17077053, 8126173.95193153, 8241923.12215802,
> 8351438.92663496, 8468551.68021943, 8583900.77567578, 8670079.97000769,
> 8755816.49103472, 8872115.39013376, 8988383.34061776, 9104971.76148562,
> 9224368.08502439, 9349766.5439318, 9460826.05419725), .Dim = c(98L,
> 1L))
>

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.