简单softmax回归

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

np.random.seed(0)
num = 100
x_1 = np.random.normal(-3, 1, size=(num))
x_2 = np.random.normal(-3, 1, size=(num))
y = np.zeros(num)
c_0 = np.array([x_1, x_2, y]) #0分类

x_1 = np.random.normal(3, 1, size=(num))
x_2 = np.random.normal(-3, 1, size=(num))
y = np.zeros(num)
c_1 = np.array([x_1, x_2, y]) #1分类

x_1 = np.random.normal(-3, 1, size=(num))
x_2 = np.random.normal(3, 1, size=(num))
y = np.zeros(num)*2
c_2 = np.array([x_1, x_2, y]) #2分类

x_1 = np.random.normal(3, 1, size=(num))
x_2 = np.random.normal(3, 1, size=(num))
y = np.zeros(num)*3
c_3 = np.array([x_1, x_2, y]) #3分类

c_0 = c_0.T
c_1 = c_1.T
c_2 = c_2.T
c_3 = c_3.T

all_data = np.concatenate((c_0, c_1, c_2, c_3))
np.random.shuffle(all_data)
train_data_x = all_data[:300, :2]
train_data_y = all_data[:300, -1].reshape(300, 1)
test_data_x = all_data[300:, :2]
test_data_y = all_data[300:, -1].reshape(100, 1)

#y = w1*x1+w2*x2+b
W = np.random.rand(4, 2)
b = np.random.rand(1, 4)

plt.scatter(c_0[:, 0], c_0[:, 1], marker='o')
plt.scatter(c_1[:, 0], c_1[:, 1], marker='.')
plt.scatter(c_2[:, 0], c_2[:, 1], marker='v')
plt.scatter(c_3[:, 0], c_3[:, 1], marker='s')
x = np.arange(-5, 5)
y0 = -(W[0, 0] * x + b[0, 0])/W[0, 1]
y1 = -(W[1, 0] * x + b[0, 1])/W[1, 1]
y2 = -(W[2, 0] * x + b[0, 2])/W[2, 1]
y3 = -(W[3, 0] * x + b[0, 3])/W[3, 1]
plt.plot(x, y0, 'b')
plt.plot(x, y1, 'y')
plt.plot(x, y2, 'g')
plt.plot(x, y3, 'r')
plt.show()

def softmax(z):
    exp = np.exp(z)
    sum_exp = np.sum(np.exp(z), axis=1, keepdims=True)
    return exp/sum_exp

def one_hot(temp):
    one_hot = np.zeros((len(temp), len(np.unique(temp))))
    one_hot[np.arange(len(temp)), temp.astype(np.int).T] = 1
    return one_hot

#计算y_hat
def compute_y_hat(W, X, b):
    return np.dot(X, W.T) + b

#计算交叉熵
def cross_entropy(y, y_hat):
    loss = -(1/len(y))*np.sum(y*np.log(y_hat))
    return loss


lr = 0.001
loss_list = []
for i in range(1000):
    #计算loss
    X = train_data_x
    y = one_hot(train_data_y)
    y_hat = softmax(compute_y_hat(W, X, b))
    loss = cross_entropy(y, y_hat)
    loss_list.append(loss)
    #计算梯度
    grad_w = (1/len(X))*np.dot(X.T, (y_hat - y))
    grad_b = (1/len(X))*np.sum(y_hat - y)
    #更新参数
    W = W - lr * grad_w.T
    b = b - lr * grad_b
    #输出
    if i % 100 == 1:
        print("i: %d, loss: %f" % (i, loss))

plt.plot(loss_list)
plt.show()

plt.scatter(c_0[:, 0], c_0[:, 1], marker='o')
plt.scatter(c_1[:, 0], c_1[:, 1], marker='.')
plt.scatter(c_2[:, 0], c_2[:, 1], marker='v')
plt.scatter(c_3[:, 0], c_3[:, 1], marker='s')
x = np.arange(-5, 5)
y0 = -(W[0, 0] * x + b[0, 0])/W[0, 1]
y1 = -(W[1, 0] * x + b[0, 1])/W[1, 1]
y2 = -(W[2, 0] * x + b[0, 2])/W[2, 1]
y3 = -(W[3, 0] * x + b[0, 3])/W[3, 1]
plt.plot(x, y0, 'b')
plt.plot(x, y1, 'y')
plt.plot(x, y2, 'g')
plt.plot(x, y3, 'r')
plt.show()

在这里插入图片描述

