Python深度学习基于Tensorflow(5)机器学习基础

文章目录

      • 监督学习
        • 线性回归
        • 逻辑回归
        • 决策树
        • 支持向量机
        • 朴素贝叶斯
      • 集成学习
        • Bagging
        • Boosting
      • 无监督学习
        • 主成分分析
        • KMeans聚类
      • 缺失值和分类数据处理
        • 处理缺失数据
        • 分类数据转化为OneHot编码
      • 葡萄酒数据集示例

机器学习的流程如下所示:

![[Pasted image 20240507152730.png]]

具体又可以分为以下五个步骤:

  1. 明确目标:在机器学习项目中,首先需要明确业务目标和机器学习目标。业务目标是指希望机器学习模型能够帮助实现的具体业务需求,例如提高销售额、降低风险等。机器学习目标则是指需要通过机器学习模型来解决的具体问题,例如分类、回归、聚类等。在明确了目标之后,需要根据目标来选择适当的机器学习任务和评估指标。
  2. 收集数据:在明确了目标之后,需要收集相关的数据用于机器学习模型的训练和测试。数据可以来自于各种来源,例如数据库、文本文件、网页等。在收集数据时,需要确保数据的质量和量,同时也需要考虑数据的可用性和合法性。
  3. 数据探索和数据预处理:在收集到数据之后,需要对数据进行探索和预处理。数据探索是指通过统计学和可视化等手段对数据进行分析,了解数据的特点和规律。数据预处理是指对数据进行清洗、转换、降维等操作,使其满足机器学习模型的要求。在这一步骤中,还需要对数据进行分割,将其分为训练集、验证集和测试集。
  4. 模型选择:在数据预处理之后,需要选择适合的机器学习模型来解决具体的问题。模型选择需要考虑多方面的因素,例如模型的复杂度、训练时间、预测精度等。在选择模型时,还需要考虑模型的可解释性和可扩展性。
  5. 模型评估:在选择好模型之后,需要对模型进行评估,以确定其在实际应用中的表现。模型评估需要使用适当的评估指标,例如准确率、精确率、召回率等。在评估模型时,还需要考虑模型的泛化能力和鲁棒性。通过对模型进行评估,可以进一步优化模型,提高其预测精度和可靠性。一般使用K折交叉验证来评估模型

根据问题类型选择损失函数

问题类型损失函数评估指标
回归模型MSEMSE,MAE
SVMhingeAccuracy,Precision,Recall
二分类模型BinaryCrossentropyAccuracy,Precision,Recall
多分类模型CategoricalCrossentropyTopKCategoricalCrossentropy

监督学习

监督学习通俗来讲指的就是有y的数据集

线性回归

线性回归是最简单,最普通的一种做法, 机器学习中的线性回归非常简单和粗暴,不同于统计模型中有各个变量的P值什么的,机器学习中的线性回归只有一个 parameters 还有一个 score

线性回归公式非常简单: f ( x ) = w 1 x 1 + w 2 x 3 + ⋯ + w n x n + b f(x)=w_1x_1+w_2x_3+\dots+w_nx_n+b f(x)=w1x1+w2x3++wnxn+b

在sklearn导入:from sklearn.linear_model import LinearRegression

from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression## 这里使用 make_regression 创建回归数据集
X, y = make_regression(n_samples=1000, n_features=10, bias=1.2,  noise=10)## 因为这里添加了bias,所以会有常数项,而LinearRegression默认包含常数项的 fit_intercept=True
linear_model = LinearRegression(fit_intercept=True)## 训练
linear_model.fit(X, y)## 得到模型的系数和常数
linear_model.coef_, linear_model.intercept_

要深入探究线性回归,可以对普通的loss做一些变换,得到不同的线性回归模型:RidgeLassoElasticNet

