唐宇迪机器学习实战课程笔记(全)

news2024/11/19 14:41:27

  • 1. 线性回归
    • 1.1线性回归理论
    • 1.2线性回归实战
  • 2.分类模型评估(Mnist实战SGD_Classifier)
    • 2.1 K折交叉验证K-fold cross validation
    • 2.2 混淆矩阵Confusion Matrix
    • 2.3 准确率accuracy、精度precision、召回率recall、F1
    • 2.4 置信度confidence
    • 2.5 ROC曲线
  • 3.训练调参基本功(LinearRegression)
    • 3.1 线性回归模型实现
    • 3.2不同GD策略对比
    • 3.3多项式曲线回归
    • 3.4过拟合和欠拟合
    • 3.5正则化作用
    • 3.6EarlyStop提前停止

机器学习模型的参数,不是直接数学求解,而是利用数据,进行迭代epoch,梯度下降优化求解。

1. 线性回归

1.1线性回归理论

  • 目标:更好的拟合连续函数(分割连续样本空间的平面h(·))
    在这里插入图片描述

  • ε ( i ) \varepsilon^{(i)} ε(i)是 真实值 y ( i ) y^{(i)} y(i) 与 预测值 h θ ( x ) = θ T x ( i ) h_\theta (x)=\theta^Tx^{(i)} hθ(x)=θTx(i)之间的误差
    在这里插入图片描述

  • 求解参数 θ \theta θ :误差项 ε \varepsilon ε服从高斯分布,利用最大似然估计,转换为最小二乘法
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 从最小二乘法得到目标函数 J ( θ ) J(\theta) J(θ),为求其最值,利用梯度下降算法,沿偏导数(梯度)反方向,迭代更新计算,求解参数 θ \theta θ
    在这里插入图片描述

  • 梯度下降算法:BatchGD批量梯度下降、SGD随机梯度下降、Mini-BatchGD小批量梯度下降(实用)
    batch一般设为 2 5 2^5 25=64、 2 6 2^6 26=128、 2 7 2^7 27=256,越大越好
    在这里插入图片描述在这里插入图片描述
    GD的矩阵运算:
    在这里插入图片描述

  • 学习率lr:开始设1e-3,逐渐调小到1e-5
    在这里插入图片描述

1.2线性回归实战

数据预处理中normalize标准化作用:对输入全部数据 X − μ σ \frac{ X-\mu}{\sigma } σXμ,使得不同值域的输入 x i x_i xi x j x_j xj分布在同一取值范围。如 x i ∈ [ 0.1 , 0.5 ] x_i\in[0.1, 0.5] xi[0.1,0.5] x j ∈ [ 10 , 50 ] x_j\in[10, 50] xj[10,50],normalize使其同一值域。

prepare__for_train.py

"""Prepares the dataset for training"""

import numpy as np
from .normalize import normalize
from .generate_sinusoids import generate_sinusoids
from .generate_polynomials import generate_polynomials


def prepare_for_training(data, polynomial_degree=0, sinusoid_degree=0, normalize_data=True):

    # 计算样本总数
    num_examples = data.shape[0]

    data_processed = np.copy(data)

    # 预处理
    features_mean = 0
    features_deviation = 0
    data_normalized = data_processed
    if normalize_data:
        (
            data_normalized,
            features_mean,
            features_deviation
        ) = normalize(data_processed)

        data_processed = data_normalized

    # 特征变换sinusoidal
    if sinusoid_degree > 0:
        sinusoids = generate_sinusoids(data_normalized, sinusoid_degree)
        data_processed = np.concatenate((data_processed, sinusoids), axis=1)

    # 特征变换polynomial
    if polynomial_degree > 0:
        polynomials = generate_polynomials(data_normalized, polynomial_degree, normalize_data)
        data_processed = np.concatenate((data_processed, polynomials), axis=1)

    # 加一列1
    data_processed = np.hstack((np.ones((num_examples, 1)), data_processed))

    return data_processed, features_mean, features_deviation

linearRegressionClass.py

