Для меня имеет смысл, что нужно сортировать plt.plot
, однако рассеянная диаграмма (plt.scatter
), нуждающаяся в сортировке, кажется странной. Я столкнулся с этой проблемой с этим скриптом. Сам сценарий не имеет значения и служит лишь минимальным рабочим примером. Важно то, что поведение scatter
, а именно plt.scatter(sorted(l2), Y)
даст отличный результат от plt.scatter(l2, Y)
. Почему это? Не имеет смысла для меня.Сортированный график рассеяния отличается от несортированного
import matplotlib.pyplot as plt
import numpy as np
from math import log, exp, isnan
from sys import argv
from random import randint
def generate_linear_regression_line(X, Y):
X_ = np.mean(X)
XX_ = np.mean(map(lambda x:x*x,X))
Y_ = np.mean(Y)
XY_ = map(lambda x,y:x*y,X,Y)
m = np.mean((X_ * Y_ - XY_)/(X_**2 - XX_))
b = Y_ - m * X_
print m
print b
return lambda x : m * x + b
max = int(argv[1])
l1 = [randint(1, max) for i in range(max)]
# l2 = range(0,max)
l2 = []
maxentry = 0
while len(l2) != max:
n = randint(max, 2*max)
if n not in l2:
if n > maxentry:
maxentry = n
l2.append(n)
assert(maxentry >= len(l1))
assert(len(l2) == len(l1))
regl = generate_linear_regression_line(l2, l1)
X = []
Y = []
for i in range(len(l2)):
X.append(i)
Y.append(regl(i))
print sum(l1)
print sum(Y)
assert(len(Y) == len(l1))
# assert(sum(Y) > sum(l1))
plt.scatter(l2, l1)
plt.plot(X, Y, c='red')
plt.scatter(sorted(l2), Y, c='green')
plt.xlabel('L2')
plt.ylabel('L1')
plt.show()