Lesson 5. 分类模型决策边界与模型评估指标(上)

news2024/11/16 19:58:01

文章目录

  • 一、决策边界(Decision Boundary)基本概念与用途
    • 1. 决策边界基本概念与绘制方法
    • 2. 通过决策边界观察模型性能
    • 3. 逻辑回归决策边界与模型可解释性
  • 二、逻辑回归决策边界绘制与使用方法
    • 1. 定义决策边界绘制函数
    • 2. 决策边界绘制
    • 3. 逻辑回归决策边界与特征可解释性探索
  • 三、验证逻辑回归参数和决策边界直线系数之间关系

  • 我们需要学习一些关于分类模型的基础知识,包括观察分类模型判别性能的决策边界基本的概念与实现方法,同时也包括对于分类模型的一系列模型评估指标的基本解释与使用场景。
# 科学计算模块
import numpy as np
import pandas as pd

# 绘图模块
import matplotlib as mpl
import matplotlib.pyplot as plt

# 自定义模块
from ML_basic_function import *

一、决策边界(Decision Boundary)基本概念与用途

1. 决策边界基本概念与绘制方法

  • 关于分类模型的模型性能判别,我们可以从模型基本理论出发来进行判别,当然也可以根据长期的实践经验来进行判断。
  • 不过除此以外,还有一种常见的、用于辅助判别分类模型的模型性能的方法,那就是绘制模型决策边界。
  • 决策边界本质上是一种可视化分类效果的方法,其基本思路也非常简单——利用训练好的模型对样本空间所有的坐标点进行预测,然后观察样本空间所有点的不同类别之间的边界,最终就是模型的决策边界。
  • 例如,假设现在样本空间是二维空间,即数据总共只有两个特征,我们采用某个二分类数据集训练了一个逻辑回归模型,然后我们我们借助该模型对样本空间中所有点进行预测,并且对模型判别的不同类别的点进行不同着色,最终不同颜色(也就是不同类别)的点之间的分界线,其实就是决策边界。
  • 一般来说,我们会在决策边界图像上添加参与模型训练的样本点。相关过程如下图所示:

在这里插入图片描述

  • 另外,如果从决策边界角度出发,决策边界实际上就是模型判别样本点属于哪一类的边界,而不同颜色区域其实就是不同类别样本点所在的区域。

2. 通过决策边界观察模型性能

  • 根据决策边界图像,其实我们就能看出模型的分类性能和对于当前样本的分类结果。
  • 例如对于上图来说,首先我们能够发现,实际上逻辑回归在二维样本空间中的决策边界是一条直线,而这种决策边界的呈现直线的特性,会直接影响模型对于复杂样本的分类性能。
  • 在上述图四中能够清楚的看到,无论是红色区域的蓝色点,还是蓝色区域中红色的点,实际上都是模型错判的样本。
  • 受此限制,逻辑回归无法处理更加复杂的判别类问题,由此我们也能看到逻辑回归本身的性能瓶颈。

在这里插入图片描述

  • 当然,并非所有模型的决策边界都呈现出线性的状态,甚至对于大多数模型来说,其决策边界都不是单独一条直线。
  • 例如,对于 KNN 模型来说,其决策边界实际上是一个个圆圈叠加而成的拥有一定幅度的边界,而对于决策树模型来说,其决策边界实际上是一条条折线:

在这里插入图片描述

  • 很明显,从决策边界所呈现出来的不同形状,我们也能大致看出分类模型的判别效力,类似树模型甚至是树模型的集成模型,由于其是借助折线的决策边界来进行来进行样本类别划分,因此具备比逻辑回归更强的判别效力。
  • 此外,有时我们还能借助决策边界观察模型过拟合倾向,一般来说,模型决策边界越不规则、越是出现不同颜色区域彼此交错的情况,则说明模型越是存在过拟合倾向。

在这里插入图片描述

  • 受到平面图像呈现维度的约束,一般来说我们只能观察二维或者三维样本空间的决策边界或者决策平面,对于更高维度样本空间尽管在建模时也同样存在决策边界,但无法可视化展示。

