机器学习 逻辑回归(2)softmax回归多类别分类-鸢尾花案例

news2024/11/19 0:25:45

机器学习 逻辑回归之softmax回归多类别分类-鸢尾花案例

  • 一、前言
  • 二、假设函数
  • 三、One-Hot 独热编码
  • 四、代价函数
  • 五、梯度下降
  • 六、原生代码实现
    • 6.1 加载并查看数据
    • 6.2 添加前置与数据分割
    • 6.3 迭代训练
    • 6.4 验证数据
  • 七、sklearn代码实现
  • 八、参考资料

PS:softmax回归损失函数梯度下降,求导部分没使用指示函数和向量,直接针对单变量进行推导。网上其他资料都比较抽象,找了很久没找到容易理解的,硬刚了几天终于整出来了。

一、前言

前面一篇文章《机器学习 逻辑回归(1)二分类》主要用于解决是与否的问题,有两种可能结果。

假设结果有多种可能,比如说,识别手写数字有0~9十种可能,怎么处理呢?

二分类与多分类的区别:
二分类与多分类的区别

接下来让我们开始逻辑回归多类别分类的学习。

有一种方法,可以把N种类别取出一种,剩下的类别统一归为一类,当成二分类问题;然后换成另一类,剩下的归为一类,如此遍历,将多类别分类转成很多个二分类问题,这种方法叫一对余,在此只做简单介绍,我们不用这种方法。

我们使用softmax方法,也叫softmax回归

二、假设函数

在二分类中,得到的是一个类似于概率的预测值。试想一下,如果得到的是每种类别的概率,那我们只需要取最大概率的类别就行了。

x = [ x 0 ( 1 ) x 0 ( 2 ) . . . x 0 ( m ) x 1 ( 1 ) x 1 ( 2 ) . . . x 1 ( m ) x 2 ( 1 ) x 2 ( 2 ) . . . x 2 ( m ) ⋮ ⋮ . . . ⋮ x n ( 1 ) x n ( 2 ) . . . x n ( m ) ] x=\begin{bmatrix} x_0^{(1)} & x_0^{(2)} & ...&x_0^{(m)} \\ x_1^{(1)} & x_1^{(2)} & ...&x_1^{(m)} \\ x_2^{(1)} & x_2^{(2)} &...&x_2^{(m)} \\ \vdots & \vdots & ... & \vdots\\ x_n^{(1)} & x_n^{(2)} & ...&x_n^{(m)} \end{bmatrix} x= x0(1)x1(1)x2(1)xn(1)x0(2)x1(2)x2(2)xn(2)...............x0(m)x1(m)x2(m)xn(m)

在此我们对 w w w进行扩展,假设有k个类别,它也变成了一个k行n列的矩阵:
w = [ w 0 ( 1 ) w 1 ( 1 ) w 2 ( 1 ) . . . w n ( 1 ) w 0 ( 2 ) w 1 ( 2 ) w 2 ( 2 ) . . . w n ( 2 ) . . . . . . . . . . . . . . . w 0 ( k ) w 1 ( k ) w 2 ( k ) . . . w n ( k ) ] w=\begin{bmatrix} w_0^{(1)} & w_1^{(1)} & w_2^{(1)} & ...&w_n^{(1)} \\ w_0^{(2)} & w_1^{(2)} & w_2^{(2)} & ...&w_n^{(2)} \\ ... & ... & ... & ...&... \\ w_0^{(k)} & w_1^{(k)} & w_2^{(k)} & ...&w_n^{(k)} \end{bmatrix} w= w0(1)w0(2)...w0(k)w1(1)w1(2)...w1(k)w2(1)w2(2)...w2(k)............wn(1)wn(2)...wn(k)

i i i个实例的预测结果为:

h ( 𝑥 ( i ) ) = w x ( i ) = [ w ( 1 ) x ( i ) w ( 2 ) x ( i ) ⋮ w ( k ) x ( i ) ] ℎ(𝑥^{(i)}) = wx^{(i)}=\begin{bmatrix} w^{(1)}x^{(i)} \\ w^{(2)}x^{(i)} \\ \vdots \\ w^{(k)}x^{(i)} \end{bmatrix} h(x(i))=wx(i)= w(1)x(i)w(2)x(i)w(k)x(i)

这是个k行1列的矩阵,对应k个类别的预测值。

