¿Cómo calcular el peso para minimizar la varianza?

dados varios vectores:

x1 = [3 4 6] x2 = [2 8 1] x3 = [5 5 4] x4 = [6 2 1] 

Quiero encontrar el peso w1, w2, w3 para cada elemento y obtener la sum ponderada de cada vector: yi = w1*i1 + w2*i2 + w3*i3 . por ejemplo, y1 = 3*w1 + 4*w2 + 6*w3 para minimizar la varianza de estos valores (y1, y2, y3, y4).

aviso: w1, w2, w3 debería> 0, y w1 + w2 + w3 = 1

No sé qué tipo de problemas debería ser … y cómo resolverlo en python o matlab?

    Puede comenzar con la construcción de una función de pérdida que indique la variación y las restricciones en w ‘s. La media es m = (1/4)*(y1 + y2 + y3 + y4) . La varianza es entonces (1/4)*((y1-m)^2 + (y2-m)^2 + (y3-m)^2 + (y4-m)^2) y la restricción es a*(w1+w2+w3 - 1) donde a es el multiplicador de Lagrange. El problema me parece una optimización convexa con restricciones convexas, ya que la función de pérdida es cuadrática con respecto a las variables objective (w1, w2, w3) y las restricciones son lineales. Puede buscar algoritmos de pendiente de gradiente proyectados que respeten las restricciones proporcionadas. Consulte http://www.ifp.illinois.edu/~angelia/L5_exist_optimality.pdf No hay soluciones analíticas directas para este tipo de problemas en general.

     w = [5, 6, 7] x1 = [3, 4, 6] x2 = [2, 8, 1] x3 = [5, 5, 4] y1, y2, y3 = 0, 0, 0 for index, i in enumerate(w): y1 = y1 + i * x1[index] y2 = y2 + i * x2[index] y3 = y3 + i * x3[index] print(min(y1, y2, y3)) 

    Creo que tal vez tenga el propósito de tu problema. Pero si quieres encontrar el valor más pequeño, espero que esto te pueda ayudar. Solo hago los valores fijos, puedes hacer que sea la def cuando veas que esta es una forma de resolver tu pregunta.

    No sé mucho sobre el problema de optimización, pero tengo la idea del descenso de gradiente, así que traté de reducir el peso entre la puntuación máxima y la puntuación mínima, mi script está a continuación:

     # coding: utf-8 import numpy as np #7.72 #7.6 #8.26 def get_max(alist): max_score = max(alist) idx = alist.index(max_score) return max_score, idx def get_min(alist): max_score = min(alist) idx = alist.index(max_score) return max_score, idx def get_weighted(alist,aweight): res = [] for i in range(0, len(alist)): res.append(alist[i]*aweight[i]) return res def get_sub(list1, list2): res = [] for i in range(0, len(list1)): res.append(list1[i] - list2[i]) return res def grad_dec(w,dist, st = 0.001): max_item, max_item_idx = get_max(dist) min_item, min_item_idx = get_min(dist) w[max_item_idx] = w[max_item_idx] - st w[min_item_idx] = w[min_item_idx] + st def cal_score(w, x): score = [] print 'weight', w ,x for i in range(0, len(x)): score_i = 0 for j in range(0,5): score_i = w[j]*x[i][j] + score_i score.append(score_i) # check variance is small enough print 'score', score return score # cal_score(w,x) if __name__ == "__main__": init_w = [0.2, 0.2, 0.2, 0.2, 0.2, 0.2] x = [[7.3, 10, 8.3, 8.8, 4.2], [6.8, 8.9, 8.4, 9.7, 4.2], [6.9, 9.9, 9.7, 8.1, 6.7]] score = cal_score(init_w,x) variance = np.var(score) round = 0 for round in range(0, 100): if variance < 0.012: print 'ok' break max_score, idx = get_max(score) min_score, idx2 = get_min(score) weighted_1 = get_weighted(x[idx], init_w) weighted_2 = get_weighted(x[idx2], init_w) dist = get_sub(weighted_1, weighted_2) # print max_score, idx, min_score, idx2, dist grad_dec(init_w, dist) score = cal_score(init_w, x) variance = np.var(score) print 'variance', variance print score 

    En mi práctica realmente puede reducir la varianza. Estoy muy contento, pero no sé si mi solución es sólida en matemáticas.

    Mi solución completa se puede ver en PDF .

    El truco es poner los vectores x_i como columnas de una matriz X
    Luego, escribir el problema se convierte en un problema convexo con la restricción de la solución para estar en la unidad Simplex.

    Lo resolví usando el Método de Sub Gradiente Proyectado .
    Calculé el gradiente de la función objective y creé una proyección a la unidad simplex .

    Ahora todo lo que se necesita es iterarlos.
    Validé mi solución utilizando CVX .

     % StackOverflow 44984132 % How to calculate weight to minimize variance? % Remarks: % 1. sa % TODO: % 1. ds % Release Notes % - 1.0.000 08/07/2017 % * First release. %% General Parameters run('InitScript.m'); figureIdx = 0; %= 0; cvx_end disp([' ']); disp(['CVX Solution - [ ', num2str(vW.'), ' ]']); %% Solve Using Projected Sub Gradient numIterations = 20000; stepSize = 0.001; simplexRadius = 1; %= 0. vW = ProjectSimplex(vW, simplexRadius, stopThr); end disp([' ']); disp(['Projected Sub Gradient Solution - [ ', num2str(vW.'), ' ]']); %% Restore Defaults % set(0, 'DefaultFigureWindowStyle', 'normal'); % set(0, 'DefaultAxesLooseInset', defaultLoosInset); 

    Puede ver el código completo en StackOverflow Q44984132 (el PDF también está disponible).