3. 逻辑回归决策边界与模型可解释性

  • 尽管逻辑回归的线性决策边界一定程度约束了模型的分类效能,但线性决策边界实际上也为逻辑回归的模型可解释性提供了一个新的解释角度。
  • 例如,对于上述 dispersion=[6,2] 的逻辑回归决策边界来说,第一个特征(X 轴)取值越大、或者第二个特征(Y 轴)取值越大,则越有可能蓝色一类,或者说样本为蓝色类的概率就更大。

在这里插入图片描述

  • 而该现象也为解释特征之于样本类别判别的作用提供了一个新的角度。只有当决策边界是线性时才能够进行如此解释。
  • 逻辑回归线性方程系数的解释角度:假设逻辑回归方程为 y = S i g m o i d ( x 1 − 2 x 2 ) y=Sigmoid(x_1-2x_2) y=Sigmoid(x12x2),其实我们只能说特征 x 1 x_1 x1 对于类别判别为 1 的结果有正向促进作用,而特征 x 2 x_2 x2 对于类别判别为 1 的结果有负向促进作用,并且对数优势比( l n y 1 − y ln\frac{y}{1-y} ln1yy)有两倍的差异。
  • 值得一提的是,对于大多数模型来说都是试图找到一条更有效的决策边界去对样本进行类别划分,但也有些模型并不会在决策边界上下功夫,而是试图去改变样本空间。
  • 例如支持向量机 SVM,就能够通过某种映射关系改变数据分布(包括数据维度),然后在新的数据分布中利用简单的决策平面或者超平面来对数据集进行切分。

在这里插入图片描述

二、逻辑回归决策边界绘制与使用方法

1. 定义决策边界绘制函数

  • 决策边界的绘制函数其实和 Lesson 4.3 中介绍的损失函数的等高线图绘制方法类似,只是将等高线的绘制改成了分片区的着色。
  • 首先还是利用 meshgrid 函数创建区域点图
x1, x2 = np.meshgrid(np.arange(3), np.arange(1, 4))
[x1, x2]
#[array([[0, 1, 2],
#        [0, 1, 2],
#        [0, 1, 2]]),
# array([[1, 1, 1],
#        [2, 2, 2],
#        [3, 3, 3]])]
  • 回顾 Lesson 4.3 中所介绍内容,对于 meshgrid 函数生成结果,我们可以理解为第一个返回的结果为三排点的横坐标,而第二个返回结果为每个点纵坐标。
  • 所有的点是逐层排布的,每一排的点具有相同的纵坐标。实际绘图时,我们需要将这些点铺满整张画布。然后,我们需要带入画布中的所有点进行模型预测结果输出,即需要预测画布中的每个点所属类别。
  • 虽然我们知道上述 meshgrid 结果实际表示的点为 (0,1)、(1,1)、(2,1)…,但只有将这些点转化为二维数组才能带入模型进行训练,我们可以借助 reshape 方法和 concatenate 函数来进行相应的形变。
  • 同时,需要添加一列全是 1 的列在数据集的末尾,才能顺利进行逻辑回归建模预测。
np.concatenate([x1.reshape(-1, 1), x2.reshape(-1, 1), np.ones(shape=(9, 1))], 1)
#array([[0., 1., 1.],
#       [1., 1., 1.],
#       [2., 1., 1.],
#       [0., 2., 1.],
#       [1., 2., 1.],
#       [2., 2., 1.],
#       [0., 3., 1.],
#       [1., 3., 1.],
#       [2., 3., 1.]])
  • 接下来,将数据带入模型,即可输出预测结果。试想一下,当这些点密集的铺满画布时,我们就能够清楚的找出一条不同着色的边界。我们将上述过程封装为一个函数:
