我想创建一个数组,其值的范围是0.0到1.0,如下所示: weighting matrix
基本上,左边缘和上边缘应保持接近1.0,但在拐角处缓慢衰减至0.5。 底部和右侧边缘应保持接近0.0 中间区域应该大部分为0.5,并且值应该从1.0到0.0逐渐对角衰减。
这是我尝试过的方法,但是并不能完全满足我的需求。
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
y = np.zeros(len(x))
for i in range(len(x)):
y[i] = 1 / (1 + math.exp(-x[i]))
return y
sigmoid_ = sigmoid(np.linspace(20, 2.5, 30))
temp1 = np.repeat(sigmoid_.reshape((1,len(sigmoid_))), repeats=10, axis=0)
sigmoid_ = sigmoid(np.linspace(6, 3, 10))
temp2 = np.repeat(sigmoid_.reshape((len(sigmoid_),1)), repeats=30, axis=1)
alpha1 = temp1 + temp2
sigmoid_ = sigmoid(np.linspace(-2.5, -20, 30))
temp1 = np.repeat(sigmoid_.reshape((1,len(sigmoid_))), repeats=10, axis=0)
sigmoid_ = sigmoid(np.linspace(-3, -6, 10))
temp2 = np.repeat(sigmoid_.reshape((len(sigmoid_),1)), repeats=30, axis=1)
alpha2 = temp1 + temp2
alpha = alpha1 + alpha2
alpha = alpha - np.min(alpha)
alpha = alpha / np.max(alpha)
plt.matshow(alpha)
哪个给我这个:results
有人可以帮我吗?
答案 0 :(得分:0)
这是我能想到的最简单的功能:
tune_me = 101
x = np.linspace(0, 1, tune_me)
y = np.linspace(0, 1, tune_me)
xv, yv = np.meshgrid(x, y)
sig = 1/(1 + np.exp(tune_me - xv - yv))
plt.matshow(sig)
但是,如果您想要一些特定的东西,则可能应该先尝试弄清楚数学(也许在数学堆栈交换中),然后再尝试实现它。
答案 1 :(得分:0)
如果没有其他要求,我将对加权矩阵区域的所有部分使用相同的功能。经过适当的平移和缩放后,S型函数(在中心附近快速变化而在中心附近缓慢变化)的确合适。对于S形函数的参数,我将从该区域的某个角落选择taxicab distance。
import math
import numpy as np
import matplotlib.pyplot as plt
alpha = np.ndarray((10, 30))
ymax, xmax = alpha.shape[0]-1, alpha.shape[1]-1
for y in range(alpha.shape[0]):
for x in range(alpha.shape[1]):
M = x/xmax+y/ymax # Manhattan distance, range [0;2]
M -= 1 # make range [-1;1], so that inflection point is in the middle
M *= 3.0 # the higher this factor, the steeper the sigmoid curve at the flex
s = 1 / (1 + math.exp(-M)) # sigmoid function, range ]0;1[
alpha[y, x] = 1-s # decay from 1 to 0
plt.matshow(alpha)
plt.show()
# show the values close to 0.5
h = [(y, x) for y in range(alpha.shape[0])
for x in range(alpha.shape[1]) if .4 < alpha[y, x] and alpha[y, x] < .6]
hy, hx = zip(*h)
plt.plot(hx, hy, 'o')
plt.gca().invert_yaxis()
plt.show()