参考《softmax函数及其代码实现》,将k个预测值代入softmax函数,形成总和为1的概率分布。假设函数就成了
h ( x ( i ) ) = s o f t m a x ( w x ( i ) ) \begin{aligned} h(x^{(i)})=softmax(wx^{(i)}) \end{aligned} h(x(i))=softmax(wx(i))

def softmax(x):
    ex=np.exp(x)
    return ex/ex.sum()

先将矩阵里的每个值通过 f ( x ) = e x f(x)=e^x f(x)=ex函数转化成非负数
[ e w ( 1 ) x ( i ) e w ( 2 ) x ( i ) ⋮ e w ( k ) x ( i ) ] \begin{bmatrix} e^{w^{(1)}x^{(i)}} \\ e^{w^{(2)}x^{(i)}} \\ \vdots \\ e^{w^{(k)}x^{(i)}} \end{bmatrix} ew(1)x(i)ew(2)x(i)ew(k)x(i)

再将其转成概率分布
[ e w ( 1 ) x ( i ) ∑ j = 1 k e w ( j ) x ( i ) e w ( 2 ) x ( i ) ∑ j = 1 k e w ( j ) x ( i ) ⋮ e w ( k ) x ( i ) ∑ j = 1 k e w ( j ) x ( i ) ] \begin{bmatrix} \frac{e^{w^{(1)}x^{(i)}}}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} \\ \frac{e^{w^{(2)}x^{(i)}}}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} \\ \vdots \\ \frac{e^{w^{(k)}x^{(i)}}}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} \end{bmatrix} j=1kew(j)x(i)ew(1)x(i)j=1kew(j)x(i)ew(2)x(i)j=1kew(j)x(i)ew(k)x(i)

这时候比较每个值,取最大值的下标则作为预测类别。

h ( x ( i ) ) j h(x^{(i)})_j h(x(i))j指的是第 j j j个值,如 h ( x ( i ) ) 2 = e w ( 2 ) x ( i ) ∑ j = 1 k e w ( j ) x ( i ) h(x^{(i)})_2=\frac{e^{w^{(2)}x^{(i)}}}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} h(x(i))2=j=1kew(j)x(i)ew(2)x(i)

三、One-Hot 独热编码

上面是One-Hot独热编码呢?举个栗子就一目了然。
假设类别有[鸡,鸭,狗] 3种动物:

编码
100
010
001

实例 y = [ 3 , 1 , 2 , 3 , …   ] y=[3,1,2,3,\dots] y=[3,1,2,3,],即 [ 狗,鸡,鸭,狗,… ],用独热编码矩阵表示为:
Y = [ 0 0 1 1 0 0 0 1 0 0 0 1 ⋮ ⋮ ⋮ ] Y=\begin{bmatrix} 0 & 0 & 1\\ 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \vdots & \vdots & \vdots\\ \end{bmatrix} Y= 010000101001

Y y ( i ) ( i ) = 1 Y^{(i)}_{y^{(i)}}=1 Yy(i)(i)=1

如当 i = 3 i=3 i=3 时, Y 2 ( 3 ) = 1 Y^{(3)}_2=1 Y2(3)=1

这样用假设函数求出各种类别的概率后,就能结合独热编码矩阵,计算出误差代价。

四、代价函数

在这里引入了交叉熵公式,softmax回归的代价函数是

L = − ∑ j = 1 k Y j ( i ) ln ⁡ ( h ( x ( i ) ) j ) L=-\sum_{j=1}^kY^{(i)}_j\ln(h(x^{(i)})_j) L=j=1kYj(i)ln(h(x(i))j)(一个实例样本)

由于经过softmax计算, h ( x ( i ) ) j h(x^{(i)})_j h(x(i))j的取值范围为 ( 0 , 1 ) (0,1) (0,1),L的函数图像为:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0.0001, 1, 0.0001) #起点,终点,间距
y = -np.log(x)
plt.plot(x, y)
plt.show()

在这里插入图片描述
由此可见,当 Y j ( i ) = 1 Y^{(i)}_j=1 Yj(i)=1时,预测值 h ( x ( i ) ) j h(x^{(i)})_j h(x(i))j越接近1,误差损失就越小。