def logit_DB(X, w, y):
    """
    逻辑回归决策边界绘制函数
    """
    
    # 以两个特征的极值+1/-1作为边界,并在其中添加1000个点
    x1, x2 = np.meshgrid(np.linspace(X[:, 0].min()-1, X[:, 0].max()+1, 1000).reshape(-1,1),
                         np.linspace(X[:, 1].min()-1, X[:, 1].max()+1, 1000).reshape(-1,1))
    
    # 将所有点的横纵坐标转化成二维数组
    X_temp = np.concatenate([x1.reshape(-1, 1), x2.reshape(-1, 1), np.ones(shape=(1000000, 1))], 1)
    
    # 对所有点进行逻辑回归预测
    y_hat_temp = logit_cla(sigmoid(X_temp.dot(w)))
    yhat = y_hat_temp.reshape(x1.shape)
    
    # 绘制决策边界图像
    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#90CAF9'])
    plt.contourf(x1, x2, yhat, cmap=custom_cmap)
  • 关于图像绘制部分,此处采用了 plt.contourf 函数。该函数和此前介绍的等高线绘制函数 plt.contour 函数略有区别,该函数不会标注不同区域之间的边界,取而代之的是将不同区域进行着色处理。
  • 此外,ListedColormap 函数可通过输入十六进制颜色信息创建一个 colormap 对象,该对象可以作为 plt.contourf 函数中的 cmap 参数,用于指定不同区域的着色。

2. 决策边界绘制

  • 接下来,进行逻辑回归的决策边界绘制
  • 数据准备
# 设置随机数种子
np.random.seed(24)# 创建数据
f, l = arrayGenCla(num_class = 2, deg_dispersion = [6, 2], bias = True)          # 离散程度较小# 设置随机数种子
np.random.seed(24)# 数据切分
Xtrain, Xtest, ytrain, ytest = array_split(f, l)
​
mean_ = Xtrain[:, :-1].mean(axis=0)
std_ = Xtrain[:, :-1].std(axis=0)
​
Xtrain[:, :-1] = (Xtrain[:, :-1] - mean_) / std_
Xtest[:, :-1] = (Xtest[:, :-1] - mean_) / std_
​
# 观察数据集整体情况
plt.scatter(f[:, 0], f[:, 1], c=l)

在这里插入图片描述

  • 核心参数定义
# 设置随机数种子
np.random.seed(24)# 核心参数
batch_size = 50
num_epoch = 200
lr_init = 0.2# 参数初始值
n = f.shape[1]
w = np.random.randn(n, 1)# 记录迭代过程模型准确率计算结果
train_acc = []
test_acc = []
​
lr_lambda = lambda epoch: 0.95 ** epoch
  • 模型训练与结果观察
# 模型训练
for i in range(num_epoch):
    w = sgd_cal(Xtrain, w, ytrain, logit_gd, batch_size=batch_size, epoch=1, lr=lr_init*lr_lambda(i))
    train_acc.append(logit_acc(Xtrain, w, ytrain, thr=0.5))
    test_acc.append(logit_acc(Xtest, w, ytest, thr=0.5))
    
# 观察计算结果
plt.plot(list(range(num_epoch)), np.array(train_acc).flatten(), label='train_acc')
plt.plot(list(range(num_epoch)), np.array(test_acc).flatten(), label='test_acc')
plt.xlabel('epochs')
plt.ylabel('Accuracy')
plt.legend(loc = 4)

在这里插入图片描述

  • 绘制决策边界
  • 接下来,利用上述模型训练结果,来进行决策边界的图像绘制。
w
#array([[3.1894049 ],
#       [2.30553244],
#       [0.1691708 ]])

logit_DB(Xtrain, w, ytrain)

在这里插入图片描述

  • 当然,更为一般的情况是,我们会同时将样本点也绘制在包含决策边界的图像上
# 训练集上的决策边界
logit_DB(Xtrain, w, ytrain)
plt.scatter(Xtrain[(ytrain == 0).flatten(), 0], Xtrain[(ytrain == 0).flatten(), 1], color='red')
plt.scatter(Xtrain[(ytrain == 1).flatten(), 0], Xtrain[(ytrain == 1).flatten(), 1], color='blue')

在这里插入图片描述

  • 由于此处采用了一种布尔索引的方式分别筛选出两类点并对其进行不同的着色处理。
(ytrain == 0)[:10]
#array([[ True],
#       [ True],
#       [False],
#       [ True],
#       [ True],
#       [ True],
#       [False],
#       [ True],
#       [False],
#       [False]])