class LinearRegression_:

    def __init__(self, data, labels, polynomial_degree=0, sinusoid_degree=0, normalize_data=True):
        """
        1.对数据进行预处理操作
        2.先得到所有的特征个数
        3.初始化参数矩阵
        """
        (data_processed,
         features_mean,
         features_deviation) = prepare_for_training(data, polynomial_degree, sinusoid_degree, normalize_data=True)

        self.data = data_processed
        self.labels = labels
        self.features_mean = features_mean
        self.features_deviation = features_deviation
        self.polynomial_degree = polynomial_degree
        self.sinusoid_degree = sinusoid_degree
        self.normalize_data = normalize_data

        num_features = self.data.shape[1]
        self.theta = np.zeros((num_features, 1))

    def train(self, alpha=0.01, num_iterations=500):
        """
                    训练模块,执行梯度下降
        """
        cost_history = self.gradient_descent(alpha, num_iterations)
        return self.theta, cost_history

    def gradient_descent(self, alpha, num_iterations):
        """
                    实际迭代模块,会迭代num_iterations次
        """
        cost_history = []
        for _ in range(num_iterations):
            self.gradient_step(alpha)
            cost_history.append(self.cost_function(self.data, self.labels))
        return cost_history

    def gradient_step(self, alpha):
        """
                    梯度下降参数更新计算方法,注意是矩阵运算
        """
        num_examples = self.data.shape[0]
        prediction = LinearRegression_.hypothesis(self.data, self.theta)
        delta = prediction - self.labels
        theta = self.theta
        theta = theta - alpha * (1 / num_examples) * (np.dot(delta.T, self.data)).T
        self.theta = theta

    def cost_function(self, data, labels):
        """
                    损失计算方法
        """
        num_examples = data.shape[0]
        delta = LinearRegression_.hypothesis(self.data, self.theta) - labels
        cost = (1 / 2) * np.dot(delta.T, delta) / num_examples
        return cost[0][0]

    @staticmethod
    def hypothesis(data, theta):
        predictions = np.dot(data, theta)
        return predictions

    def get_cost(self, data, labels):
        data_processed = prepare_for_training(data,
                                              self.polynomial_degree,
                                              self.sinusoid_degree,
                                              self.normalize_data
                                              )[0]

        return self.cost_function(data_processed, labels)

    def predict(self, data):
        """
                    用训练的参数模型,与预测得到回归值结果
        """
        data_processed = prepare_for_training(data,
                                              self.polynomial_degree,
                                              self.sinusoid_degree,
                                              self.normalize_data
                                              )[0]

        predictions = LinearRegression_.hypothesis(data_processed, self.theta)

        return predictions

单输入变量线性回归
y = θ 1 x 1 + b y=\theta^1x^1+b y=θ1x1+b
single_variate_LinerRegression.py

import os
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from linearRegressionClass import *

dirname = os.path.dirname(__file__)
data = pd.read_csv(dirname + "/data/world-happiness-report-2017.csv", sep=',')
train_data = data.sample(frac=0.8)
test_data = data.drop(train_data.index)

# 选定考虑的特征
input_param_name = 'Economy..GDP.per.Capita.'
output_params_name = 'Happiness.Score'

x_train = train_data[[input_param_name]].values
y_train = train_data[[output_params_name]].values
x_test = test_data[[input_param_name]].values
y_test = test_data[[output_params_name]].values

# 用创建的随机样本测试
# 构造样本的函数
# def fun(x, slope, noise=1):
#     x = x.flatten()
#     y = slope*x + noise * np.random.randn(len(x))
#     return y

#     # 构造数据
# slope=2
# x_max = 10
# noise = 0.1
# x_train = np.arange(0,x_max,0.2).reshape((-1,1))
# y_train = fun(x_train, slope=slope, noise=noise)
# x_test = np.arange(x_max/2, x_max*3/2, 0.2).reshape((-1,1))
# y_test = fun(x_test, slope=slope, noise=noise)

#     #观察训练样本和测试样本
# # plt.scatter(x_train, y_train, label='train data', c='b')
# # plt.scatter(x_test, y_test, label='test data', c='k')
# # plt.legend()
# # plt.title('happiness - GDP')
# # plt.show()


#     #测试 - 与唐宇迪的对比
# lr = LinearRegression()
# lr.fit(x_train, y_train)
# print(lr.predict(x_test))
# print(y_test)

# y_train = y_train.reshape((-1,1))
# lr = LinearRegression_(x_train, y_train)
# lr.train()
# print(lr.predict(x_test))
# print(y_test)