那么总的代价函数则为
J = 1 m ∑ i = 1 m L = − 1 m ∑ i = 1 m ∑ j = 1 k Y j ( i ) ln ⁡ ( h ( x ( i ) ) j ) J=\frac1m\sum_{i=1}^mL=-\frac1m\sum_{i=1}^m\sum_{j=1}^kY^{(i)}_j\ln(h(x^{(i)})_j) J=m1i=1mL=m1i=1mj=1kYj(i)ln(h(x(i))j)

五、梯度下降

前面文章《逻辑回归(1)二分类》中已经说明:
在这里插入图片描述

在此处,由于 w w w是一个k行n列的矩阵, w ( c ) w^{(c)} w(c)对应对的就是上面的 w w w,那么就有:

∂ ∂ w n ( c ) w ( c ) x ( i ) = x n ( i ) \frac{∂}{∂w^{(c)}_n}w^{(c)}x^{(i)}=x^{(i)}_n wn(c)w(c)x(i)=xn(i)

下面用到的公式有:
ln ⁡ M N = ln ⁡ M − ln ⁡ N \ln \frac MN=\ln M-\ln N lnNM=lnMlnN
ln ⁡ e x = x \ln e^x=x lnex=x
( ln ⁡ x ) ′ = 1 x (\ln x)'=\frac1x (lnx)=x1
( e x ) ′ = e x (e^x)'=e^x (ex)=ex

