Как создать массив со значениями в заданной c форме? - PullRequest
0 голосов
/ 14 февраля 2020

Я хотел бы создать массив со значениями в диапазоне от 0,0 до 1,0, как показано здесь: весовая матрица

В основном, левый и верхний края должны оставаться близкими к 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)

Что дает мне это: результаты

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

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

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

Иллюстрация значений в центральной области, близкой к 0,5, например, в] 0,4; 0,6 [:

0 голосов
/ 14 февраля 2020

Это самая простая функция, которую я могу придумать:

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)

Но если вы хотите что-то конкретное c, вам, вероятно, следует выяснить свою математику (возможно, при обмене математическим стеком), прежде чем пытаться реализовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...