lr = LinearRegression()
lr.fit(x_train, y_train, alpha=0.01, num_iters=500)
y_pre = lr.predict(x_test)
print("开始损失和结束损失", lr.cost_hist[0], lr.cost_hist[-1])
# iters-cost curve
# plt.plot(range(len(lr.cost_hist)), lr.cost_hist)
# plt.xlabel('Iter')
# plt.ylabel('cost')
# plt.title('GD')
# plt.show()
plt.scatter(x_train, y_train, label='Train data')
plt.scatter(x_test, y_test, label='test data')
plt.plot(x_test, y_pre, 'r', label='Prediction')
plt.xlabel(input_param_name)
plt.ylabel(output_params_name)
plt.title('Happy')
plt.legend()
plt.show()

在这里插入图片描述

在这里插入图片描述
多输入变量线性回归
y = ∑ i = 1 n θ i x i + b y=\sum_{i=1}^{n} \theta^ix^i+b y=i=1nθixi+b
非线性回归
1.对原始数据做非线性变换,如 x − > l n ( x ) x->ln(x) x>ln(x)
2.设置回归函数的复杂度最高 x n x^n xn

2.分类模型评估(Mnist实战SGD_Classifier)

2.1 K折交叉验证K-fold cross validation

①切分完训练集training和测试集testing后
②再对training进行均分为K份
③训练的迭代将进行K轮,每轮将其中K-1份作为training,1份作为验证机validation,边训练train边验证valid
④最后训练和验证的epoch结束了,再用测试集testing进行测试。
常用的K=5/10
在这里插入图片描述在这里插入图片描述

import numpy as np
import os
import matplotlib
import matplotlib.pyplot as plt

plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings

warnings.filterwarnings('ignore')
np.random.seed(42)

# from sklearn.datasets import fetch_openml
# mnist = fetch_openml('MNIST original')
# 也可以GitHub下载,手动加载
import scipy.io

mnist = scipy.io.loadmat('MNIST-original')
# 图像数据 (28x28x1)的灰度图,每张图像有784个像素点(=28x28x1)
# print(mnist)  # 字典key=data和label,数据存在对应的value中
X, y = mnist['data'], mnist['label']
# print(X.shape)  # data  784 x 70000,每列相当于一张图,共70000张图像
# print(y.shape)  # label 1 x 70000,共70000个标签


# 划分数据,训练集training,测试集testing,train取前60000,test取后10000
# 列切片
X_train, X_test, y_train, y_test = X[:, :60000], X[..., 60000:], y[:, :60000], y[..., 60000:]
# 训练集数据洗牌打乱
import numpy as np

X_train = np.random.permutation(X_train)
y_train = np.random.permutation(y_train)

# 因为后面要画混淆矩阵,最好是2分类任务:0-10的数字判断是不是5
# 将label变为true和false
y_train_5 = (y_train == 5)[0]
y_test_5 = (y_test == 5)[0]

# print(X_train.shape)
# print(y_train_5.shape)

X_train = X_train.T
X_test = X_test.T
# 创建线性模型SGDClassifier
from sklearn.linear_model import SGDClassifier

sgd_clf = SGDClassifier(max_iter=50, random_state=42)
# sgd_clf.fit(X_train, y_train_5)  # 训练
# print(sgd_clf.predict(X_test))

# K折交叉验证 划分训练集training,验证集validation,并训练

# 方法一:
from sklearn.model_selection import cross_val_score
kfold=5
acc=cross_val_score(sgd_clf, X_train, y_train_5, cv=kfold, scoring='accuracy')  ## cv是折数
avg_acc = sum(acc) / kfold
print("avg_acc=", avg_acc)
# 返回每折的acc:[0.87558333 0.95766667 0.86525 0.91483333 0.94425]


# 方法二
from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone  # K折中每折训练时,模型带有相同参数
kfold = 5
acc = []
skfold = StratifiedKFold(n_splits=kfold, random_state=42)
i = 1
for train_idx, test_idx in skfold.split(X_train, y_train_5):
    # 克隆模型
    clone_clf = clone(sgd_clf)

    # 划分训练集training和验证集validation
    X_train_folds = X_train[train_idx]
    X_val_folds = X_train[test_idx]
    y_train_folds = y_train_5[train_idx]
    y_val_folds = y_train_5[test_idx]
    # 模型训练
    clone_clf.fit(X_train_folds, y_train_folds)
    # 对每折进行预测,计算acc
    y_pred = clone_clf.predict(X_val_folds)
    n_correct = sum(y_pred == y_val_folds)
    acc.append(n_correct / len(y_pred))
    print("Split", i, "/", kfold, "Done.")
    i = i + 1