∂ J ∂ w n ( c ) = − 1 m ∂ J ∂ w n ( c ) ∑ i = 1 m ∑ j = 1 k Y j ( i ) ln ⁡ ( h ( x ( i ) ) j ) = − 1 m ∂ J ∂ w n ( c ) ∑ i = 1 m ∑ j = 1 k Y j ( i ) ln ⁡ ( e w ( j ) x ( i ) ∑ j = 1 k e w ( j ) x ( i ) ) = − 1 m ∂ J ∂ w n ( c ) ∑ i = 1 m ∑ j = 1 k Y j ( i ) ( w ( j ) x ( i ) − ln ⁡ ∑ j = 1 k e w ( j ) x ( i ) ) = − 1 m ∂ J ∂ w n ( c ) ∑ i = 1 m ( ∑ j = 1 k Y j ( i ) w ( j ) x ( i ) − ∑ j = 1 k Y j ( i ) ln ⁡ ∑ j = 1 k e w ( j ) x ( i ) ) = − 1 m ∂ J ∂ w n ( c ) ∑ i = 1 m ( Y 1 ( i ) w ( 1 ) x ( i ) + Y 2 ( i ) w ( 2 ) x ( i ) + ⋯ + Y c ( i ) w ( c ) x ( i ) + ⋯ + Y k ( i ) w ( k ) x ( i ) − Y 1 ( i ) ln ⁡ ∑ j = 1 k e w ( j ) x ( i ) + Y 2 ( i ) ln ⁡ ∑ j = 1 k e w ( j ) x ( i ) + ⋯ + Y k ( i ) ln ⁡ ∑ j = 1 k e w ( j ) x ( i ) ) = − 1 m ∑ i = 1 m ( Y c ( i ) x n ( i ) − Y 1 ( i ) 1 ∑ j = 1 k e w ( j ) x ( i ) e w ( c ) x ( i ) x n ( i ) − Y 2 ( i ) 1 ∑ j = 1 k e w ( j ) x ( i ) e w ( c ) x ( i ) x n ( i ) − ⋯ − Y k ( i ) 1 ∑ j = 1 k e w ( j ) x ( i ) e w ( c ) x ( i ) x n ( i ) ) = − 1 m ∑ i = 1 m ( Y c ( i ) x n ( i ) − e w ( c ) x ( i ) ∑ j = 1 k e w ( j ) x ( i ) x n ( i ) ( Y 1 ( i ) + Y 2 ( i ) + ⋯ + Y k ( i ) ) ) = − 1 m ∑ i = 1 m ( Y c ( i ) x n ( i ) − e w ( c ) x ( i ) ∑ j = 1 k e w ( j ) x ( i ) x n ( i ) ) = − 1 m ∑ i = 1 m x n ( i ) ( Y c ( i ) − e w ( c ) x ( i ) ∑ j = 1 k e w ( j ) x ( i ) ) \begin{aligned} \frac{∂J}{∂w^{(c)}_n} &=-\frac1m\frac{∂J}{∂w^{(c)}_n}\sum_{i=1}^m\sum_{j=1}^kY^{(i)}_j\ln(h(x^{(i)})_j)\\ &=-\frac1m\frac{∂J}{∂w^{(c)}_n}\sum_{i=1}^m\sum_{j=1}^kY^{(i)}_j\ln(\frac{e^{w^{(j)}x^{(i)}}}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}})\\ &=-\frac1m\frac{∂J}{∂w^{(c)}_n}\sum_{i=1}^m\sum_{j=1}^kY^{(i)}_j(w^{(j)}x^{(i)}-\ln\sum_{j=1}^ke^{w^{(j)}x^{(i)}})\\ &=-\frac1m\frac{∂J}{∂w^{(c)}_n}\sum_{i=1}^m\Bigg(\sum_{j=1}^kY^{(i)}_jw^{(j)}x^{(i)}-\sum_{j=1}^kY^{(i)}_j\ln\sum_{j=1}^ke^{w^{(j)}x^{(i)}}\Bigg)\\ &=-\frac1m\frac{∂J}{∂w^{(c)}_n}\sum_{i=1}^m\Bigg(Y^{(i)}_1w^{(1)}x^{(i)}+Y^{(i)}_2w^{(2)}x^{(i)}+\dots+Y^{(i)}_cw^{(c)}x^{(i)}+\dots+Y^{(i)}_kw^{(k)}x^{(i)}-Y^{(i)}_1\ln\sum_{j=1}^ke^{w^{(j)}x^{(i)}}+Y^{(i)}_2\ln\sum_{j=1}^ke^{w^{(j)}x^{(i)}}+\dots+Y^{(i)}_k\ln\sum_{j=1}^ke^{w^{(j)}x^{(i)}}\Bigg)\\ &=-\frac1m\sum_{i=1}^m\Bigg(Y^{(i)}_cx^{(i)}_n-Y^{(i)}_1\frac{1}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} e^{w^{(c)}x^{(i)}}x^{(i)}_n-Y^{(i)}_2\frac{1}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} e^{w^{(c)}x^{(i)}}x^{(i)}_n-\dots-Y^{(i)}_k\frac{1}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} e^{w^{(c)}x^{(i)}}x^{(i)}_n\Bigg)\\ &=-\frac1m\sum_{i=1}^m\Bigg(Y^{(i)}_cx^{(i)}_n-\frac{e^{w^{(c)}x^{(i)}}}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} x^{(i)}_n(Y^{(i)}_1+Y^{(i)}_2+\dots+Y^{(i)}_k)\Bigg)\\ &=-\frac1m\sum_{i=1}^m\Bigg(Y^{(i)}_cx^{(i)}_n-\frac{e^{w^{(c)}x^{(i)}}}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} x^{(i)}_n\Bigg)\\ &=-\frac1m\sum_{i=1}^mx^{(i)}_n(Y^{(i)}_c-\frac{e^{w^{(c)}x^{(i)}}}{\sum_{j=1}^ke^{w^{(j)}x^{(i)}}} )\\ \end{aligned} wn(c)J=m1wn(c)Ji=1mj=1kYj(i)ln(h(x(i))j)=m1wn(c)Ji=1mj=1kYj(i)ln(j=1kew(j)x(i)ew(j)x(i))=m1wn(c)Ji=1mj=1kYj(i)(w(j)x(i)lnj=1kew(j)x(i))=m1wn(c)Ji=1m(j=1kYj(i)w(j)x(i)j=1kYj(i)lnj=1kew(j)x(i))=m1wn(c)Ji=1m(Y1(i)w(1)x(i)+Y2(i)w(2)x(i)++Yc(i)w(c)x(i)++Yk(i)w(k)x(i)Y1(i)lnj=1kew(j)x(i)+Y2(i)lnj=1kew(j)x(i)++Yk(i)lnj=1kew(j)x(i))=m1i=1m(Yc(i)xn(i)Y1(i)j=1kew(j)x(i)1ew(c)x(i)xn(i)Y2(i)j=1kew(j)x(i)1ew(c)x(i)xn(i)Yk(i)j=1kew(j)x(i)1ew(c)x(i)xn(i))=m1i=1m(Yc(i)xn(i)j=1kew(j)x(i)ew(c)x(i)xn(i)(Y1(i)+Y2(i)++Yk(i)))=m1i=1m(Yc(i)xn(i)j=1kew(j)x(i)ew(c)x(i)xn(i))=m1i=1mxn(i)(Yc(i)j=1kew(j)x(i)ew(c)x(i))

六、原生代码实现