(ytrain == 0).sum()
#333

Xtrain[(ytrain == 0).flatten(), :][:10]
#array([[-0.54046519, -0.81824522,  1.        ],
#       [-0.54654998, -0.73750376,  1.        ],
#       [-0.31714585, -0.6904884 ,  1.        ],
#       [-0.90519121, -1.17674213,  1.        ],
#       [-0.94805   , -0.01882483,  1.        ],
#       [-1.70121658, -0.7126707 ,  1.        ],
#       [-1.65683868, -0.67489106,  1.        ],
#       [-0.85358557, -0.81544748,  1.        ],
#       [-0.78145774, -1.8732396 ,  1.        ],
#       [-0.17988496, -1.1491633 ,  1.        ]])

Xtrain[(ytrain == 0).flatten(), :].shape
#(333, 3)

# 测试集上的决策边界
logit_DB(Xtrain, w, ytrain)
plt.scatter(Xtest[(ytest == 0).flatten(), 0], Xtest[(ytest == 0).flatten(), 1], color='red')
plt.scatter(Xtest[(ytest == 1).flatten(), 0], Xtest[(ytest == 1).flatten(), 1], color='blue')

在这里插入图片描述

  • 当然,我们也可以提升数据难度再观察逻辑回归的决策边界。
# 设置随机数种子
np.random.seed(24)# 创建数据
f, l = arrayGenCla(num_class = 2, deg_dispersion = [6, 4], bias = True)          # 离散程度较小# 设置随机数种子
np.random.seed(24)# 数据切分
Xtrain, Xtest, ytrain, ytest = array_split(f, l)
​
mean_ = Xtrain[:, :-1].mean(axis=0)
std_ = Xtrain[:, :-1].std(axis=0)
​
Xtrain[:, :-1] = (Xtrain[:, :-1] - mean_) / std_
Xtest[:, :-1] = (Xtest[:, :-1] - mean_) / std_
​
# 设置随机数种子
np.random.seed(24)# 核心参数
batch_size = 50
num_epoch = 200
lr_init = 0.2# 参数初始值
n = f.shape[1]
w = np.random.randn(n, 1)# 定义学习率衰减匿名函数
lr_lambda = lambda epoch: 0.95 ** epoch
​
# 模型训练
for i in range(num_epoch):
    w = sgd_cal(Xtrain, w, ytrain, logit_gd, batch_size=batch_size, epoch=1, lr=lr_init*lr_lambda(i))

w
#array([[1.90849458],
#       [1.66037138],
#       [0.14304024]])

logit_DB(Xtrain, w, ytrain)

在这里插入图片描述

# 训练集上的决策边界
logit_DB(Xtrain, w, ytrain)
plt.scatter(Xtrain[(ytrain == 0).flatten(), 0], Xtrain[(ytrain == 0).flatten(), 1], color='red')
plt.scatter(Xtrain[(ytrain == 1).flatten(), 0], Xtrain[(ytrain == 1).flatten(), 1], color='blue')

在这里插入图片描述

# 测试集上的决策边界
logit_DB(Xtrain, w, ytrain)
plt.scatter(Xtest[(ytest == 0).flatten(), 0], Xtest[(ytest == 0).flatten(), 1], color='red')
plt.scatter(Xtest[(ytest == 1).flatten(), 0], Xtest[(ytest == 1).flatten(), 1], color='blue')

在这里插入图片描述

3. 逻辑回归决策边界与特征可解释性探索

  • 接下来,我们以鸢尾花数据集为例,来探讨为何逻辑回归的方程系数和决策边界其实都无法判别特征强弱。
  • 此处我们选取花萼宽 sepal_width 和花瓣长 petal_length 作为特征,进行是否是 setosa 鸢尾花的判别,即令 setosa 鸢尾花为类别 1,其他鸢尾花为类别 0。
  • 首先进行数据的读取。
pd.read_csv('iris.csv')

在这里插入图片描述

  • 然后进行数据提取与转化。
pd.read_csv('iris.csv').iloc[:, 1: 3]

在这里插入图片描述

features_temp = pd.read_csv('iris.csv').iloc[:, 1: 3].values