首先是 L 1 L_1 L1惩罚: L 1 ( w ) = ∣ ∣ w ∣ ∣ 1 = ∑ ∣ w i ∣ L_1(w) = ||w||_1=\sum|w_i| L1(w)=∣∣w1=wi
其次是 L 2 L_2 L2惩罚: L 2 ( w ) = ∣ ∣ w ∣ ∣ 2 = ∑ w i 2 L_2(w)=||w||_2=\sum w_i^2 L2(w)=∣∣w2=wi2
Ridge的loss L = ∑ ( f ( x i ) − y i ) 2 + α L 1 ( w 2 ) \mathcal{L}=\sum (f(x_i)-y_i)^2 + \alpha L_1(w_2) L=(f(xi)yi)2+αL1(w2)

Lasso的loss L = ∑ ( f ( x i ) − y i ) 2 + α L 1 ( w 1 ) \mathcal{L}=\sum (f(x_i)-y_i)^2 + \alpha L_1(w_1) L=(f(xi)yi)2+αL1(w1)

ElasticNet的loss L = ∑ ( f ( x i ) − y i ) 2 + α L 1 ( w ) + β L 2 ( w ) \mathcal{L}=\sum (f(x_i)-y_i)^2 + \alpha L_1(w) + \beta L_2(w) L=(f(xi)yi)2+αL1(w)+βL2(w)
这里统计学的书籍会具体讲一下适用于哪些数据特征的模型,从损失函数中可以看到,主要是为了防止过拟合问题

逻辑回归

逻辑回归是用来处理二分类问题的模型,类似的模型还有Probit模型,不同的是逻辑回归使用sigmoid函数来处理概率,而Probit使用正态分布累计密度函数来处理概率模型。

sigmoid函数如下: f ( z ) = 1 1 + e − z f(z)=\frac{1}{1+e^{-z}} f(z)=1+ez1
正态分布累计密度如下: f ( z ) = 1 2 π ∫ − ∞ z e − t 2 2 d t f(z)=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^ze^{-\frac{t^2}{2}}dt f(z)=2π 1ze2t2dt

很明显,两个模型都是把值映射在0-1范围内,但prob涉及到积分,导致运算速度不如逻辑回归,所以逻辑回归更为通用。这里的 z z z 相当于线性回归中的 y y y 值。

这里loss涉及到了一种类似于期望处理方法,如下表所示:

loss l a b e l t r u e = 0 label_{true}=0 labeltrue=0 l a b e l t r u e = 1 label_{true}=1 labeltrue=1
l a b e l p r e d = 0 label_{pred}=0 labelpred=00 α \alpha α
l a b e l p r e d = 1 label_{pred}=1 labelpred=1 β \beta β0

由条件概率可得:

P ( l a b e l p r e d = 0 ) = P ( l a b e l p r e d = 0 ∣ l a b e l t r u e = 0 ) P ( l a b e l t r u e = 0 ) + P ( l a b e l p r e d = 0 ∣ l a b e l t r u e = 1 ) P ( l a b e l t r u e = 1 ) P(label_{pred}=0)=P(label_{pred}=0|label_{true}=0)P(label_{true}=0) + P(label_{pred}=0|label_{true}=1)P(label_{true}=1) P(labelpred=0)=P(labelpred=0∣labeltrue=0)P(labeltrue=0)+P(labelpred=0∣labeltrue=1)P(labeltrue=1)