这次我们使用鸢尾花数据集

6.1 加载并查看数据

from sklearn import datasets  # 导入库
dataset = datasets.load_iris()  # 导入鸢尾花数据
print(dataset.data.shape,dataset.target.shape)  # (150, 4) (150,)
print(dataset.feature_names)  # [花萼长,花萼宽,花瓣长,花瓣宽]
print(dataset.target_names)
# print(iris.DESCR) #查看数据集描述

运行结果:
可以看到有[花萼长,花萼宽,花瓣长,花瓣宽]4个特征,以及['setosa' 'versicolor' 'virginica']三个类别。

(150, 4) (150,)
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
['setosa' 'versicolor' 'virginica']

查看前10条数据

import pandas as pd
data_df = pd.DataFrame(dataset.data, columns=dataset.feature_names)
data_df['Class'] = dataset.target
data_df.head(10) #查看前10条数据

运行结果:
在这里插入图片描述

我们以花瓣长度和宽度作为x和y变量,大致查看一下分布:

import matplotlib.pyplot as plt
plt.scatter(
    data_df['petal length (cm)'], #x坐标
    data_df['petal width (cm)'], #y坐标
    c=data_df['Class'],#颜色
)
plt.show()

运行结果:
在这里插入图片描述

6.2 添加前置与数据分割

添加x0=1的前置,然后将数据分割成训练数据与验证数据。

import numpy as np
np.set_printoptions(suppress=True) #numpy不使用科学计数法
from sklearn.model_selection import train_test_split

X, Y = datasets.load_iris(return_X_y=True)

#添加前置 x0=1
temp = np.ones([X.shape[0],X.shape[1]+1])
temp[:,1:] = X #第[0]行到最后一行的(第[1]列到最后一列)赋值为X
X = temp

# 将数据分割为训练和验证数据,都有特征和预测目标值
# 分割基于随机数生成器。为random_state参数提供一个数值可以保证每次得到相同的分割
X_train, X_test, y_train, y_test = train_test_split(X, Y, random_state = 0)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

运行结果:

(112, 5) (38, 5) (112,) (38,)

6.3 迭代训练

#独热编码函数
def one_hot(y): 
    one_hot = np.zeros((m, k))
    one_hot[np.arange(m), y.T] = 1
    return one_hot

#softmax函数
def softmax(scores):
    sum_exp = np.sum(np.exp(scores), axis=0)
    softmax = np.exp(scores) / sum_exp
    return softmax

#损失函数
def loss(y_one_hot,probs):
    return (-1/m)*np.sum(y_one_hot*np.log(probs))


learn_rate=0.1 #学习率
m=X_train.shape[0]
n=X_train.shape[1] #由于添加了前置,这里的n等于文章中的n+1
k=data_df['Class'].unique().shape[0] #种类数量

np.random.seed(1)
w=(np.random.random([k,n])-0.5)*2 #初始化参数w,k行n列,取值范围[-1,1)
# y_train=y_train.reshape([1,m])

count=0 #迭代次数
plt_epoch=[]
plt_loss=[]

# 计算 one-hot 矩阵
y_one_hot = one_hot(y_train)
y_one_hot=y_one_hot.T # k行m列

#迭代
for i in range(10000):

    scores=w.dot(X_train.T) # 分数矩阵,k行m列,由于数据集是m行n列,这里的X_train.T就是文章中的x
    probs=softmax(scores) #进行softmax计算,k行m列

    w_C=(-learn_rate/m)*(y_one_hot-probs).dot(X_train) #k行n列
    
    
    if count%100==0:
        # 每迭代100次则输出误差值
        ls=loss(y_one_hot,probs)
        print('epoch:',count,'loss:',ls)
        plt_epoch.append(count)
        plt_loss.append(ls)

    #若w变化不大,则暂停迭代,模型训练完成
    if (np.abs(w_C)<0.001).all():
        print('最终w变化量:',w_C)
        break
    count+=1
    w-=w_C

print('迭代次数:',count)
print('w权重:',w)

#绘制迭代次数与损失函数的关系
plt.plot(plt_epoch,plt_loss)

运行结果:

