Visualize softmax regression

Mình đang học về softmax regression trên link https://machinelearningcoban.com/2017/02/17/softmax/ tới đoạn visualize softmax regression thì không hiểu lắm mong mọi người giúp đỡ ạ. link code của tác giả https://github.com/tiepvupsu/tiepvupsu.github.io/blob/master/assets/13_softmax/Softmax%20Regression.ipynb
mình đọc thì thấy tác giả sử dụng hàm plt.contour để chiếu dữ liệu 3d thành 2d nhưng không tài nào hiểu nổi.

def pred(W, X):
    A = softmax_stable(W.T.dot(X))
    return np.argmax(A, axis = 0)
means = [[2, 2], [8, 3], [3, 6]]
cov = [[1, 0], [0, 1]]
N = 500
X0 = np.random.multivariate_normal(means[0], cov, N)
X1 = np.random.multivariate_normal(means[1], cov, N)
X2 = np.random.multivariate_normal(means[2], cov, N)
X = np.concatenate((X0, X1, X2), axis = 0).T # each column is a datapoint
X = np.concatenate((np.ones((1, 3*N)), X), axis = 0)
C = 3
original_label = np.asarray([0]*N + [1]*N + [2]*N).T
import matplotlib.pyplot as plt
def display(X, label):
    X0 = X[:, label == 0]
    X1 = X[:, label == 1]
    X2 = X[:, label == 2]
    plt.plot(X0[0, :], X0[1, :], 'b^', markersize = 4, alpha = .8)
    plt.plot(X1[0, :], X1[1, :], 'go', markersize = 4, alpha = .8)
    plt.plot(X2[0, :], X2[1, :], 'rs', markersize = 4, alpha = .8)
    plt.axis('off')
    plt.plot()
    plt.show()
W_init = np.random.randn(X.shape[0], C)
W = softmax_regression(X, original_label, W_init, eta)
print(W[-1])

[[ 7.95819763 -4.03893973 -4.21902437]
 [ 0.23743917  2.95280664  0.40718706]
 [-1.07291526 -1.42866515  1.56477536]]
xm = np.arange(-2, 11, 0.025)
xlen = len(xm)
ym = np.arange(-3, 10, 0.025)
ylen = len(ym)
xx, yy = np.meshgrid(xm, ym)
print(np.ones((1, xx.size)).shape)
xx1 = xx.ravel().reshape(1, xx.size)
yy1 = yy.ravel().reshape(1, yy.size)
XX = np.concatenate((np.ones((1, xx.size)), xx1, yy1), axis = 0)
print(XX.shape)
Z = pred(W[-1], XX)
Z = Z.reshape(xx.shape)
CS = plt.contourf(xx, yy, Z, 200, cmap='jet', alpha = .1)
plt.xlim(-2, 11)
plt.ylim(-3, 10)
plt.xticks(())
plt.yticks(())
display(X[1:, :], original_label)
plt.savefig('ex1.png', bbox_inches='tight', dpi = 300)
plt.show()

image

Đây la ảnh tác giả tạo ra ạ

tui cũng không hiểu bạn đang không hiểu cái gì ???

tôi muốn hỏi cách visualize softmax regression trong trường hợp trên có 3 nhóm sau khi tìm được hệ số tối ưu là W = (w1,w2,w3). không hiểu sao lại hiển thị được đường biên chia 3 cụm dữ liệu đó ạ. tôi có học về logistics regression rồi. việc tạo ra đường biên đó rất đơn giản cho tới khi gặp ham softmax regression thi không hiểu

Minh thấy thực sự đường biên tạo bởi softmax regression nó sẽ trông ntn

bạn hiểu như vậy, tại vì bạn đang hiểu nhầm hàm softmax là 1 hàm giống như ở trong linear regression. tức đưa mặt phẳng thì sẽ biến thành đường thẳng, và đưa không gian 3D sẽ biến thành mặt phẳng trong không gian đó. tuy nhiên, khi biến từ đường sang mặt phẳng, đơn giản là chúng ta đang nới rộng cái đương thẳng đó theo phương z. tức nếu xét theo sigmoid curve, thì ta sẽ có 1 hình thác nước

nhưng vì có 3 giá trị cần predict 1, 2 và phần còn lại
-> graph khi này sẽ chia ra 3 thác nước và sẽ ra 3 phần như plot bạn đưa ra

Full plot

https://www.wolframalpha.com/input?i=f(x%2Cy)%3D{{exp(-x)%2Cexp(-y)}}%2F(1+%2B+exp(-x)+%2B+exp(-y))


và nhìn hình expectation của bạn, mình thấy bạn cũng đang map sai trục toạ độ :3

ví dụ có plot 3D của softmax với 2 classes


nếu map theo trục x, ta sẽ có contour na ná như này

1 Like

em có vẽ đồ thị trong không gian 3 chiều link https://www.geogebra.org/calculator/ctth7qyx
. sau đó thử contour nó ra như hình.

image

Ảnh khi có thêm data

image

Tới đây em hiểu được cơ bả rồi, nhưng có điều là không hiểu đoạn code này

 def pred(W, X):
       A = softmax_stable(W.T.dot(X))
       return np.argmax(A, axis = 0)

Khi kết hợp với dòng này CS = plt.contourf(xx, yy, Z, 200, cmap='jet', alpha = .1) nó hoạt động rất tốt đẹp như trong ảnh
image

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?