Как рассчитать вес, чтобы минимизировать дисперсию?

учитывая несколько векторов:

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

Я хочу найти вес w1, w2, w3 для каждого элемента и получить взвешенную сумму каждого вектора: yi = w1*i1 + w2*i2 + w3*i3 . например, y1 = 3*w1 + 4*w2 + 6*w3 чтобы минимизировать дисперсию этих значений (y1, y2, y3, y4).

Примечание: w1, w2, w3 должны> 0, а w1 + w2 + w3 = 1

Я не знаю, какие проблемы это должно быть … и как его решить в python или matlab?

4 Solutions collect form web for “Как рассчитать вес, чтобы минимизировать дисперсию?”

Вы можете начать с создания функции потерь с указанием дисперсии и ограничений на w . Среднее значение m = (1/4)*(y1 + y2 + y3 + y4) . Тогда дисперсия равна (1/4)*((y1-m)^2 + (y2-m)^2 + (y3-m)^2 + (y4-m)^2) и ограничение есть a*(w1+w2+w3 - 1) где a – множитель Лагранжа. Проблема выглядит для меня выпуклой оптимизацией с выпуклыми ограничениями, поскольку функция потерь квадратична относительно целевых переменных (w1, w2, w3), а ограничения линейны. Вы можете искать проецируемые градиентные алгоритмы спуска, которые соответствуют предоставленным ограничениям. Взгляните сюда http://www.ifp.illinois.edu/~angelia/L5_exist_optimality.pdf В таких проблемах нет простых аналитических решений.

 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)) 

Я думаю, что я, возможно, стану цели вашей проблемы. Но если вы хотите найти наименьшее значение, я надеюсь, что это может вам помочь. Я просто фиксирую значения, вы можете сделать это def когда увидите, что это один из способов решения вашего вопроса.

Я не знаю много о проблеме оптимизации, но я получаю идею градиентного спуска, поэтому я попытался уменьшить вес между максимальным счетом и минимальным счетом, мой сценарий ниже:

 # 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 

В моей практике это действительно может уменьшить дисперсию. Я очень рад, но я не знаю, твердо ли мое решение в математике.

Мое полное решение можно просмотреть в формате PDF .

Трюк состоит в том, чтобы поместить векторы x_i виде столбцов матрицы X
Тогда запись проблемы становится выпуклой проблемой с ограничением решения на модуле Simplex.

Я решил это с помощью метода Project Sub Sub Gradient .
Я вычислил градиент целевой функции и создал проекцию на модуль Simplex .

Теперь все нужно, чтобы итератировать их.
Я проверил свое решение с помощью 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; %<! Continue from Question 1 figureCounterSpec = '%04d'; generateFigures = OFF; %% Simulation Parameters dimOrder = 3; numSamples = 4; mX = randi([1, 10], [dimOrder, numSamples]); vE = ones([dimOrder, 1]); %% Solve Using CVX cvx_begin('quiet') cvx_precision('best'); variable vW(numSamples) minimize( (0.5 * sum_square_abs( mX * vW - (1 / numSamples) * (vE.' * mX * vW) * vE )) ) subject to sum(vW) == 1; vW >= 0; cvx_end disp([' ']); disp(['CVX Solution - [ ', num2str(vW.'), ' ]']); %% Solve Using Projected Sub Gradient numIterations = 20000; stepSize = 0.001; simplexRadius = 1; %<! Unit Simplex Radius stopThr = 1e-6; hKernelFun = @(vW) ((mX * vW) - ((1 / numSamples) * ((vE.' * mX * vW) * vE))); hObjFun = @(vW) 0.5 * sum(hKernelFun(vW) .^ 2); hGradFun = @(vW) (mX.' * hKernelFun(vW)) - ((1 / numSamples) * vE.' * (hKernelFun(vW)) * mX.' * vE); vW = rand([numSamples, 1]); vW = vW(:) / sum(vW); for ii = 1:numIterations vGradW = hGradFun(vW); vW = vW - (stepSize * vGradW); % Projecting onto the Unit Simplex % sum(vW) == 1, vW >= 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); 

Вы можете увидеть полный код в StackOverflow Q44984132 (также доступен PDF).

  • Проблема реализации Backprop
  • Матрица от Python до MATLAB
  • Как я могу получить те же «специальные» решения для недоопределенных линейных систем, которые возвращает оператор Matlab `A \ b` (mldivide) с помощью numpy / scipy?
  • Проблема для вставки с использованием psycopg
  • Периодограмма в Octave / Matlab vs Scipy
  • Точность, почему Matlab и Python numpy дают разные результаты?
  • Сценарий Matlab не найден из django views.py
  • Yahoo финансы ichart наличие услуг
  • Среди MATLAB и Python, какой из них хорош для статистического анализа?
  • для цикла в python в 10 раз медленнее, чем matlab
  • Python для MATLAB: экспорт списка строк с использованием scipy.io
  •  
    Interesting Posts for Van-Lav

    str на время в python

    Использование NLTK и WordNet; как преобразовать простой напряженный глагол в его нынешнюю, прошлую или прошлую форму причастия?

    Соглашение о присвоении имен Christoph Gohlke для неофициальных бинарных файлов Windows для пакетов расширения Python

    Ошибка Unicode с использованием matplotlib с масштабом журнала в Windows

    Функция переключения имен Python

    Django – Как отсортировать набор запросов по количеству символов в поле

    фильтр функции sniff в scapy не работает должным образом

    Простая реализация многоуровневой нейронной сети

    используя python, удалять HTML-теги / форматирование из строки

    Как использовать переменные в регулярном выражении Python

    Python загружает json-файл с заголовком спецификации UTF-8

    Как настроить ipython для отображения целых чисел в шестнадцатеричном формате?

    Python импортирует и использует cdll (с файлом linux .so)

    В numpy, что делает выбор с помощью ?

    Python ValueError: небезопасный струйный рассол

    Python - лучший язык программирования в мире.