由于 P ( l a b e l t r u e = 0 ) P(label_{true}=0) P(labeltrue=0) P ( l a b e l t r u e = 1 ) P(label_{true}=1) P(labeltrue=1)只能等于 0,1,并且是已知的;所以 P ( l a b e l p r e d = 0 ) = P ( l a b e l p r e d = 0 ∣ l a b e l t r u e = 0 ) P(label_{pred}=0)=P(label_{pred}=0|label_{true}=0) P(labelpred=0)=P(labelpred=0∣labeltrue=0),或者 P ( l a b e l p r e d = 0 ) = P ( l a b e l p r e d = 0 ∣ l a b e l t r u e = 1 ) P(label_{pred}=0)=P(label_{pred}=0|label_{true}=1) P(labelpred=0)=P(labelpred=0∣labeltrue=1);同理 P ( l a b e l p r e d = 1 ) = P ( l a b e l p r e d = 1 ∣ l a b e l t r u e = 0 ) P(label_{pred}=1)=P(label_{pred}=1|label_{true}=0) P(labelpred=1)=P(labelpred=1∣labeltrue=0),或者 P ( l a b e l p r e d = 1 ) = P ( l a b e l p r e d = 1 ∣ l a b e l t r u e = 1 ) P(label_{pred}=1)=P(label_{pred}=1|label_{true}=1) P(labelpred=1)=P(labelpred=1∣labeltrue=1)

L = α P ( l a b e l p r e d = 0 ∣ l a b e l t r u e = 1 ) P ( l a b e l t r u e = 1 ) + β P ( l a b e l p r e d = 1 ∣ l a b e l t r u e = 0 ) P ( l a b e l t r u e = 0 ) = α [ 1 − P ( l a b e l p r e d = 0 ∣ l a b e l t r u e = 1 ) ] [ 1 − P ( l a b e l t r u e = 0 ) ] + β P ( l a b e l p r e d = 1 ∣ l a b e l t r u e = 0 ) P ( l a b e l t r u e = 0 ) = α ( 1 − y ) ( 1 − p ( x ) ) + β y p ( x ) \begin{align} \mathcal{L} &= \alpha P(label_{pred}=0|label_{true}=1)P(label_{true}=1) + \beta P(label_{pred}=1|label_{true}=0)P(label_{true}=0) \\ &=\alpha [1-P(label_{pred}=0|label_{true}=1)][1-P(label_{true}=0)] + \beta P(label_{pred}=1|label_{true}=0)P(label_{true}=0) \\ &= \alpha (1-y)(1-p(x)) + \beta yp(x) \end{align} L=αP(labelpred=0∣labeltrue=1)P(labeltrue=1)+βP(labelpred=1∣labeltrue=0)P(labeltrue=0)=α[1P(labelpred=0∣labeltrue=1)][1P(labeltrue=0)]+βP(labelpred=1∣labeltrue=0)P(labeltrue=0)=α(1y)(1p(x))+βyp(x)

很明显,当 α \alpha α β \beta β 相等且为1的时候,惩罚为 L = ∑ y i p ( x i ) + ( 1 − y i ) p ( x i ) \mathcal{L}=\sum y_ip(x_i) +(1-y_i)p(x_i) L=yip(xi)+(1yi)p(xi)
以上的公式很出名,但是在实际应用中,把这一类分为另一类,和把另一类分为这一类的损失是不同的,所以根据情况自定义;

在sklearn导入:from sklearn.linear_model import LogisticRegression

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification## 这里使用 make_classification 创建分类数据集
X, y = make_classification(n_samples=1000, n_features=10, n_classes=2)## 建立模型
log_reg = LogisticRegression()## 模型训练
log_reg.fit(X, y)## 得到模型的系数和常数
log_reg.intercept_, log_reg.coef_
决策树

决策树有三种出名的算法:ID3,C4.5,CART 太多了,详细可以看周志华老师的机器学习介绍,这里做一下代码使用实例

![[Pasted image 20240507214917.png]]

利用决策树来解决回归

from sklearn.datasets import load_diabetes
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor## 导入数据
X, y = load_diabetes(return_X_y=True)## 选择模型
regressor = DecisionTreeRegressor(random_state=0)## 训练并使用交叉验证打分
cross_val_score(regressor, X, y, cv=10)

利用决策树来解决分类

from sklearn.datasets import load_diabetes
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeRegressor## 导入数据
X, y = load_iris(return_X_y=True)## 选择模型
clf = DecisionTreeClassifier(random_state=0)## 训练并使用交叉验证打分
cross_val_score(clf, X, y, cv=10)
支持向量机

