Получение ошибки: фигуры не выровнены, со статистическими моделями и простой двумерной линейной регрессией

import numpy as np
import statsmodels.api as sm


list21 = [-0.77, -0.625, -0.264, 0.888, 1.8, 2.411, 2.263, 2.23, 1.981, 2.708]
list23 = [-1.203, -1.264, -1.003, -0.388, -0.154, -0.129, -0.282, -0.017, -0.06, 0.275]

X1 = np.asarray(list21)
Y1 = np.asarray(list23)
    
x = X1.reshape(-1, 1)
y = Y1.reshape(-1, 1)

   
model = sm.OLS(x, y)
fit = model.fit()

y_pred = model.predict(x)

Ошибка читается как:

--> 161     y_pred = model.predict(x)

ValueError: shapes (10,1) and (10,1) not aligned: 1 (dim 1) != 499 (dim 0)

Последние полчаса бьюсь головой о стену, пожалуйста, помогите.

в сторону: statsmodels требует, чтобы зависимая или итоговая переменная была первой, то есть OLS(y, x)

Josef 13.12.2020 20:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
3 706
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы назначаете прогноз неправильной переменной. Использовать:

model = sm.OLS(x, y)
fit = model.fit()
y_pred = fit.predict(x)

Или используйте

model = sm.OLS(x, y).fit()
y_pred = model.predict(x)

В любом случае: назначьте прогноз переменной, которую вы использовали с fit()

РЕДАКТИРОВАТЬ

Чтобы ответить на ваш вопрос, почему линия проходит через ноль: вы не определяете перехват, который вы можете сделать с помощью sm.add_constant. Пожалуйста, обратитесь к этой документации: https://www.statsmodels.org/dev/examples/notebooks/generated/ols.html

Применительно к вашему коду вы получаете:

import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

list21 = [-0.77, -0.625, -0.264, 0.888, 1.8, 2.411, 2.263, 2.23, 1.981, 2.708]
list23 = [-1.203, -1.264, -1.003, -0.388, -0.154, -0.129, -0.282, -0.017, -0.06, 0.275]

x = np.asarray(list21)
y = np.asarray(list23)
X = sm.add_constant(x)
model = sm.OLS(y,X)
results = model.fit()
y_pred = results.predict(X)
plt.scatter(list21,list23)
plt.plot(x,y_pred)

Да, это было спасибо. Вы знаете, почему моя линия проходит только через 0 по оси Y? даже если я меняю списки, они всегда идут через ноль. Это действительно не то, что должно происходить. Моя другая линия регрессии этого не делает.

orion24 12.12.2020 23:37

Пожалуйста, проверьте мое редактирование. Я переработал ваш пример, чтобы вы могли увидеть, как получить правильную линию регрессии, используя ols. :)

Stefan 13.12.2020 00:02

Другие вопросы по теме