numpy 如何生成随机凸分段线性函数

x6492ojm  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(118)

我想生成一个玩具示例来说明python中的凸分段线性函数,但我无法找到最佳方法。我想做的是指出行数,然后随机生成函数。
凸分段线性函数定义为:

例如,如果我想要有四条直线,那么我想生成如下所示的东西。

因为有四条线。我需要生成四个递增的随机整数来确定x轴上的间隔。

import random 
import numpy as np
random.seed(1)

x_points = np.array(random.sample(range(1, 20), 4))
x_points.sort()
x_points = np.append(0, x_points)

x_points
[0 3 4 5 9]

我现在可以使用前两个点,创建一个随机线性函数,但我不知道如何从那里继续保持凸性。注意,如果函数图形上任何两点之间的线段不位于两点之间的图形之下,则函数被称为凸函数。

xienkqul

xienkqul1#

斜率从0开始,通过范围[0,1)中的随机值单调增加。第一个y值也是零,请参见注解。

import numpy as np
np.random.seed(0)

x_points = np.random.randint(low=1, high=20, size=4)
x_points.sort()
x_points = np.append(0, x_points)  # the first 0 point is 0

slopes = np.add.accumulate(np.random.random(size=3))
slopes = np.append(0,slopes)  # the first slope is 0

y_incr = np.ediff1d(x_points)*slopes
y_points = np.add.accumulate(y_incr)
y_points = np.append(0,y_points)  # the first y values is 0

可能的输出如下所示:

print(x_points)
print(y_points)
# [ 0  1  4 13 16]
# [ 0.          0.          2.57383685 17.92061306 24.90689622]

要打印此图:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(x_points,y_points, '-o', label="convex piecewise-linear function")
ax.legend()
fig.patch.set_facecolor('white')
plt.show()
fkvaft9z

fkvaft9z2#

确保梯度(=dx/dy)正在增加。伪代码:

s = 1;
x = 0;
y = 0;
n = 4;
while(--n>0)
{
  //increase x randomly
  dx = rand(3);
  dy = dx * s;
  x += dx;
  y += dy; 
  //increase gradient randomly
  s += rand(3);
  print x + "/" +y;
}

相关问题