ValueError: не удалось передать входной массив из shape (1,3) в shape (3,1) - PullRequest
0 голосов
/ 20 сентября 2019

Я работаю над проблемой линейного регрессионного кодирования, и я получаю эту ошибку, пытаясь закодировать часть матрицы функций.Не могли бы вы помочь мне исправить это?

Traceback (последний вызов был последним): файл "C: \ Users \ visha \ AppData \ Local \ Continuum \ anaconda3 \ lib \ site-packages \ nose \"case.py ", строка 197, в файле runTest self.test (* self.arg), файл" C: \ Users \ visha \ machinelearning \ test.py ", строка 22, в файле test_compute_Phi Phi = compute_Phi (x, 2)"C: \ Users \ visha \ machinelearning \ linear_regression.py ", строка 30, в compute_Phi Phi [:, i] = np.power (x, i) .reshape (x.shape [0],) ValueError: не удалось передатьвходной массив из формы (1,3) в форму (3,1)

[код]

def compute_Phi(x,p):
    x = np.asmatrix(x)
    Phi = np.zeros(shape = (x.shape[0],p))
    for i in range(0,p):
        Phi[:,i] = np.power(x,i).reshape(x.shape[0],)
        Phi = np.asmatrix(Phi)
return Phi 

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Ваш x, без np.mat:

In [225]: x = np.array([1,2,3])[:,None]                                                
In [226]: x                                                                            
Out[226]: 
array([[1],
       [2],
       [3]])
In [227]: p = 2                                                                        
In [228]: Phi = np.zeros((3,2))                                                        
In [229]: Phi[:,0] = np.power(x,0)                                                     
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-229-f8ff29de133c> in <module>
----> 1 Phi[:,0] = np.power(x,0)

ValueError: could not broadcast input array from shape (3,1) into shape (3)

Почему?x имеет форму (3,1) (как определено).Но Phi[:,0] имеет форму (3,).По правилам трансляции (3,1) нельзя поместить в (3,) пространство.А (1,3) мог.А (3,) мог.

Давайте сделаем x (3,):

In [230]: x = np.array([1,2,3])                                                        
In [231]: Phi[:,0] = np.power(x,0)                                                     
In [232]: Phi[:,1] = np.power(x,1)                                                     
In [233]: Phi                                                                          
Out[233]: 
array([[1., 1.],
       [1., 2.],
       [1., 3.]])

Теперь мы можем назначить столбцы.

Теперь форма (3,1) x можетработать с несколькими степенями одновременно:

In [234]: np.power(x[:,None],[0,1,2,3])                                                
Out[234]: 
array([[ 1,  1,  1,  1],
       [ 1,  2,  4,  8],
       [ 1,  3,  9, 27]])

Здесь (3,1) x передает с (4,) p для получения (3,4) результата.

Шаги вещания: (3,1), (4,) => (3,1), (1,4) => (3,4), (3,4)

ключи - размеры 1 могут быть добавлены автоматически в ведущей позиции.Размеры 1 масштабируются так, чтобы соответствовать другим.

0 голосов
/ 20 сентября 2019

На самом деле ошибка в том, что в 1-й итерации цикла for вы, Phi, равняетесь np.array, а во второй итерации он заменяется на матрицу.Это работает, если вы переместили линию Phi = np.asmatrix(Phi) за пределы цикла

def compute_Phi(x,p):
    x = np.asmatrix(x)
    Phi = np.zeros(shape = (x.shape[0],p))
    Phi = np.asmatrix(Phi)
    for i in range(0,p):
        print(Phi[:,i])
        print(np.power(x,i))
        Phi[:,i] = np.power(x,i)

    return Phi 

compute_Phi(np.mat('1.;2.;3'), 2)

Выход

matrix([[1., 1.],
        [1., 2.],
        [1., 3.]])
...