Как построить линию на графике рассеяния на основе тета от регрессии в Python? - PullRequest
0 голосов
/ 04 января 2019

Я вычисляю тэту для своего ИИ следующим образом:

theta = opt.fmin_cg(cost, initial_theta, gradient, (newX, y))

, которая прекрасно работает и дает мне такой вывод:

Optimization terminated successfully.
         Current function value: 0.684355
         Iterations: 6
         Function evaluations: 15
         Gradient evaluations: 15

Когда я печатаю тета, я получаю это:

[ 0.         -0.28132729  0.158859  ]

Теперь я хочу построить это на графике рассеяния в виде линии, мой ожидаемый результат выглядит следующим образом:

Expected Output

Но когда я пытаюсь выполнить это на моем графике с помощью алгоритма:

weights * features = weight0 + weight1 * feature1 + weight2 * feature2

Примерно так:

x_axis = np.array([min(newX[:, 1]), max(newX[:, 1])])
y_axis = x_axis * theta[1:]
ax.plot(x_axis, y_axis, linewidth=2)
plt.show()

Вывод выглядит так:

Actual Output

Что должно быть y_axis = x_axis * theta[1:], чтобы соответствовать алгоритму?

Обновление:

newX вытекает из моего фрейма тренировочных данных и создается следующим образом:

newX = np.zeros(shape=(x.shape[0], x.shape[1] + 1))
newX[:, 1:] = x.values

Теперь это выглядит следующим образом, концепция 0 - это свободный вес:

[[0. 8. 2.]
 [0. 0. 0.]
 [0. 0. 0.]
 ...
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 1. 1.]]

1 Ответ

0 голосов
/ 04 января 2019

IIUC, вы пытаетесь построить границу вашего решения для логистической регрессии.Это не просто проблема ay = mx + b, ну, но сначала вам нужно определить, где находится граница вашего решения, как правило, с вероятностью 0,5.Я предполагаю, что модель, с которой вы работаете, выглядит как h(x) = g(theta_0*x_0 + theta_1*x_1 + theta_2*x_2), где g(x) = 1 / (1 + e^-x) и x_1 и x_2 - это ваши черты, которые вы чертите, т.е. ваши оси y и x (я не знаю, что это yи который х, так как я не знаю ваших данных).Таким образом, для вероятности 0,5 вы хотите решить для h(x) = 0.5, то есть theta_0*x_0 + theta_1*x_1 + theta_2*x_2 = 0

Итак, вы хотите построить линию 0 = theta_0*x_0 + theta_1*x_1 + theta_2*x_2.Скажем так, у вас x_1 на вашей оси x и x_2 на вашей оси y.(x_0 это просто 1, что соответствует theta_0, вашему перехвату.)

Так что вам нужно выбрать (несколько произвольно) x_1 значений, которые дадут вам хорошую иллюстрациюграницаМин / макс работ вашего набора данных, которые вы сделали.Затем решите для x_2 по приведенной выше формуле.Вы можете определить функцию здесь: lambda x_1: (theta[0] + theta[1] * x_1) / theta[2].Я предполагаю, что ваша theta переменная соответствует [intercept, coeff for x_1, coeff for x_2].Таким образом, вы получите что-то вроде:

theta = [0., -0.28132729, 0.158859]
x = np.array([0, 10])
f = lambda x_1: (theta[0] + theta[1] * x_1) / theta[2]
y = f(x)
plt.plot(x, y)
...