Это довольно просто сделать. С точки зрения двумерных задач данные, демонстрирующие положительную корреляцию, — это те точки данных, в которых явно наблюдается увеличение выходных данных при каждом увеличении независимого значения r
. Точно так же для отрицательной корреляции выход уменьшается при каждом увеличении независимого значения r
.
Следовательно, вы можете просто определить уравнение линии типа y = mx + b
, где m
и b
определяются априори. Когда у вас есть эти термины, вы просто добавляете любой шум, который хотите, поверх этой строки, чтобы создать свой «коррелированный» шум. Поэтому, учитывая m
и b
, вы должны решить первые два вопроса так:
Вопрос 1
Определите положительный наклон для m
... что-то вроде m = 2
.
rng(123); %// For reproducibility
m = 2; %// Set positive slope
b = 4;
r = (10-5).*rand(10,1) + 5; %// Produce 10 random points
x = (1 : 10).'; %// Define x values from 1 - 10
y = m*x + b + r; %// Generate output and plot
plot(x, y, 'b.', 'MarkerSize', 16);
Мы получили:
![введите здесь описание изображения](https://i.stack.imgur.com/IEoO4.png)
Вопрос 2
Определите отрицательный наклон для m
... что-то вроде m = -2
.
rng(123); %// For reproducibility
m = -2; %// Set positive slope
b = 4;
r = (10-5).*rand(10,1) + 5; %// Produce 10 random points
x = (1 : 10).'; %// Define x values from 1 - 10
y = m*x + b + r; %// Generate output and plot
plot(x, y, 'b.');
Мы получили:
![введите здесь описание изображения](https://i.stack.imgur.com/iTUJY.png)
Вопрос №3
Это на самом деле будет немного сложнее. Что вам нужно сделать, так это задать центр и радиус, вы просто генерируете набор 2D-координат, которые находятся внутри круга, а затем случайным образом проверяете, выполняется ли уравнение окружности:
(x - x0)^2 + (y - y0)^2 <= r^2
Если да, то держимся за точку. Будет проще центрировать генерацию случайных точек около -1 <= (x,y) <= 1
, затем мы проверяем, меньше ли радиус 1, чтобы выполнить нашу проверку. Как только мы найдем эти точки, мы масштабируем точки по радиусу, а затем перемещаем центр. Имейте в виду, что rand
производит только значения между [0,1]
. Таким образом, чтобы сгенерировать значения между [-1,1]
, мы умножаем на 2 и вычитаем на 1.
Что-то вроде:
rng(123);
pts = 2*rand(1000,2) - 1; %// Generate points between [-1,1]
dists = sum(pts.^2, 2); %// Find distances from the centre
pts(dists > 1, :) = []; %// Any values beyond radius of 1 filter
centre = [2 2]; %// Set centre and radius
radius = 5;
pts = radius*pts; %// Scale points by radius
pts = bsxfun(@plus, pts, centre); %// Move points over
plot(pts(:,1), pts(:,2), 'b.', 'MarkerSize', 16); %// Plot points and adjust viewing axis
axis([-10 10 -10 10])
Мы получили:
![введите здесь описание изображения](https://i.stack.imgur.com/dRk6u.png)
person
rayryeng
schedule
16.02.2015