# 平均acc
avg_acc = sum(acc) / kfold
print("avg_acc=", avg_acc)

2.2 混淆矩阵Confusion Matrix

分类任务,下例对100人进行男女二分类,100中,模型检测有50人为男(实际全为男),50人为女(实际20为女 30为男)。
在这里插入图片描述
一个完美的分类是只有主对角线非0,其他都是0
n分类:混淆矩阵就是nxn
在这里插入图片描述
接上个代码

from sklearn.model_selection import cross_val_predict
# 60000个数据,进行5折交叉验证
# cross_val_predict返回每折预测的结果的concat,每折12000个结果,5折共60000个结果
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=kfold)
# 画混淆矩阵
from sklearn.metrics import confusion_matrix
confusion=confusion_matrix(y_train_5, y_train_pred)  # 传入train的标签和预测值
# 2分类的矩阵就是2x2的[[TN,FP],[FN,TP]]

plt.figure(figsize=(2, 2))  # 设置图片大小
# 1.热度图,后面是指定的颜色块,cmap可设置其他的不同颜色
plt.imshow(confusion, cmap=plt.cm.Blues)
plt.colorbar()  # 右边的colorbar
# 2.设置坐标轴显示列表
indices = range(len(confusion))
classes = ['5', 'not 5']
# 第一个是迭代对象,表示坐标的显示顺序,第二个参数是坐标轴显示列表
plt.xticks(indices, classes, rotation=45)  # 设置横坐标方向,rotation=45为45度倾斜
plt.yticks(indices, classes)
# 3.设置全局字体
# 在本例中,坐标轴刻度和图例均用新罗马字体['TimesNewRoman']来表示
# ['SimSun']宋体;['SimHei']黑体,有很多自己都可以设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 4.设置坐标轴标题、字体
# plt.ylabel('True label')
# plt.xlabel('Predicted label')
# plt.title('Confusion matrix')
plt.xlabel('预测值')
plt.ylabel('真实值')
plt.title('混淆矩阵', fontsize=12, fontfamily="SimHei")  # 可设置标题大小、字体
# 5.显示数据
normalize = False
fmt = '.2f' if normalize else 'd'
thresh = confusion.max() / 2.
for i in range(len(confusion)):  # 第几行
    for j in range(len(confusion[i])):  # 第几列
        plt.text(j, i, format(confusion[i][j], fmt),
                 fontsize=16,  # 矩阵字体大小
                 horizontalalignment="center",  # 水平居中。
                 verticalalignment="center",  # 垂直居中。
                 color="white" if confusion[i, j] > thresh else "black")
save_flg = True
# 6.保存图片
if save_flg:
    plt.savefig("confusion_matrix.png")
# 7.显示
plt.show()

2.3 准确率accuracy、精度precision、召回率recall、F1

sklearn.metrics中有对应的计算函数(y_train, y_train_pred)

准确率accurcy=预测正确个数/总样本数= T P + T N T P + T N + F P + F N \frac{TP+TN}{TP+TN+FP+FN} TP+TN+FP+FNTP+TN

精度precision= T P T P + F P \frac{TP}{TP+FP} TP+FPTP

召回率recall= T P T P + F N \frac{TP}{TP+FN} TP+FNTP

F1 Score= 2 ∗ T P 2 ∗ T P + F P + F N \frac{2*TP}{2*TP+FP+FN} 2TP+FP+FN2TP= 2 ∗ p r e c i s i o n ∗ r e c a l l p r e c i s i o n + r e c a l l \frac{2*precision*recall}{precision+recall} precision+recall2precisionrecall
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接上面代码

from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score
accuracy=accuracy_score(y_train_5,y_train_pred)
precision=precision_score(y_train_5,y_train_pred)
recall=recall_score(y_train_5,y_train_pred)
f1_score=f1_score(y_train_5,y_train_pred)
print("accuracy=",accuracy)
print("precision=",precision)
print("recall=",recall)
print("f1_score",f1_score)

2.4 置信度confidence

confidence:模型对分类预测结果正确的自信程度

y_scores=cross_val_predict(sgd_clf,X_train,y_train_5,kfold,method=‘decision_function’)方法返回每个输入数据的confidence,我们可以手动设置阈值t,对预测结果进行筛选,只有confidence_score>t,才视为预测正确。
在这里插入图片描述
precision, recall, threshholds = precision_recall_curve(y_train_5,y_scores)函数可以自动设置多个阈值,且每个阈值都对应计算一遍precision 和 recall
在这里插入图片描述
接上面代码