i: 1, loss: 9.400959
i: 101, loss: 8.592559
i: 201, loss: 7.921779
i: 301, loss: 7.383603
i: 401, loss: 6.964679
i: 501, loss: 6.646839
i: 601, loss: 6.410712
i: 701, loss: 6.238248
i: 801, loss: 6.113970
i: 901, loss: 6.025326

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: softmax回归和logistic回归都是常见的分类算法。 其中,logistic回归是一种二分类算法,用于将输入数据分为两个类别。它通过sigmoid函数将输入数据映射到和1之间的概率值,然后根据阈值将其分类为正类或负类。 而softmax回归是一种多分类算法,用于将输入数据分为多个类别。它通过softmax函数将输入数据映射到每个类别的概率值,然后将概率最大的类别作为分类结果。 两种算法都是基于概率模型的分类方法,但softmax回归适用于多分类问题,而logistic回归适用于二分类问题。 ### 回答2: softmax回归和logistic回归都是分类算法,它们都属于广义线性模型的范畴,但softmax回归是logistic回归的一种扩展。 Logistic回归是基于逻辑斯蒂函数的分类算法,该函数能够将输入的连续值通过sigmoid函数映射到0-1的概率值,因此logistic回归适用于二分类问题。由于sigmoid函数的取值范围是0-1,它可以被理解为是将输入“压缩”到了可接受的范围内,并且逻辑斯蒂函数求导简单。因此,logistic回归在机器学习中广泛应用于二分类问题。 而softmax回归是logistic回归的多类别版本,也称为多项式逻辑斯蒂回归。在softmax回归中,将输入的样本特征通过softmax函数进行变换得到0-1之间的概率值,这些概率值加和为1。因此,softmax回归适用于多分类问题。 softmax回归相对于logistic回归的优越之处在于,对于多分类问题,softmax回归可以更好地处理标签互斥的问题,可以将多个二分类问题转化为单个多分类问题。在神经网络中,softmax回归常常用于输出层的分类问题。 在实际应用中,softmax回归和logistic回归可以被当做常规分类算法中的基础理论。它们不仅仅被用于机器学习领域,还被广泛地用于自然语言处理、推荐系统、图像分类等领域。 ### 回答3: softmax回归和logistic回归都是用于分类问题的监督学习算法。两者基于的核心思想都是使用线性模型进行分类,然后通过激活函数将输出映射到概率空间,最终输出对类别的预测概率。下面将分别介绍两种方法。 1. Logistic回归 Logistic回归又叫逻辑回归,它是一种用于二分类问题的线性模型。在logistic回归中,使用sigmoid函数作为激活函数将线性模型的输出转换成一个0到1之间的概率值。sigmoid函数为: $$sigmoid(z)=\frac{1}{1+e^{-z}}$$ 其中,$z=w^Tx+b$,$w$和$b$分别为模型参数,$x$为输入。logistic回归的目标是最大化似然函数,即使得预测的概率与实际标签之间的差异最小。损失函数为: $$J(w,b)=\frac{1}{m}\sum_{i=1}^{m}[-y^{(i)}log(\hat{y}^{(i)})-(1-y^{(i)})log(1-\hat{y}^{(i)})]$$ 其中,$m$为数据集大小,$y^{(i)}$为实际的类别标签,$\hat{y}^{(i)}$为预测的类别概率。 2. Softmax回归 Softmax回归又叫多分类逻辑回归,用于多分类问题。softmax回归将线性模型的输出$z$映射到$K$个类别的概率,并且不同类别间的概率是互斥的。softmax函数为: $$softmax(z_i)=\frac{e^{z_i}}{\sum_{j=1}^{K}e^{z_j}}$$ 其中,$K$为类别数,$z_i=w_i^Tx+b_i$,$w_i$和$b_i$分别为第$i$类别的模型参数。softmax回归的目标是最大化似然函数,损失函数为: $$J(w_{1...K},b_{1...K})=-\frac{1}{m}\sum_{i=1}^{m}\sum_{j=1}^{K}1(y^{(i)}=j)log\frac{e^{w_j^Tx^{(i)}+b_j}}{\sum_{k=1}^{K}e^{w_k^Tx^{(i)}+b_k}}$$ 其中,$m$为数据集大小,$y^{(i)}$为样本$i$的类别标签。 总之,softmax回归和logistic回归都是监督学习算法,利用线性模型加激活函数将输入映射到概率空间中进行分类预测。softmax回归适用于多分类问题,而logistic回归适用于二分类问题。在实际应用中,两种方法都是常见的分类算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值