支持向量分类的核心思想:找一个超平面把两类数据尽可能给分割开来
支持向量回归的核心思想:找两个平行的超平面把数据尽可能靠拢

![[Pasted image 20240507215503.png]]

SVR

from sklearn.svm import SVR
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
import numpy as npn_samples, n_features = 10, 5rng = np.random.RandomState(0)
y = rng.randn(n_samples)
X = rng.randn(n_samples, n_features)regr = make_pipeline(StandardScaler(), SVR(C=1.0, epsilon=0.2))
regr.fit(X, y)

SVC

from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
import numpy as npX = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])clf = make_pipeline(StandardScaler(), SVC(gamma='auto'))
clf.fit(X, y)
朴素贝叶斯

朴素贝叶斯假设:属性条件独立,其核心思想 p ( c ∣ x ) = p ( x ∣ c ) p ( c ) p ( x ) p(c|x)=\frac{p(x|c)p(c)}{p(x)} p(cx)=p(x)p(xc)p(c)
其中 c c c 表示类别,利用计算 p ( x ∣ c ) p ( c ) p(x|c)p(c) p(xc)p(c) 的方式去计算 p ( c ∣ x ) p(c|x) p(cx) ,这里的 p ( x ) p(x) p(x) 由于做比较就可以忽略;

由于属性条件独立,有 p ( x ∣ c ) = p ( ( x 1 , x 2 , … , x m ) ∣ c ) = ∏ p ( x i ∣ c ) p(x|c)=p((x_1,x_2,\dots,x_m)|c)=\prod p(x_i|c) p(xc)=p((x1,x2,,xm)c)=p(xic)
最后判别类别有: a r g m a x p ( c ) ∏ p ( x i ∣ c ) argmax \ \ p(c)\prod p(x_i|c) argmax  p(c)p(xic)

import numpy as np
from sklearn.naive_bayes import CategoricalNBrng = np.random.RandomState(1)
X = rng.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])clf = CategoricalNB()
clf.fit(X, y)

集成学习

集成学习思想类似于:三个臭皮匠顶一个诸葛亮通过总结不同模型的输出结果得到一个最终的结果

集成学习有两种典型的算法:装袋算法(Bagging) 和 提升分类器(Boosting)

Boosting:个体学习器之间存在强依赖关系,必须串行生成的序列化方法。

Bagging:个体学习器之间存在弱依赖关系,可同时生成的并行化方法。

Bagging
  1. 采样:从原始数据集中,使用Bootstrap方法进行有放回的抽样,生成新的训练子集。这意味着每个子集都是通过随机选择原始数据集中的样本而创建的,且一个样本在一次抽样中可以被重复选中多次,而有些样本可能一次都不会被选中。通常,这些子集的大小与原始数据集相同。
  2. 训练:对于每一个由Bootstrap生成的子集,使用一个基础学习算法(如决策树、线性回归等)独立地训练一个模型。由于各个子集之间是独立的,这些模型的训练过程可以并行进行。
  3. 预测: 对于分类任务,所有模型的预测结果将通过投票的方式汇总,即每个模型对测试样本的预测类别进行投票,最终得票最多的类别作为Bagging集成的预测结果。对于回归任务,所有模型的预测值将被简单平均(或加权平均),以得到最终的预测值。

Bagging通过结合多个模型的预测来减少单一模型可能引入的方差,从而提高整体模型的稳定性和泛化能力。这种方法特别有效于那些具有高方差的学习算法。通过上述步骤,Bagging能够有效地减少模型的过拟合风险,并在很多情况下显著提升模型的性能。随机森林(Random Forest)是Bagging思想的一个典型应用,它在构建决策树时不仅使用Bootstrap采样,还加入了特征随机选择的机制,进一步增强了模型的多样性与泛化能力。

