Различия между Numpy и TensorFlow - PullRequest
2 голосов
/ 07 мая 2019

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

trX = np.linspace(0, 1, 100) 
trY= trX + np.random.normal(0,1,100)
xArr = []
yArr = []
for i in range(len(trX)):
    xArr.append([1.0,float(trX[i])])
    yArr.append(float(trY[i]))
xMat = mat(xArr); 
yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye((m)))
k = 0.01
yHat = zeros(m)

for i in range(m):
    for j in range(m):
        diffMat = xArr[i] - xMat[j,:]
        weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
    xTx = xMat.T * (weights * xMat)
    if linalg.det(xTx) == 0.0:
        print("This matrix is singular, cannot do inverse")
    ws = xTx.I * (xMat.T * (weights * yMat))
    yHat[i] = xArr[i]*ws


plt.scatter(trX, trY) 

plt.plot(trX, yHat, 'r')
plt.show() 

, если запустить скрипт выше, результат: enter image description here

Inвторой сценарий, я использовал TensorFlow для решения матричных задач.Этот скрипт выглядит следующим образом:

trX = np.linspace(0, 1, 100) 
trY= trX + np.random.normal(0,1,100)

sess = tf.Session()
xArr = []
yArr = []
for i in range(len(trX)):
    xArr.append([1.0,float(trX[i])])
    yArr.append(float(trY[i]))

xMat = mat(xArr); 
yMat = mat(yArr).T

A_tensor = tf.constant(xMat)
b_tensor = tf.constant(yMat)

m = shape(xMat)[0]
weights = mat(eye((m)))
k = 0.01
yHat = zeros(m)
for i in range(m):
    for j in range(m):
        diffMat = xMat[i]- xMat[j,:]
        weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
    weights_tensor = tf.constant(weights)
    # Matrix inverse solution
    wA = tf.matmul(weights_tensor, A_tensor)
    tA_A = tf.matmul(tf.transpose(A_tensor), wA)
    tA_A_inv = tf.matrix_inverse(tA_A)
    wb = tf.matmul(weights_tensor, b_tensor)
    tA_wb = tf.matmul(tf.transpose(A_tensor), wb)
    solution = tf.matmul(tA_A_inv, tA_wb)
    sol_val = sess.run(solution)
    yHat[i] =sol_val[0][0]*xArr[i][1] + sol_val[1][0] 

plt.scatter(trX, trY) 

plt.plot(trX, yHat, 'r')
plt.show() 

Если его запустить:

enter image description here

В чем разница между двумя результатами?Или, может быть, у меня есть неправильные вещи в моих сценариях?Пожалуйста, помогите мне.

...