features_temp[:10]
#array([[3.5, 1.4],
#       [3. , 1.4],
#       [3.2, 1.3],
#       [3.1, 1.5],
#       [3.6, 1.4],
#       [3.9, 1.7],
#       [3.4, 1.4],
#       [3.4, 1.5],
#       [2.9, 1.4],
#       [3.1, 1.5]])

labels_temp = pd.read_csv('iris.csv').iloc[:, -1].values

labels_temp

labels_temp[labels_temp != 'Iris-setosa'] = 0
labels_temp[labels_temp == 'Iris-setosa'] = 1

labels_temp
#array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#       1, 1, 1, 1, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0], dtype=object)

labels = labels_temp.astype(float).reshape(-1, 1)

labels

features = np.concatenate([features_temp, np.ones(shape=labels.shape)], 1)

features[:10]
#array([[3.5, 1.4, 1. ],
#       [3. , 1.4, 1. ],
#       [3.2, 1.3, 1. ],
#       [3.1, 1.5, 1. ],
#       [3.6, 1.4, 1. ],
#       [3.9, 1.7, 1. ],
#       [3.4, 1.4, 1. ],
#       [3.4, 1.5, 1. ],
#       [2.9, 1.4, 1. ],
#       [3.1, 1.5, 1. ]])

labels[:10]
#array([[1.],
#       [1.],
#       [1.],
#       [1.],
#       [1.],
#       [1.],
#       [1.],
#       [1.],
#       [1.],
#       [1.]])

# 设置随机数种子
np.random.seed(24)# 核心参数
batch_size = 10
num_epoch = 200
lr_init = 0.5# 参数初始值
n = features.shape[1]
w = np.random.randn(n, 1)# 定义学习率衰减匿名函数
lr_lambda = lambda epoch: 0.95 ** epoch
​
# 模型训练
for i in range(num_epoch):
    w = sgd_cal(features, w, labels, logit_gd, batch_size=batch_size, epoch=1, lr=lr_init*lr_lambda(i))

w
#array([[ 2.8630463 ],
#       [-3.19680442],
#       [ 0.01148845]])

# 计算准确率
logit_acc(features, w, labels, thr=0.5)
#1.0

# 绘制决策边界
logit_DB(features, w, labels)
plt.scatter(features[(labels == 0).flatten(), 0], features[(labels == 0).flatten(), 1], color='red')
plt.scatter(features[(labels == 1).flatten(), 0], features[(labels == 1).flatten(), 1], color='blue')
plt.xlabel('sepal_width')
plt.ylabel('petal_length')
plt.title('Iris-setosa or not')

在这里插入图片描述

  • 根据决策边界的判别结果,我们能够得出,鸢尾花花萼越宽(sepal_width)取值越大,则越有可能是setosa鸢尾花,而鸢尾花花瓣越长(petal_length),则越有可能不是 setosa 鸢尾花。
  • 从逻辑回归方程系数来看,第一个特征系数取值为正值,也说明第一个特征对样本概率判别为 1 有正向促进作用,第二个特征系数取值为负值,也说明第二个特征对样本概率判别为 1 有负向促进作用。
  • 我们无法根据决策边界斜率基本是 1,逻辑回归的线性方程中两个特征系数绝对值类似,就判断两个特征对类别判别的贡献度类似、两个特征强弱类似。
  • 其实从样本空间中的样本分布我们不难看出,对于 setosa 类鸢尾花的识别来说,其实只需要 petal_length 一个特征即可,也就是说如果需要判别特征重要性的话,petal_length 的特征重要性远比 sepal_width 更加重要。
  • 当然,针对上述实验,我们可以通过简单调整参数的初始取值,就能够获得一个分类准确率仍然是 100%,但第二个特征的系数绝对值小于第一个特征的实验结果:
# 核心参数
batch_size = 10
num_epoch = 200
lr_init = 0.5# 参数初始值
w = np.array([[10.0],[-1],[0]])# 定义学习率衰减匿名函数
lr_lambda = lambda epoch: 0.95 ** epoch
​
# 设置随机数种子
np.random.seed(24)# 模型训练
for i in range(num_epoch):
    w = sgd_cal(features, w, labels, logit_gd, batch_size=batch_size, epoch=1, lr=lr_init*lr_lambda(i))
    
