如何解决建立权重矩阵,使其有效地求和
我正在创建一个线性组合生成器和测试器。目的是测试N个输入的所有线性组合,以确定哪个产生最佳得分。
创建权重矩阵的方法可以强制执行,如下所示。但是,当可以有2个以上没有上限的模块时,这在应用程序中并不灵活。有没有办法概括这些代码?
以矩阵形式生成此输出也是理想的,因此我可以简单地将输入矩阵与标量相乘以获得线性组合输出!
编辑:完全明确。我正在寻找一种灵活引用的方式
for i in range...:
for j in range...:
for k in range...
用于2、3、4,+个模块
def generate_weights(n=4,min_weight=0,max_weight=100):
weight_dictionary = {}
combination = 1
for i in range(0,101):
for j in range(0,101):
for k in range(0,101):
for l in range(0,101):
# For Now,ignoring conditions on each individual scalar's min and max weight criteria
if i + j + k + l == 100:
weight_dictionary[combination] = (i,j,k,l)
combination+=1
return weight_dictionary
test = generate_weights()
解决方法
由于“ i + j + k + l == 100”,您不需要每次都计算范围0〜100,因此可以限制范围并排除不可能的值,例如:
for i in range(0,101):
for j in range(0,101-i):
for k in range(0,101-i-j):
for l in range(0,101-i-j-k):
之前的时间复杂度:O(n ** 4)
>>> test = generate_weights()
Time: 12.879271500000016
时间复杂度:O(n * log(n))
>>> test = generate_weights()
Time: 0.6409992999999758
,
应对未知深度的堆叠循环的最简单方法通常是使用递归。每次该函数运行时,它都会运行一个循环,递归深度将给出堆栈。
import numpy as np
def generate_weights0( layers = 4,tgt = 100 ):
""" Generate list of lists with 'layers' items adding to tgt """
result = []
def one_layer( layers,tgt,cumul ):
""" layers: layers still to produce.
tgt: the tgt still left to be consumed.
cumul: a list of the combinations for the layers already processed.
"""
if layers == 1: # return results for the last layer
cumul.append( tgt )
result.append( cumul )
else:
# For each i call one_layer with revised parameters
for i in range( tgt + 1 ):
cumul_ = cumul.copy()
cumul_.append( i )
# Recursive call with updated parameters
one_layer( layers - 1,tgt - i,cumul_ )
one_layer( layers,[] ) # Execute the initialised function
return np.array( result )
以上假设min为零,返回结果。为了避免复杂性,有第二个函数调用上面的函数,将参数调整为最小值。然后将最小值添加到所有结果中。
def generate_weights( layers = 4,min_ = 0,tgt = 100 ):
tgt = tgt - ( layers * min_ )
return generate_weights0( layers,tgt ) + min_
我认为这将返回您的预期。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。