Boosting
  1. 先从初始训练集训练处一个基学习器;
  2. 再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的样本在后续受到更多的关注;
  3. 基于调整后的样本分布来训练下一个基学习器;
  4. 一直重复上述步骤,直到基学习器的个数达到train前的指定数T,然后将这T个基学习器进行加权;

![[无标题.png]]

基于Boosting思想的算法主要有:AdaBoost,GBDT,XGBoost

无监督学习

主成分分析

主成分分析 PCA 是一种降维的算法,还有一种叫 TSNE

PCA的基本思想是通过旋转的方式,把轴转换到方差最大的方向,然后选取方差大小前面的几个轴

import numpy as np
from sklearn.decomposition import PCAX = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
pca.fit(X)
KMeans聚类
from sklearn.cluster import KMeans
import numpy as npX = np.array([[1, 2], [1, 4], [1, 0],[10, 2], [10, 4], [10, 0]])
kmeans = KMeans(n_clusters=2, random_state=0, n_init="auto").fit(X)## 查看x对应的label
kmeans.labels_

当数据量较大时,可以使用 MiniBatchKMeans 进行计算,这样不用带入所有数据

缺失值和分类数据处理

处理缺失数据

处理缺失数据主要在sklearn.impute这个包内,impute.SimpleImputer,impute.IterativeImputer,impute.MissingIndicator,impute.KNNImputer

import pandas as pd
from io import StringIO
import numpy as  np
from sklearn.impute import SimpleImputercsv_data = '''A,B,C,D
1.0,2.0,3.0,4.0
5.0,6.0,,8.0
10.0,11.0,12.0,'''## 读取数据
df = pd.read_csv(StringIO(csv_data))## 观察每一列的缺失值数量
df.isnull().sum()## 缺失值使用均值填充
imr = SimpleImputer(missing_values=np.nan, strategy='mean')
imputed_data = imr.fit_transform(df)
imputed_data
分类数据转化为OneHot编码
import pandas as pd
df = pd.DataFrame([['green', 'M', 10.1, 'class1'], ['red', 'L', 13.5, 'class2'], ['blue', 'XL', 15.3, 'class1']])df.columns = ['颜色', '型号', '价格', '类别']size_mapping = {'XL': 3,'L': 2,'M': 1}df['型号'] = df['型号'].map(size_mapping)## 获取OneHot编码
pd.get_dummies(df[['价格', '颜色', '型号', '类别']], drop_first=True)

get_dummies 函数会把所有的字符变量都变成OneHot编码,但是很明显,n个维度只能有n-1个编码,否则会造成多重共线性,不可取,所以一般要使用 drop_first

葡萄酒数据集示例

准备数据,这里使用 sklearn.datasets 中的 wine 数据集

import pandas as pd
import numpy as np
from sklearn.datasets import load_winedata = load_wine()
X, y, feature_names = data['data'], data['target'], data['feature_names']
df_wine = pd.DataFrame(np.c_[X, y], columns=feature_names + ['class'])

切分训练集和测试集,标准化

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)stdsc = StandardScaler()
X_train_std = stdsc.fit_transform(X_train)
X_test_std = stdsc.transform(X_test)

这里使用逻辑回归尝试做一个模型,发现效果还不错,这里的C是惩罚系数的倒数

from sklearn.linear_model import LogisticRegressionlr = LogisticRegression(penalty='l1', C=0.1,solver='liblinear')
lr.fit(X_train_std, y_train)
print('Training accuracy:', lr.score(X_train_std, y_train))
print('Test accuracy:', lr.score(X_test_std, y_test))# Training accuracy: 0.9838709677419355
# Test accuracy: 0.9814814814814815

接着通过更改惩罚系数,观察逻辑回归模型参数的变化过程

weights, params = [], []
for c in np.arange(-4, 6):lr = LogisticRegression(penalty='l1', C=10.**c, solver='liblinear')lr.fit(X_train_std, y_train)weights.append(lr.coef_[1])params.append(10.**c)weights = np.array(weights)

