Построить массив строк NumPy и Matplotlib - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь построить модель логистической регрессии, используя Matplotlib и Numpy
Вот мой код,

X = [[181, 80, 44], [177, 70, 43], [160, 60, 38], [154, 54, 37], [166, 65, 40]]

Y = ['male', 'male', 'female', 'female', 'male']

Я пробовал это, но не работает, как ожидалось.

Y_label = []
for x in range(0,len(Y)):
    if Y[x] == 'male': 
        Y_label.append('1')
    else : Y_label.append('0')


fit = np.polyfit(X,Y_label,1)
fit_fn = np.poly1d(fit) 
# fit_fn is now a function which takes in x and returns an estimate for y

plt.plot(X,Y_label, 'yo', X, fit_fn(X), '--k')
plt.xlim(0, 5)
plt.ylim(0, 12)
plt.show()

Во время выполнения этого кода появляется ошибка

Traceback (most recent call last):
  File "/home/logistic_regression.py", line 27, in <module>
    fit = np.polyfit(X,Y_label,1)
  File "/usr/lib/python2.7/dist-packages/numpy/lib/polynomial.py", line 543, in polyfit
    y = NX.asarray(y) + 0.0
TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'float'

Помогите мне решить эту проблему.
Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Я изменил вашу функцию ployfit (поскольку она не может работать для> 1D данных) на логистическую регрессию из sklearn.мы должны пойти на 3D-график, так как X трехмерный.Я дал зеленый цвет, если наш прогноз верен, и красный в противном случае.

Также я бы рекомендовал использовать кодировщик этикеток из sklearn Y_label.

import numpy as np
X = np.array([[181, 80, 44], [177, 70, 43], [160, 60, 38], [154, 54, 37], [166, 65, 40]])

Y = ['male', 'male', 'female', 'female', 'male']

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = plt.axes(projection='3d')

Y_label = []
for x in range(0,len(Y)):
    if Y[x] == 'male': 
        Y_label.append(1)
    else : Y_label.append(0)

from sklearn.linear_model import LogisticRegression
reg = LogisticRegression().fit(X, Y_label)

crt_pred = Y_label ==reg.predict(X)
ax.scatter3D(X[crt_pred,0],X[crt_pred,1],X[crt_pred,2],s=50,c='g')
ax.scatter3D(X[~crt_pred,0],X[~crt_pred,1],X[~crt_pred,2],s=50,c='r')

plt.show()

enter image description here

Для большего понимания пройдите по этой ссылке

0 голосов
/ 14 декабря 2018

Вместо

Y = ['male', 'male', 'female', 'female', 'male']

Y_label = []
for x in range(0,len(Y)):
    if Y[x] == 'male': 
        Y_label.append('1')
    else : Y_label.append('0')

(что неверно, потому что вы должны иметь числовые данные, а не строки, как цели), вы можете сделать что-то вроде этого:

Y_label = (np.asarray(Y) == 'male').astype(int)

Это будетразрешите отображаемую ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...