epoch: 0 loss: 3.4770110920562307
epoch: 100 loss: 0.47362291421521374
epoch: 200 loss: 0.2642328678118655
epoch: 300 loss: 0.21304305853900296
epoch: 400 loss: 0.18173915290674772
epoch: 500 loss: 0.1605547956098286
epoch: 600 loss: 0.14522407403143245
epoch: 700 loss: 0.13357920108443666
epoch: 800 loss: 0.1244066715794026
epoch: 900 loss: 0.11697518958289194
epoch: 1000 loss: 0.11081781173685108
epoch: 1100 loss: 0.1056222274323396
最终w变化量: [[-0.00012538 -0.00029019 -0.00061384  0.00080699  0.00038747]
 [-0.00039937 -0.00030874  0.00001068  0.00019287  0.00054193]
 [ 0.00052475  0.00059893  0.00060315 -0.00099986 -0.0009294 ]]
迭代次数: 1109
w权重: [[ 0.23633112  1.30617392  1.0862866  -3.09701251 -1.94803157]
 [ 0.01764411  0.83869538 -0.68038914 -0.27560502 -1.39762578]
 [-1.396865   -1.96126088 -2.30564276  3.52705249  1.77157779]]

在这里插入图片描述

6.4 验证数据

y_predict = np.argmax(softmax(w.dot(X_test.T)), axis=0)

print('预测:',y_predict)
print('实际:',y_test)
print('误差:',y_predict-y_test)

运行结果:

预测: [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 2 0 2 2 1 0 2]
实际: [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 1]
误差: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1]

七、sklearn代码实现

from sklearn.linear_model import LogisticRegression
import joblib

#初始化模型
lr_model = LogisticRegression()
#训练
lr_model.fit(X_train, y_train)

#保持模型
joblib.dump(lr_model, './LogisticRegression.model')

#加载模型,在实际应用中直接加载已训练好的模型
lr_model = joblib.load('./LogisticRegression.model')
 
#预测
y_pred = lr_model.predict(X_test)

print("Prediction on test set:", y_pred)
print("Score on test set:", lr_model.score(X_test, y_test))

运行结果:

Prediction on test set: [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 2]
Score on test set: 0.9736842105263158

八、参考资料

《softmax回归推导及python实例分析》
《Softmax 回归原理与实现》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[时间序列预测]基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测[保姆级手把手教学]

系列文章目录 深度学习原理-----线性回归梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网络&#xff08;RNN、LSTM&#xff09; 时间序列预测-----基于BP、LSTM、CNN-LSTM神经网络…

安卓开发Android studio学习笔记14:用户注册登录(案例演示)

Android studio学习笔记第一步&#xff1a;配置activity_information.xml第二步&#xff1a;配置activity_registration.xml第三步&#xff1a;配置strings.xml第四步&#xff1a;配置InformationActivity第五步&#xff1a;配置RegistrationActivity第六步&#xff1a;运行结果…

二叉搜索树

文章目录二叉搜索树1. 概念2. 模拟实现二叉搜索树2.1 准备工作 创建类2.2 查找方法2.3 插入方法2.4 删除方法3. 性能分析二叉搜索树 前言 &#xff1a; 1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不…

学点高端技术:基于密度的聚类算法——FDBSCAN算法

机器学习、人工智能各类KNN算法层出不穷&#xff0c;DBSCAN具有强代表性&#xff0c;它是一个基于密度的聚类算法&#xff0c;最大的优点是能够把高密度区域划分为簇&#xff0c;能够在高噪声的条件下实现对目标的精准识别&#xff0c;但该算法当前已远不能满足人们对于高效率、…

零基础自学javase黑马课程第二天

零基础自学javase黑马课程第二天 ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&#x1f39e;2022年10月16日&#…

【电子技术基础(精华版)】直流稳压电路

前期我们了解了一些关于直流稳压电源的基础知识&#xff0c;为了更好地完善职教高考电子技术专业的需求&#xff0c;接下来我会更新【电子技术基础&#xff08;精华版&#xff09;】&#xff0c;从中可以让更多的职教高考生有效地复习。 由于本人是山东省的一位博主&#xff0…

3、SySeVR测试(上)

一、准备 1、将测试代码放在/home/test目录下&#xff1b; 2、将测试数据导入joern 在/home/SySeVR/joern-0.3.1查看是否存在.joernIndex文件&#xff0c;有的话&#xff0c;需要删除。 删除之后&#xff0c;将测试数据导入joern: java -jar /home/SySeVR/joern-0.3.1/bin/jo…

程序员的中年危机:那些能工作到45、50、60的程序员们,究竟具备了哪些能力?