画图,由于x轴是对数距离,所以需要放缩 plt.xscale('log')

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False fig = plt.figure()
ax = plt.subplot(111)colors = ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'black', 'pink', 'lightgreen', 'lightblue', 'gray', 'indigo', 'orange']for column, color in zip(range(weights.shape[1]), colors):plt.plot(params, weights[:, column], label=df_wine.columns[column+1], color=color)## 在y=0上画一根--
plt.axhline(0, color='black', linestyle='--', linewidth=3)## 限制x轴为[10^-5, 10^5]
plt.xlim([10**(-5), 10**5])plt.ylabel('权重系数')
plt.xlabel('C')## !!! x轴的距离使用对数距离
plt.xscale('log')## 设置pic的legend
plt.legend(loc='upper left')
ax.legend(loc='upper center', bbox_to_anchor=(1.38, 1.03),ncol=1, fancybox=True)

在这里插入图片描述

最后进行特征选择,分值的方式有两种:AICBIC;选择的方式有三种: 前向选择后向选择以及逐步选择。这里是根据score的分值,使用后向选择的方式对变量进行剔除。

from sklearn.base import clone
from itertools import combinations
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_scoreclass SBS():def __init__(self, estimator, k_features, scoring=accuracy_score,test_size=0.25, random_state=1):self.scoring = scoringself.estimator = clone(estimator)self.k_features = k_featuresself.test_size = test_sizeself.random_state = random_statedef fit(self, X, y):X_train, X_test, y_train, y_test = \train_test_split(X, y, test_size=self.test_size, random_state=self.random_state)dim = X_train.shape[1]self.indices_ = tuple(range(dim))self.subsets_ = [self.indices_]score = self._calc_score(X_train, y_train, X_test, y_test, self.indices_)self.scores_ = [score]while dim > self.k_features:scores = []subsets = []for p in combinations(self.indices_, r=dim-1):score = self._calc_score(X_train, y_train, X_test, y_test, p)scores.append(score)subsets.append(p)best = np.argmax(scores)self.indices_ = subsets[best]self.subsets_.append(self.indices_)dim -= 1self.scores_.append(scores[best])self.k_score_ = self.scores_[-1]return selfdef transform(self, X):return X[:, self.indices_]def _calc_score(self, X_train, y_train, X_test, y_test, indices):self.estimator.fit(X_train[:, indices], y_train)y_pred = self.estimator.predict(X_test[:, indices])score = self.scoring(y_test, y_pred)return score

接着使用KNN模型作为分类器

from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as pltknn = KNeighborsClassifier(n_neighbors=2)# 选择特征
sbs = SBS(knn, k_features=1)
sbs.fit(X_train_std, y_train)# 可视化特征子集的性能
k_feat = [len(k) for k in sbs.subsets_]plt.plot(k_feat, sbs.scores_, marker='o')
plt.ylim([0.7, 1.1])
plt.ylabel('Accuracy')
plt.xlabel('Number of features')
plt.grid()
plt.tight_layout()
plt.show()

得到结果:

![[Pasted image 20240508000139.png]]

使用随机森林获取特征重要性

from sklearn.ensemble import RandomForestClassifierfeat_labels = feature_namesforest = RandomForestClassifier(n_estimators=1000,random_state=0,n_jobs=-1)forest.fit(X_train, y_train)
importances = forest.feature_importances_indices = np.argsort(importances)[::-1]plt.title('Feature Importances')
plt.bar(range(X_train.shape[1]), importances[indices],color='lightblue', align='center')plt.xticks(range(X_train.shape[1]), feat_labels, rotation=90)
plt.xlim([-1, X_train.shape[1]])
plt.tight_layout()
plt.show()

![[Pasted image 20240508000341.png]]

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

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

相关文章

精通Python(基础篇)pip命令大全(非常详细)零基础入门到精通,收藏这一篇就够了

