3

私のコードは非常に単純ですが、3x2 と 2x1 の行列を乗算しようとすると、次のエラーが発生します (これは意味がありません)。

ValueError: operands could not be broadcast together with shapes (3,2) (2,1) 

このプログラムでは、最初に [-1,1] x [-1,1] の領域でランダムに 2 つの点を生成し、変数slopeとを使用して、これらの点で直線を定義しますy_intx次に、 {x_0, x_1, x_2} という形式のN 個のランダムな値を作成します。ここで、x_0 は常に 1 であり、x_1,x_2 は [-1,1] の範囲でランダムに生成された数値です。これらの N 値はx_matrix、コード内の を構成します。

y_matrix、各値 x_1、...、x_N の分類です。x_1 がslopeおよびで指定されたランダム ラインの右側にy_intある場合、y_1 の値は +1 になり、それ以外の場合は -1 になります。

x_matrixとが指定されたら、 (コード内の)y_matrixの疑似逆数に を掛けるだけです。これがエラーの出番です。私は機知に富んでいて、間違っている可能性のあるものは何も考えられません。x_matrixpinv_xy_matrix

どんな助けでも大歓迎です。コードは以下のとおりです。

from numpy import *
import random

N = 2

# Determine target function f(x)                                                                                
x_1 = [random.uniform(-1,1),random.uniform(-1,1)]
x_2 = [random.uniform(-1,1),random.uniform(-1,1)]
slope = (x_1[1] - x_2[1]) / (x_1[0] - x_2[0])
y_int = x_1[1] - (slope * x_1[0])

# Construct training data.                                                                                       
x_matrix = array([1, random.uniform(-1,1), random.uniform(-1,1)])
x_on_line = (x_matrix[1] / slope) - (y_int / slope)
if x_matrix[1] >= x_on_line:
    y_matrix = array([1])
else:
    y_matrix = array([-1])

for i in range(N-1):
    x_val = array([1, random.uniform(-1,1), random.uniform(-1,1)])
    x_matrix = vstack((x_matrix, x_val))
    x_on_line = (x_val[1] / slope) - (y_int / slope)
    if x_val[1] >= x_on_line:
    y_matrix = vstack((y_matrix, array([1])))
    else:
        y_matrix = vstack((y_matrix, array([-1])))

pinv_x = linalg.pinv(x_matrix)
print y_matrix
print pinv_x
w =  pinv_x*y_matrix
4

1 に答える 1

5

行列ではなく配列を使用しています。dot()配列から行列の乗算を取得するには、ではなく関数を使用する必要があります*このページを参照してください。データが配列内にある場合、*演算子は要素ごとの乗算であるため、形状は正確に一致する必要があります。

于 2012-04-13T16:56:48.243 に答える