w
#array([[ 6.79050273],
#       [-6.44217682],
#       [-1.0895957 ]])

# 计算准确率
logit_acc(features, w, labels, thr=0.5)
#1.0

# 绘制决策边界
logit_DB(features, w, labels)
plt.scatter(features[(labels == 0).flatten(), 0], features[(labels == 0).flatten(), 1], color='red')
plt.scatter(features[(labels == 1).flatten(), 0], features[(labels == 1).flatten(), 1], color='blue')
plt.xlabel('sepal_width')
plt.ylabel('petal_length')
plt.title('Iris-setosa or not')

在这里插入图片描述

  • 从单一特征就能识别 setosa 类,其实也是鸢尾花数据集本身分类难度不大的重要原因。

三、验证逻辑回归参数和决策边界直线系数之间关系

  • 其实对于逻辑回归来说,我们也可以直接通过得到的逻辑回归线性方程来换算决策边界的直线系数,首先回到第一个例子当中,次数我们计算的 w 结果如下:
# 设置随机数种子
np.random.seed(24)# 创建数据
f, l = arrayGenCla(num_class = 2, deg_dispersion = [6, 2], bias = True)          # 离散程度较小# 设置随机数种子
np.random.seed(24)# 数据切分
Xtrain, Xtest, ytrain, ytest = array_split(f, l)
​
mean_ = Xtrain[:, :-1].mean(axis=0)
std_ = Xtrain[:, :-1].std(axis=0)
​
Xtrain[:, :-1] = (Xtrain[:, :-1] - mean_) / std_
Xtest[:, :-1] = (Xtest[:, :-1] - mean_) / std_
# 设置随机数种子
np.random.seed(24)# 核心参数
batch_size = 50
num_epoch = 200
lr_init = 0.2# 参数初始值
n = f.shape[1]
w = np.random.randn(n, 1)# 记录迭代过程模型准确率计算结果
train_acc = []
test_acc = []
​
lr_lambda = lambda epoch: 0.95 ** epoch

# 模型训练
for i in range(num_epoch):
    w = sgd_cal(Xtrain, w, ytrain, logit_gd, batch_size=batch_size, epoch=1, lr=lr_init*lr_lambda(i))
    train_acc.append(logit_acc(Xtrain, w, ytrain, thr=0.5))
    test_acc.append(logit_acc(Xtest, w, ytest, thr=0.5))
    
w
#array([[3.1894049 ],
#       [2.30553244],
#       [0.1691708 ]])

logit_DB(Xtrain, w, ytrain)

在这里插入图片描述

  • 此时逻辑回归方程为: y = s i g m o i d ( w 1 x 1 + w 2 x 2 + b ) y = sigmoid(w_1x_1+w_2x_2+b) y=sigmoid(w1x1+w2x2+b)
  • w 中三个参数分别对应 w 1 , w 2 , b w_1,w_2,b w1w2b
  • 此时决策边界的直线方程即为: y = − b w 2 − w 1 w 2 ⋅ x y=-\frac{b}{w_2}-\frac{w_1}{w_2}\cdot x y=w2bw2w1x
  • 我们可以通过如下方式来进行验证:
Xtrain[:,0].max()+1
Xtrain[:,0].min()-1
#3.4440696978411824
#-3.5444315067469994

Xtrain[:,1].max()+1
Xtrain[:,1].min()-1
#3.4748793406727567
#-3.488450474918355

f1 = np.concatenate([np.linspace(2, 3, 100).reshape(-1, 1), 
                     np.full_like(np.linspace(2, 3, 100).reshape(-1, 1), Xtrain[:,1].min()-1), 
                     np.ones(100).reshape(-1, 1)], 1)

logit_cla(sigmoid(f1.dot(w))).sum()
#53.0

logit_cla(sigmoid(f1.dot(w)))[46]
#array([0.])

x1 = f1[46]