一、pip介绍 1、pip是什么? 嘿!你知道吗?pip 就像是 Python 的“快递小哥”,它负责帮你安装和管理那些不属于 Python 标准库的软件包。它就像是一个方便的工具,让你可以轻松地获取你需要的软件包,就像是在…

活动预告 | MVP 聚技站 - 低代码 AI 时代(一):初识 Power BI

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun MVP 聚技站 系列 微软最有价值专家推出“MVP 聚技站”系列主题专栏,邀请多位微软最有价值专家,针对初学者、开发者感兴趣的技术话题,带来专业的技术课程讲解与实践经验…

SpringBoot中这样用ObjectMapper

每次new一个单例化个性化配置小结 你要说他有问题吧,确实能正常执行;可你要说没问题吧,在追求性能的同学眼里,这属实算是十恶不赦的代码了。 首先,让我们用JMH对这段代码做一个基准测试,让大家对其性能有个…

Leetcode—2079. 给植物浇水【中等】

2024每日刷题&#xff08;130&#xff09; Leetcode—2079. 给植物浇水 实现代码 class Solution { public:int wateringPlants(vector<int>& plants, int capacity) {int ans 0;int step 0;int cap capacity;bool flag false;for(int i 0; i < plants.siz…

用C#打造精美系统托盘消息提醒,让你的应用更具魅力

使用效果&#xff1a; 代码&#xff1a; #region 消息框变量private Timer fadeTimer; // 定义计时器private int fadeSpeed 2;//淡出速度private NotifyIcon notifyIcon;//气泡通知private int opacityLevel 10;//不透明度public enum NotificationType{Error,//错误Warning…

WIFI模块UDP电脑端调试

一&#xff0c;两端都是电脑端 1&#xff0c;电脑本机的IP地址 192.168.137.1 2&#xff0c;新建两个不同的连接&#xff0c;注意端口 二&#xff0c;WIFI 模块和电脑端连接 1&#xff0c;设置模块端目标IP和端口&#xff0c;电脑端只接收数据的话&#xff0c;IP、端口可随…

【多客开源】游戏陪玩系统,游戏陪玩源码,游戏陪玩语音社交源码运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

介绍 我们针对陪玩app源码市场的发展趋势&#xff0c;整合市面上主流陪玩app应用功能&#xff0c;自主开发了多客陪玩系统源码&#xff0c;并可为客户提供全部原生陪玩源码&#xff0c;进行二次开发&#xff0c;打造适用于线上游戏陪玩、语音聊天、心理咨询、情感陪伴等业务场…

Vue 中 $nextTick 的作用是什么?

目录 一、NextTick是什么 为什么要有nexttick 二、使用场景 三、实现原理 一、NextTick是什么 官方对其的定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM 什么意思呢&#xff1f; 我们可以理解成&#xff0c…

电动车违规停放监测摄像机

随着电动车的普及和城市交通拥堵问题的加剧&#xff0c;电动车的停放管理也成为一个亟待解决的难题。为了维护城市交通秩序和提高停车效率&#xff0c;一种名为电动车违规停放监测摄像机应运而生&#xff0c;成为城市管理的利器。这种电动车违规停放监测摄像机&#xff0c;利用…

Tcl学习笔记(四)——流程控制、过程、命名空间、访问文件

1. 流程控制 if命令 if命令后跟两个参数&#xff1a;表达式、待执行的Tcl脚本。if命令中的每一个左大括号都必须与它前一个字符同行。 有elseif和else可选子句&#xff0c;使用时与if中第二个参数的右大括号放在同一行。 switch命令 switch命令利用一个给定值与多个模式进行匹…

Py脚本_文件分类

最近发现通过Edge和chrome或者其他浏览器下载的文件都存放在一个地方就很繁琐&#xff0c;于是翻找以前的脚本来归纳这些文件&#xff0c;虽然有IDM下载独有会自动分类&#xff0c;但是相信很多同学都在一个文件里找文件&#xff0c;这次就写个Py脚本来实现这个功能。 # -*- c…

