как найти подмножество целых чисел, которые оптимизируют функцию ошибок - PullRequest
0 голосов
/ 09 июля 2020

У меня есть набор датчиков, которые собирают данные временных рядов, и я хочу выбрать их подмножество для воспроизведения всего набора сигналов. Однако это сильно зависит от того, какие датчики отбираются. Поэтому я хотел оптимизировать подбор датчиков. Я использую технику Graph Signal Processing

Код, который я использую для вычисления ошибки после определения выборки:

def regression_tikhonov_minimized(G, y, mask):
    # y = the signal
    # G = the graph, of which G.L returns the laplacian matrix
    # mask = the list of integers that act as a mask

    indl = mask
    indu = (mask == False)
    
    Luu = G.L[indu, :][:, indu]
    Wul = -G.L[indu, :][:, indl]

    if sparse.issparse(G.L):
        sol_part = sparse.linalg.spsolve(Luu, Wul.dot(y[indl]))
    else:
        sol_part = np.linalg.solve(Luu, np.matmul(Wul, y[indl]))

    return rmse(y[indu], sol_part)

Поэтому я беру случайную выборку из 10 целых чисел ( в качестве маски) от 0 до 42 (целые числа обозначают позиции индекса сигнала, который выбирается). 42 - это количество датчиков, которые у меня есть.

signal = [signal at specific time point]
n = 42
recordings = []
sets = []
for i in range(0,5000):
    
    ind = random.sample(range(N),10)
    if set(ind) in sets:
        continue
    else:
        sets.append(set(ind))
        mask = np.zeros(signal.shape, bool)
        mask[ind] = True
    
        recordings.append([regression_tikhonov_minimized(adjG, signal, mask), ind])

Затем я мог бы выбрать наиболее эффективный набор датчиков. Но тогда мне нужно проверить каждую комбинацию из 10 целых чисел от 0 до 42 без замены, что невозможно. Есть ли другие методы?

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

    rmse        nodes   
1   1.866433    [1, 6, 39, 20, 36, 3, 23, 40, 33, 26]
2   2.023630    [23, 41, 4, 28, 32, 9, 7, 34, 3, 20]
3   2.051780    [17, 11, 3, 41, 20, 19, 5, 21, 36, 8]
4   2.082243    [20, 3, 2, 6, 10, 4, 41, 8, 17, 15]
5   2.087589    [11, 21, 9, 13, 20, 5, 3, 41, 7, 12]
....
....

Кто-нибудь знает другие подходы? Могу ли я, например, применить какой-нибудь метод оптимизации, чтобы найти лучший набор целых чисел?

Заранее спасибо!

...