f2 = np.concatenate([np.linspace(-3, -2, 100).reshape(-1, 1), 
                     np.full_like(np.linspace(-3, -2, 100).reshape(-1, 1), Xtrain[:,1].max()+1), 
                     np.ones(100).reshape(-1, 1)], 1)

logit_cla(sigmoid(f2.dot(w))).sum()
#56.0

logit_cla(sigmoid(f2.dot(w)))[43]
#array([0.])

x2 = f2[43]

f3 = np.array([x1, x2])

f3
#array([[ 2.46464646, -3.48845047,  1.        ],
#       [-2.56565657,  3.47487934,  1.        ]])

f3[:, [0, 2]]
#array([[ 2.46464646,  1.        ],
#       [-2.56565657,  1.        ]])

f3[:, 1: 2]
#array([[-3.48845047],
#       [ 3.47487934]])

  • 据此,决策边界的直线系数为:
np.linalg.lstsq(f3[:, [0, 2]], f3[:, 1: 2], rcond=-1)[0]
#array([[-1.38427641],
#       [-0.07669852]])
  • 等价于 y = − b w 2 − w 1 w 2 ⋅ x y=-\frac{b}{w_2}-\frac{w_1}{w_2}\cdot x y=w2bw2w1x
w
#array([[3.1894049 ],
#       [2.30553244],
#       [0.1691708 ]])

- w[0] / w[1]
#array([-1.38337021])

- w[2] / w[1]
#array([-0.07337602])

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

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

相关文章

3、Maven——Maven创建java web工程,IDEA更改XML版本、Maven Search插件的安装与使用

目录 一、Maven创建java web工程 二、Maven创建java web项目的结构 1、添加项目目录 2、web.xml配置处理报错 三、IDEA更改XML版本 四、Maven Search插件的安装与使用 1、Maven Search的安装 2、Maven Search的使用 一、Maven创建java web工程 创建Empty Project空工程…

【U8+】用友U8试算UFO报表后,显示#公式错误;并且函数向导中没有用友账务函数。

【问题描述】 使用用友U816.1软件的时候, 打开UFO报表,计算资产负债表后,显示【#公式错误】。 【排查过程】 开始以为是选择的报表模板文件有问题,将其文件发送到其他U8客户端电脑上,操作正常。 那么可以认为报表模板…

java vector 类

目录 一.前言 1.1vector简介 1.1.1java Collection下的子类图 1.1..2 介绍 1.1.3Vector类详细规则 1.2Vector与ArrayList的区别 二.Vector的方法 三.代码示例(demo) 一.前言 1.1vector简介 1.1.1java Collection下的子类图 1.1..2 介绍 Vector类 是在 java 中可以实现…

从0到1一步一步玩转openEuler--02 openEuler操作系统的安装

2 openEuler操作系统的安装 2.1 openEuler操作系统的安装流程 2.2 openEuler操作系统的安装详细步骤 本次介绍 openEuler 22.03-LTS 基于 X86 架构的安装。 2.2.1 下载地址 官网下载地址:https://www.openeuler.org/zh/download/ 根据你的实际需求选择适合架构…

提取游戏《碧蓝档案》(Blue Archive)内的素材

实际上你游素材直接去根目录下找就行,唯一需要处理的可能就是bgm(格式均为ogg),用格式工厂或者你下个VLC都行。 使用方法:一根usb数据线,一台电脑,一部手机 目录 游戏目录位置 附录 更新&a…

SpringBean生命周期

IOC 控制反转 既然叫反转,肯定就有正转,正转其实就是对象去找实例,而反转就反过来了嘛,让实例来找对象通过容器; DI 依赖注入 通过容器注入了bean对象,而且这个过程是自动化的,也就是说容器…

计算机视觉

什么是计算机视觉? 计算机视觉是人工智能(AI)的一个领域,它使计算机和系统能够从数字图像、视频和其他视觉输入中提取有意义的信息,并根据该信息采取行动或提出建议。如果AI使计算机能够思考,那么计算机视…

webservice接口与HTTP接口学习笔记一、webservice 的概念