# 自动生成多个阈值,并计算precision, recall
y_scores = cross_val_predict(sgd_clf,X_train,y_train_5,kfold,method='decision_function')
from sklearn.metrics import precision_recall_curve
precision, recall, threshholds = precision_recall_curve(y_train_5,y_scores)

2.5 ROC曲线

分类任务可以画出ROC曲线:理想的分类器是逼近左上直角,即曲线下方ROC AUC面积接近1.
在这里插入图片描述在这里插入图片描述
接上面代码

# 分类任务,画ROC曲线
from sklearn.metrics import roc_curve
fpr,tpr,threshholds=roc_curve(y_train_5,y_scores)
def plot_roc_curve(fpr,tpr,label=None):
    plt.plot(fpr,tpr,linewidth=2,label=label)
    plt.plot([0,1],[0,1],'k--')
    plt.axis([0,1,0,1])
    plt.xlabel('False Positive Rate', fontsize=16)
    plt.ylabel('True Positive Rate', fontsize=16)
plt.figure(figsize=(8,6))
plot_roc_curve(fpr,tpr)
plt.show()

# 计算roc_auc面积
from sklearn.metrics import roc_auc_score
roc_auc_score=roc_auc_score(y_train_5,y_train_pred)

3.训练调参基本功(LinearRegression)

构建线性回归方程拟合数据点

3.1 线性回归模型实现

准备数据,预处理perprocess(标准化normalize),划分数据集(训练集train和测试集test),导包(sklearn或自己写的class),实例化LinearRegression,设置超参数(lr/eopch/batch…),是否制定learning策略(学习率衰减策略),权重参数初始化init_weight(随机初始化/迁移学习),训练(fit或自己写for迭代计算梯度更新参数),预测

3.2不同GD策略对比

在这里插入图片描述

3.3多项式曲线回归

3.4过拟合和欠拟合

3.5正则化作用

3.6EarlyStop提前停止

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

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

相关文章

1612_PC汇编语言_条件以及控制结构

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 这一次简单看看条件分支以及控制结构,感觉看完这部分之后,汇编的大部分框架已经有个差不多了。我的目的并不是成为汇编高手,因此…

数据处理——增删改

文章目录插入数据方式一:values方式2:将查询结果插入到表中更新数据删除数据MySQL8新特性:计算列综合案例插入数据 用INSERT插入数据 方式一:values 使用这种语法一次只能向表中插入一条数据。 情况1:为表的所有字段…

1月,不要跳槽

新年结束了,一些不满现状,被外界的“高薪”“好福利”吸引的人,一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的软件…

通信原理笔记—码间串扰与波形传输无失真的条件(奈奎斯特第一准则)

目录 波形传输的无失真条件: 码间串扰问题: 奈奎斯特第一准则: 在抽样判决时刻没有码间串扰的信号波形示例: 具有最窄频带的无码间串扰基带传输系统: 无码间串扰基带系统的主要参数: 一种典型的滚降…

golang中的图像image处理详解

常用的图像格式有png,jpeg,gif,对应的文件后缀为png,jpg,gif,当然文件的具体内容编码才能证明存放的是哪种文件,图像文件的头部都存储了具体标志,比如jpeg前缀\xffd8,png…

Redis实现消息队列

7、Redis消息队列 7.1 Redis消息队列-认识消息队列 什么是消息队列:字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色: 消息队列:存储和管理消息,也被称为消息代理(Message Broker)生产者&…

定位tcp连接或端口是属于哪个进程