无人零售,重塑购物新纪元

在这个快节奏的时代&#xff0c;科技的每一次跃进都在悄无声息地改变着我们的生活方式。而今&#xff0c;无人零售正以雷霆之势&#xff0c;颠覆传统购物模式&#xff0c;为我们带来前所未有的便捷与智能体验。想知道无人零售如何彻底改变我们的购物方式吗&#xff1f;跟随我&a…

西安银行效益口碑双降:不良率连增,新董事长梁邦海能否救火?

撰稿|行星 来源|贝多财经 近日&#xff0c;西安银行&#xff08;SH:600928&#xff09;方面终于传来了新任掌门人的音讯。该行在2023年财报中正式宣布&#xff0c;董事会选举梁邦海为董事长&#xff0c;在监管部门核准梁邦海的任职资格后&#xff0c;梁邦海将不再担任该行行长…

【Java基础】Maven继承

1. 前言 Maven 在设计时&#xff0c;借鉴了 Java 面向对象中的继承思想&#xff0c;提出了 POM 继承思想。 2. Maven继承 当一个项目包含多个模块时&#xff0c;可以在该项目中再创建一个父模块&#xff0c;并在其 POM 中声明依赖&#xff0c;其他模块的 POM 可通过继承父模…

【源码】[完美接单]亲测双端获取通讯录、相册、短信定位源码

源码介绍 无hb源码&#xff0c;需要反编译。 此款修复了逻辑&#xff0c;现在全部能获取。包括华为鸿蒙。 安卓可获取&#xff1a;短信定位相册通讯录 IOS可获取&#xff1a;定位相册通讯录 源码截图 CD&#xff1a;获取方式联系小编 微信&#xff1a;uucodes 公众号&…

[C++核心编程-04]----C++类和对象之封装

目录 引言 正文 01-类和对象简介 02-封装简介 03-封装的意义 04-封装案例之设计学生类 05-封装的权限控制 06-struct和class的区别 总结 引言 在C中&#xff0c;类和对象是面向对象编程的基本概念&#xff0c;而封装则是面向对象编程的三大特征之一&a…

FastStone Capture 简介与常规用法

FastStone Capture 是一款功能强大的屏幕截图和视频录制软件&#xff0c;它提供了多种捕捉模式&#xff0c;包括全屏、窗口、对象、矩形区域、自由手绘区域等。除了基本的截图功能&#xff0c;FastStone Capture 还支持图像编辑、滚动截图、屏幕录像、颜色拾取、屏幕放大等高级…

【k8s多集群管理平台开发实践】十一、client-go实现读取k8s的事件信息

文章目录 简介 一.k8s读取k8s事件1.1.controllers控制器代码1.2.models模型代码 二.路由设置2.1.路由设置 三.前端代码5.1.列表部分html代码 四.完整代码4.1.控制器event.go的完整代码4.2.模型eventModel.go的完整代码 五.效果图 简介 本章节主要讲解通过client-go实现读取k8s事…

2023年度合肥市优秀知识产权服务机构评选申报主体条件、材料和时间程序须知

一、申报主体 在合肥市行政区域内登记注册的知识产权服务机构&#xff0c; 二、申报条件 (一)在合肥市登记注册时间满1年&#xff0c;营业执照经营范围包含知识产权代理、服务等相关内容; (二)在全国专利代理信息公示平台进行备案; (三)有稳定的专业服务人才队伍和服务对象…

21物联1班常用网络扫描

网络扫描 1.网络扫描概述2.网络扫描步骤及分类具体步骤 1.网络扫描概述 网络安全扫描技术是一种基于Internet远程检测目标网络或本地主机安全性脆弱点的技术。通过网络安全扫描&#xff0c;系统管理员能够发现所维护的Web服务器的各种TCP/IP端口的分配、开放的服务、Web服务软件…