webservice接口与HTTP接口学习笔记一、webservice 的概念 目录:导读 一、webservice 的概念 二、webservice接口测试 三、HTTP接口 四、HTTP协议结构 一、webservice 的概念 Web 是使应用程序可以与平台和编程语言无关的方式进行相互通信的一项技术。Web 服务…

关于获取两数相除求百分比,浮点数或整数-相乘,相除-但余数需保留小数点不能有doble继承,应该使用BigDecimal进行四舍五入

int total 3; int finished 2; 类似于这种两数向除---需要将其转化为BigDecimal,利用其函数的方法相除,并用 BigDecimal类型接收结果。 int total 3 int finished 2; BigDecimal result BigDecimal.valueOf(finished).divide(BigDecimal.valueO…

function_url构造函数

目录URL构造函数作用语法返回值构造函数的特定方法URL.createObjectURLURL.revokeObjectURL应用[1]获取url携带参数[2]创建本地url[3]为每个文件生成一个uuidURL构造函数 作用 创建并返回指定url对象 语法 new URL(url,[base])url(必填): 若是rl 是相对 URL,则会…

操作系统简介

坚持看完,结尾有思维导图总结 这里写目录标题概述冯诺依曼体系结构操作系统简介总结概述 本文先介绍冯诺依曼体系结构,并且举了几个例子进行理解,随后粗略介绍操作系统功能,并且为进程的理解打下基础 冯诺依曼体系结构 首先上一…

Python入门第一课——Python起步安装、Sublime Text安装教程,环境配置

Python入门第一课——Python起步安装、Sublime Text文本编辑器1 Python简介2 Python安装2.1 下载安装包2.2 开始安装Python3 Python起步——安装编辑器Sublime Text3.1 Sublime Text简介3.2 Sublime Text安装安装包打开文件创建快捷方式3.3 打开sublime text3.4 第一个程序&…

LeetCode 刷题系列 -- 110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例 1:输入:root [3,9,20,null,null,15,7]输出:true示例…

Lombok

Lombok概述Lombok插件安装Lombok依赖注解SetterGetterToStringEqualsAndHashCodeNonNull构造方法相关注解NoArgsConstructorRequiredArgsConstructorAllArgsConstructorDataBuilderLogCleanupSneakyThrows概述 LomBok可以通过注解,帮助开发人员消除JAVA中尤其是POJ…

【目标检测论文解读复现NO.30】基于改进YOLO v5的宁夏草原蝗虫识别模型研究

前言此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,…

【FPGA】FPGA实现SPI协议读写FLASH(二)----- SPI接口驱动模块设计

SPI接口驱动模块设计一、功能分析二、状态机设计三、信号说明四、代码实现五、仿真测试写在前面:FPGA实现SPI协议读写FLASH系列相关文章:SPI通信协议【FPGA】FPGA实现SPI协议读写FLASH(一)----- M25P16操作概述在上篇文章中对FLAS…

【MyBatis】框架特点,ORM思想,事务管理机制

1. Mybatis概述:1.1 基础知识:SSM三大框架: Spring SpringMVC MyBatis框架其实就是对通用代码的封装, 提前写好一堆接口和类, 在做项目的时候直接引入这些常用的借口和类(引入框架), 基于这些现有的接口和类进行开发, 可以大大提高开发效率.框架一般是以jar包的形式存在的, j…

Qt UDP

UDP是一种是一种轻量级、不可靠、面向数据报的无连接协议。当可靠性不重要时,可以使用它。 QUdpSocket 是 QAbstractSocket 的一个子类,所以拥有QAbstractSocket的各种方法,允许您发送和接收 UDP 数据报。 QAbstractSocket的各种函数已经在上…

【数据结构基础】树 - 前缀树(Trie Tree)

Trie,又称字典树、单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是…

Zabbix灾难备份多种方式分享(建议收藏)

感谢本文译者田川 ! 欢迎更多资深用户翻译原厂博文(https://blog.zabbix.com/)! 田川 | 宏时数据技术工程师 Zabbix 5.0中文手册官方译者 2017-2018年Zabbix中国峰会演讲嘉宾 8年监控领域实施和管理工作经验 ►在这篇博文中&#xff…