首先要知道tcp连接的端口号,要么是本地端口号要是么remote端口号。有的端口号我们已知,有的端口号可以通过日志获取,也可以抓包获取,如然后是用netstat命令获取pidlinux下使用netstat -anpt(a是输出所有n是展示端口号&…

【✓基础算法 2.4】KMP(完结)

当模式串和主串的子串有不匹配时,便往后退一步,看是否能走通,如果不能,则进行退—— KMP 目录 一、KMP算法简介 二、手算求next数组 三、next数组实现代码 四、完整代码实现 1、java 2、c 一、KMP算法简介 当主串的子串…

软件测试刚入职,很茫然怎么办~

毕业后能直接到公司开始工作,是多少人都想要却得不到的机遇,你现在茫然无非是因为对软件测试是做什么的不了解,也不知道软件测试的职业规划到底是怎么样的~ 既然已经进入了公司,那就要珍惜机会,多学习,多问…

redis7 Cluster模式 集群

1.Redis集群模式介绍 Cluster模式是Redis3.0开始推出的Redis Cluster属于AP模型采用无中心结构,每个节点保存数据和整个集群状态, 每个节点都和其他所有节点连接官方要求:至少6个节点才可以保证高可用,即3主3从;扩展性强、更好做到…

[GUET-CTF2019]re

于尘世中携一支笔,绘春风十里。 1.查壳 64bit加了UPX壳 2.使用Kali Linux脱壳 re脱壳3.静态分析 shift加F12打开string窗口 发现可疑字符,点击跟进 光标放在aCorrect,点击快捷键X查看引用这个字符串的地方 点击跟进 按下F5反编译 将函数重命…

为什么AI爆炸式增长会对元宇宙产生巨大影响

欢迎来到Hubbleverse 🌍 关注我们 关注宇宙新鲜事 📌 预计阅读时长:9分钟 本文仅代表作者个人观点,不代表平台意见,不构成投资建议。 想想你梦想中的房子。也许它有高高的拱形天花板、温暖的壁炉和宽阔的窗户&…

Allegro如何打开丝印位号的飞线操作指导

Allegro如何打开丝印位号的飞线操作指导 用Allegro做PCB设计的时候,移动器件的位号,会有根飞线实时提示位号是属于哪个器件的,如下图 但是只有在临时移动丝印位号的时候才会显示飞线,如何让所有的器件位号的全部显示,具体操作如下 选择Setup选择User Preferences

如何通过Zabbix Docker配置HTTPS访问系统?

概述 前面文章曾介绍过如果使用docker-compose快速部署一个Zabbix系统,但是部署的Zabbix系统是使用http协议进行访问的。有时候为了保证安全。我们需要配置使用https协议进行访问。 下面就讲述如何使用自签名的ssl证书配置https访问。(注:若是…

开发者对抗软件创新焦虑的“180 法则” | 对话MongoDB CTO Mark Porter

在 MongoDB 首席技术官 Mark Porter 看来,创新滞后并不是因为公司缺乏灵感或创造力,而是因为他们被迫将时间花费在维护传统框架上,导致数据相关工作举步维艰,这是大多数组织都存在的问题。那么,对于企业而言&#xff0…

千姿百态,瞬息万变,Win11系统NeoVim打造全能/全栈编辑器(前端/Css/Js/Vue/Golang/Ruby/ChatGpt)

我曾经多次向人推荐Vim,其热情程度有些类似现在卖保险的,有的时候,人们会因为一些弥足珍贵的美好暗暗渴望一个巨大的负面,比如因为想重温手动挡的快乐而渴望买下一辆二十万公里的老爷车,比如因为所谓完美的音质而舍不得…

xxl-sso知识点

1、哈希环算法: 通过将数据分配到一个环形的哈希表上来实现数据的分布,根据环上的顺序依次进行分配。 对于数据敏感的服务不能用取余hash来实现,当新增节点时之前按照取余hash放的数据在新增节点之后在相应的节点找不到数据,而哈…

“华为杯”研究生数学建模竞赛2005年-【华为杯】B题:空中加油

赛题描述 对飞行中的飞机进行空中加油,可以大大提高飞机的直航能力。为了简化问题,便于讨论,我们作如下假设。 少辅机架数两种情况给出你的作战方案。 解题思路 摘要: 本文讨论了在辅机只能一次起飞和可以多次起飞情况下,辅机数量与主机 最大作战半径的关系,给出了只…

【前端工程化】一.前端工程化;二.使用webpack打包vue项目;三.在webstorm中安装vite插件,通过vite构建工具创建vue项目

目录 一.前端工程化 1.webpack (1)定义:是一个前端的构建工具。前端代码格式多(html、css、js、图片),前端构建工具的作用是将各种格式不同文件打包到一起,方便项目的上线运行。(将…

60 k8s集群中container监控指标有label但是没有value

k8s集群中container监控指标有label但是没有value 1、现象 无法获取到以下label的值:container, image, pod, name 集群刚搭建完的时候一切都是正常的,后来运行一段时间后就缺这缺那的。 2、原因排查 由于这些指标是kubelet上报的,因此看了对应节点上kubelet的日志,发现…