程序员行业新技术发展迅猛&#xff0c;可以说是日新月异。也正是这个原因&#xff0c;中年危机成为我们必须面对和攻克的问题。 思考一个问题&#xff1a;那些能工作到45、50、甚至60的程序员们&#xff0c;究竟具备了哪些过人的能力&#xff1f; 就我过去的经历和观察来说&a…

A comprehensive overview of knowledge graph completion

摘要 知识图(KG)以其代表和管理海量知识的独特优势&#xff0c;为各种下游知识感知任务(如推荐和智能问答)提供了高质量的结构化知识。KGs的质量和完整性在很大程度上决定了下游任务的有效性。但由于知识产权制度的不完备性&#xff0c;知识产权制度中仍有大量有价值的知识缺失…

【《机器人技术》复习】

【《机器人技术》复习】1. 要求&#xff1a;2. 机械手运动解算问题2.1 自由度考点2.2 运动学方程2.3 动力学方程2.4 传感器2.5 编程题1. 要求&#xff1a; 本次大作业上交截止时间 之前&#xff0c;超时&#xff0c;本门课程判定不及格。 作业上交的格式如下 一律以 WORD 文档…

2022年江西省职业院校技能大赛“网络空间安全”比赛任务书

2022年江西省职业院校技能大赛“网络空间安全” 比赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 …

求交叉链表头结点-面试必备

这里分享一下一个交叉链表的关键题目&#xff0c;觉得不错的小伙伴别忘了点赞支持 交叉链表无环链表思路代码有环链表思路代码总结无环链表 已知有两个链表&#xff08;无环&#xff09;相交&#xff0c;求出相交的头结点 思路 因为链表相交&#xff0c;所以最后一部分一定重…

每天五分钟机器学习:常用的参数寻优方法——k折交叉验证

本文重点 本文我们介绍一种常用的参数寻优方法--k折交叉验证&#xff0c;现在的数据集一般分为三类&#xff0c;分别为训练集&#xff0c;验证集&#xff0c;测试集。训练集用于训练模型&#xff0c;验证集用于调参&#xff0c;测试集用于测试调参之后的模型效果。 但是很多时…

SpringBoot+Vue实现前后端分离社区疫苗接种管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JDK版…

xray和burp联动

目录 xray下载安装CT Stack 安全社区 Burp和xray联动 xray下载安装下载地址&#xff1a;CT Stack 安全社区 先通过PowerShell打开xray所在的目录&#xff0c;运行&#xff0c;生成yaml文件 genca在目录下生成证书 生产证书后将证书导入浏览器 导入后在本地安装一下 Burp和xray…

WebdriverIO – 完整的初学者课程2022

WebdriverIO – 完整的初学者课程2022 从零开始学习和使用 JavaScript 实现 Webdriver IO&#xff01;构建功能齐全的 Web 测试自动化框架 课程英文名&#xff1a;WebdriverIO - Complete Beginner Course 2022 此视频教程共1.0小时&#xff0c;中英双语字幕&#xff0c;画质…

SD-WAN不断冲击传统WAN架构

随着全球化数字信息转型&#xff0c;网络结构也是在不断的发展和完善。随着云时代的到来&#xff0c;传统的网络布局的局限性开始凸显出来。在过去几年广域网最重要的变化是软件定义广域网技术 (SD-WAN) 的广泛部署&#xff0c;它改变了网络专业人员优化和保护广域网连接的方式…

python基于PHP+MySQL的大学生宿舍管理系统

大学宿舍管理系统是信息时代的产物,它是学校宿管部门的一个好帮手。有了它不再需要繁重的纸质登记,有了它宿管员不在需要繁重的工作,一些公寓信息和住宿等基本信息可以由管理人员及时的对信息进行查询、更新、修改和删除,方便简易,且时效性高 基于PHP大学生宿舍管理系统采用当前…

年薪50w+的软件测试工程师是怎么炼成的?

随着互联网行业的迅速发展&#xff0c;软件测试工程师的地位越来越高&#xff0c;公司招聘时的薪资也越来越高&#xff0c;那么市场上为什么还有大量的软件测试工程师薪资只有5-6k呢&#xff1f;因为他们有一个共同的弱点&#xff0c;就是只会手工测试&#xff01;&#xff01;…

Python编程运算符 比较运算符

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.比较运算符 二.比较运算符使用 &#xff08;1&#xff09;等于 &…