基于传统机器学习模型算法的项目开发详细过程

news2024/11/19 18:38:27

1 场景分析

1.1 项目背景

描述开发项目模型的一系列情境和因素,包括问题、需求、机会、市场环境、竞争情况等

1.2. 解决问题

传统机器学习在解决实际问题中主要分为两类:

  • 有监督学习:已知输入、输出之间的关系而进行的学习,从而产生一个能够对已知输入给出合适输出的模型。这些算法在图像分类、语音识别、自然语言处理、推荐系统等领域有着广泛的应用
  • 无监督学习:已知输入,无输出结果而进行的学习,发现数据中的潜在特征和规律而训练的模型。这些算法在数据挖掘、图像处理、自然语言处理等领域有着广泛的应用

传统机器学习达到的目的主要分为两类

  • 分析影响结果的主要因素
  • 充分必要条件下预测结果

传统机器学习算法在实际开发中主要分两类

  • 基于树的算法
  • 非基于树的算法

2 数据整体情况

2.1 数据加载

数据分析3剑客:numpy pandas matplotlib

# 导入相关包
import os
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
pd.set_option('display.max_rows', None)
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
import seaborn as sns
import plotly.express as px
from sklearn import preprocessing
from sklearn.preprocessing import LabelEncoder
import holoviews as hv
from holoviews import opts
hv.extension('bokeh')

1、 pandas读取数据: pd.read_csv(),训练数据一般从csv文件加载。读取数据返回DataFrame,df.head() 查看前5条件数据分布

# 读取数据
df = pd.read_csv('./xxx.csv')
df.head()

在这里插入图片描述

2、查看数据总体信息

df.info() 

在这里插入图片描述
3、 查看数据描述

# 数据总数、平均值、标准差、最大最小值,25% 50% 75% 分位值
df.describe().T 

在这里插入图片描述

4、统计数据空值

df.isnull().sum() 

在这里插入图片描述
5、 查看数据形状

df.shape

在这里插入图片描述
6、查看数据类型

df.dtypes

在这里插入图片描述

2.2 样本是否均衡

如果正、负样本不均衡怎么做?

  • 大样本变少——下采样
  • 小样本变多——上采样
  • 实际应用中,上采样较多,将真实的数据做重复冗余

2.3 数据分析

以下为案例:

2.3.1单因分析

  • 绘制直方图
fig = px.histogram(df, x='列名', hover_data=df.columns, title='XXX分布', barmode='group')
fig.show()

在这里插入图片描述

fig = px.histogram(df, x='TPC_LIP', color='TPC_LIP', hover_data=df.columns, title='罐盖分布', barmode='group')
fig.show()

在这里插入图片描述

  • 绘制分布图
hv.Distribution(np.round(df['列名'])).opts(title='标题', color='green', xlabel='x轴标签名', ylabel='y轴标签名')\
.opts(opts.Distribution(width=1000, height=600, tools=['hover'], show_grid=True))

在这里插入图片描述

hv.Distribution(df['BF_IRON_DUR']).opts(title='XXX时长', color='red', xlabel='时长(秒)', ylabel='Destiny')\
.opts(opts.Distribution(width=1000, height=600, tools=['hover'], show_grid=True))

在这里插入图片描述

2.3.2 多因分析

  • 绘制直方图
temp_agg = df.groupby('OUTER_TEMPERATURE').agg({'TEMPERATURE': ['min', 'max']})
temp_maxmin = pd.merge(temp_agg['TEMPERATURE']['max'],temp_agg['TEMPERATURE']['min'],right_index=True,left_index=True)
temp_maxmin = pd.melt(temp_maxmin.reset_index(), ['OUTER_TEMPERATURE']).rename(columns={'OUTER_TEMPERATURE':'OUTER_TEMPERATURE', 'variable':'Max/Min'})
hv.Bars(temp_maxmin, ['OUTER_TEMPERATURE', 'Max/Min'], 'value').opts(title="Temperature by OUTER_TEMPERATURE Max/Min", ylabel="TEMPERATURE")\
                                                                    .opts(opts.Bars(width=1000, height=700,tools=['hover'],show_grid=True))

在这里插入图片描述

  • 寻找特征偏态(skewness)和核密度估计(Kernel density estimate KDE)
plt.figure(figsize=(15,10))
for i,col in enumerate(df.columns, 1):
    plt.subplot(5,3,i)
    plt.title(f"Distribution of {col} Data")
    sns.histplot(df[col],kde=True)
    plt.tight_layout()
    plt.plot()

在这里插入图片描述

  • 绘制曲线图
iron_temp = df['IRON_TEMPERATURE'].iloc[:300]

temp = df['TEMPERATURE'].iloc[:300]

(hv.Curve(iron_temp, label='XXX') * hv.Curve(temp, label='XXX')).opts(title="XXXX温度对比", ylabel="IRON_TEMPERATURE", xlabel='TEMPERATURE')\
                                                         .opts(opts.Curve(width=1500, height=500,tools=['hover'], show_grid=True))

在这里插入图片描述

3 数据处理

3.1 数据清洗

3.1.1离群值

利用箱形图找出离群值并可过滤剔除

Minimum 最小值
First quartile 1/4分位值
Median 中间值
Third quartile 3/4分位值
Maximum 最大值

  • XXX离群值1

在这里插入图片描述

  • XXX离群值2
fig = px.box(df, y='XXX', title='XXXXX')
fig.show()

在这里插入图片描述

3.1.2空数据处理

如果数据量比较大,查出空数据的行或列删除即可,反之要珍惜现有的数据样本

可采用以下两种方法进行补全

  • 随机森林补全
# 引入随机森林模型
from sklearn.ensemble import RandomForestRegressor
# 随机森林模型
rfr = RandomForestRegressor(random_state=None, n_estimators=500, n_jobs=-1)
# 利用已知输入和输出数据进行模型训练
rfr.fit(known_X, known_y)
# 输出模型得分
score = rfr.score(known_X, known_y)
print('模型得分', score)
# 获得缺失的特征数据X预测并补全
unknown_predict = rfr.predict(unKnown_X)
  • 简单归类补全
# 引入简单归类包
from sklearn.impute import SimpleImputer
# 对缺失的列进行平均值补全
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
# 进行模型训练
imputer = imputer.fit_transform(df[['TEMPERATURE']])
# 输出训练结果
imputer

在这里插入图片描述

3.2 特征工程

特征衍生、选择、缩放、分布、重要性

  • 特征衍生: 特征转换和特征组合

    特征转换——单特征自己进行变换,例如取绝对值、进行幂函数变换等
    特征组合——多特征之间组合变换,如四则运算、交叉组合、分组统计等

3.2.1 特征选择

corr相关性系数,删除相关性强、冗余的特征,对分析特征权重很重要

# 浅颜色代表正相关 深颜色代表负相关
plt.figure(figsize=(16, 16))
sns.heatmap(df.corr(), cmap='BrBG', annot=True, linewidths=.5)
_ = plt.xticks(rotation=45)

在这里插入图片描述

3.2.2 特征缩放

  • 受特征缩放的影响:距离算法 KNN K-means SVM 等

在这里插入图片描述

  • 不受特征缩放的影响:基于树的算法
    在这里插入图片描述

缩放方法

  • 归一化
    最大、最小值 0~1 之间,适合非高斯分布 K-Nearest Neighbors and Neural Networks
    在这里插入图片描述

  • 标准化
    适合高斯分布,但也可不是高斯分布。平均值为0,标准差为1,即使有异常值不受影响
    在这里插入图片描述

  • Robust Scaler(鲁棒缩放)
    计算上下四分位数(Q1和Q3)之间的差值,每个数据点减去下四分位数(Q1),再除以四分位数范围(Q3-Q1)

# data
x = pd.DataFrame({
    # Distribution with lower outliers
    'x1': np.concatenate([np.random.normal(20, 2, 1000), np.random.normal(1, 2, 25)]),
    # Distribution with higher outliers
    'x2': np.concatenate([np.random.normal(30, 2, 1000), np.random.normal(50, 2, 25)]),
})
np.random.normal
 
scaler = preprocessing.RobustScaler()
robust_df = scaler.fit_transform(x)
robust_df = pd.DataFrame(robust_df, columns =['x1', 'x2'])
 
scaler = preprocessing.StandardScaler()
standard_df = scaler.fit_transform(x)
standard_df = pd.DataFrame(standard_df, columns =['x1', 'x2'])
 
scaler = preprocessing.MinMaxScaler()
minmax_df = scaler.fit_transform(x)
minmax_df = pd.DataFrame(minmax_df, columns =['x1', 'x2'])
 
fig, (ax1, ax2, ax3, ax4) = plt.subplots(ncols = 4, figsize =(20, 5))
ax1.set_title('Before Scaling')
 
sns.kdeplot(x['x1'], ax = ax1, color ='r')
sns.kdeplot(x['x2'], ax = ax1, color ='b')
ax2.set_title('After Robust Scaling')
 
sns.kdeplot(robust_df['x1'], ax = ax2, color ='red')
sns.kdeplot(robust_df['x2'], ax = ax2, color ='blue')
ax3.set_title('After Standard Scaling')
 
sns.kdeplot(standard_df['x1'], ax = ax3, color ='black')
sns.kdeplot(standard_df['x2'], ax = ax3, color ='g')
ax4.set_title('After Min-Max Scaling')
 
sns.kdeplot(minmax_df['x1'], ax = ax4, color ='black')
sns.kdeplot(minmax_df['x2'], ax = ax4, color ='g')
plt.show()

在这里插入图片描述

3.2.3 类别特征处理

  • 非基于树的算法最好的方式——独热编码
# 独热编码
feature_col_nontree = ['TPC_AGE','TPC_LID','BF_START_WAITING', 'BF_IRON_DUR', 'BF_END_WAITING', 'BF_RAIL_DUR', 'RAIL_STEEL_DUR', 
                  'EMPTY_START_WAITING', 'EMPTY_DUR', 'EMPTY_END_WAITING', 'STEEL_RAIL_DUR', 'RAIL_BF_DUR','TOTAL_TIME','OUTER_TEMPERATURE']
fullSel=pd.get_dummies(feature_col_nontree)

在这里插入图片描述

  • 基于树的算法最好的方式——标签编码
df_tree = df.apply(LabelEncoder().fit_transform)
df_tree.head()

3.2.4 特征重要性

注意:只有在特征没有冗余或被拆分的情况下,分析特征的重要性才有意义

from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(X, y)
clf.feature_importances_
plt.rcParams['figure.figsize'] = (12, 6)
plt.style.use('fivethirtyeight')

feature = list(X.columns)

importances = clf.feature_importances_
feat_name = np.array(feature)
index = np.argsort(importances)[::-1]

plt.bar(range(len(index)), importances[index], color='lightblue')
plt.step(range(15), np.cumsum(importances[index]))
_ = plt.xticks(range(15), labels=feat_name[index], rotation='vertical', fontsize=14)

在这里插入图片描述

4 构建模型

4.1 数据拆分

训练数据80% 测试数据20%
训练数据80% 在分80%为训练数据,20%为验证数据

from sklearn.model_selection import train_test_split
X = df.drop('TEMPERATURE', axis=1)
y = df['TEMPERATURE']
X_train_all, X_test, y_train_all,  y_test = train_test_split(X, y, test_size=0.2)
X_train, X_valid, y_train, y_valid = train_test_split(X_train_all, y_train_all, test_size=0.2)
print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)
print(X_valid.shape, y_valid.shape)

在这里插入图片描述

4.2 选用算法

非基于树的算法

  • LinearRegression
  • LogisticRegression
  • Naive Bayes
  • SVM
  • KNN
  • K-Means

基于树的算法

  • Decission Trees
  • Extra Trees
  • Random Forest
  • XGBoost
  • GBM
  • LightGBM

4.2 数据交叉验证

  • k-fold cross-validation:
    k个不相交的子集,其中一个子集作为测试集,其余的子集作为训练集。重复k次
  • stratified k-fold cross-validation (样本分布不均匀情况下使用)
    在这里插入图片描述

4.3 算法比较优选

# 导入机器学习 线性回归为例
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, ExtraTreesRegressor
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV, cross_val_score, StratifiedKFold

# 设置kfold 交叉采样法拆分数据集
kfold = StratifiedKFold(n_splits=10)

# 汇总不同模型算法
regressors = []
regressors.append(SVR())
regressors.append(DecisionTreeRegressor())
regressors.append(RandomForestRegressor())
regressors.append(ExtraTreesRegressor())
regressors.append(GradientBoostingRegressor())
regressors.append(KNeighborsRegressor())
regressors.append(LinearRegression())
regressors.append(LinearDiscriminantAnalysis())
regressors.append(XGBRegressor())

# 不同机器学习交叉验证结果汇总
cv_results = []
for regressor in regressors:
    cv_results.append(cross_val_score(estimator=regressor, X=X_train, y=y_train, 
                                      scoring='neg_mean_squared_error', 
                                      cv=kfold, n_jobs=-1))
    
# 求出模型得分的均值和标准差
cv_means = []
cv_std = []

for cv_result in cv_results:
    cv_means.append(cv_result.mean())
    cv_std.append(cv_result.std())

# 汇总数据
cvResDf = pd.DataFrame({'cv_mean': cv_means,
                        'cv_std': cv_std,
                        'algorithm':['SVC','DecisionTreeReg','RandomForestReg','ExtraTreesReg',
                                  'GradientBoostingReg','KNN','LR','LDA', 'XGB']})
cvResDf

在这里插入图片描述

bar = sns.barplot(data=cvResDf.sort_values(by='cv_mean', ascending=False),
                  x='cv_mean', y='algorithm', **{'xerr': cv_std})
bar.set(xlim=(0.7, 0.9))

在这里插入图片描述

4.3 深度学习效果

tesorflow

import keras
d_model = keras.models.Sequential()
d_model.add(keras.layers.Dense(units=256, activation='relu', input_shape=(X_train_scaler.shape[1:])))
d_model.add(keras.layers.Dense(units=128, activation='relu'))
d_model.add(keras.layers.Dense(units=1))

out_put_dir = './'
if not os.path.exists(out_put_dir):
    os.mkdir(out_put_dir)
out_put_file = os.path.join(out_put_dir, 'model.keras')

callbacks = [
    keras.callbacks.TensorBoard(out_put_dir),
    keras.callbacks.ModelCheckpoint(out_put_file, save_best_only=True, save_weights_only=True),
    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)
]

d_model.compile(optimizer='Adam', loss='mean_squared_error', metrics=['mse'])
history = d_model.fit(X_train_scaler, y_train, epochs=100, validation_data=(X_valid_scaler, y_valid), callbacks=callbacks)

在这里插入图片描述

pytorch

import pandas as pd
import torch
from torch import nn

data = pd.read_csv('XXX.csv', header=None)
print(data.head())
X = data.iloc[:, :-1]
print(X.shape)
Y = data.iloc[:, -1]
Y.replace(-1, 0, inplace=True)
print(Y.value_counts())
X = torch.from_numpy(X.values).type(torch.FloatTensor)
Y = torch.from_numpy(Y.values.reshape(-1, 1)).type(torch.FloatTensor)
model = nn.Sequential(
    nn.Linear(15, 1),
    nn.Sigmoid()
)
print(model)

loss_fn = nn.BCELoss()
opt = torch.optim.SGD(model.parameters(), lr=0.0001)
batch_size = 32
steps = X.shape[0] // batch_size
for epoch in range(1000):
    for batch in range(steps):
        start = batch * batch_size
        end = start + batch_size
        x = X[start:end]
        y = Y[start:end]
        y_pred = model(x)
        loss = loss_fn(y_pred, y)
        opt.zero_grad()
        loss.backward()
        opt.step()

print(model.state_dict())

accuracy = ((model(X).data.numpy() > 0.5) == Y.numpy()).mean()
print('accuracy = ', accuracy)

在这里插入图片描述

5 模型优化

选出相对表现优秀的模型进行优化,经过调参和工程反复应用情况,选择最优模型

5.1 网络搜索

  • DecisionTreeRegressor模型
#DecisionTreeRegressor模型
GTR = DecisionTreeRegressor()
gb_param_grid = {
              'criterion': ['squared_error', 'friedman_mse', 'absolute_error', 'poisson'],
              'splitter': ['best', 'random'],
              'max_depth': [4, 8],
              'min_samples_leaf': [100,150],
              'max_features': [0.3, 0.1] 
              }
modelgsGTR = GridSearchCV(GTR,param_grid = gb_param_grid, cv=kfold, 
                                     scoring="neg_mean_squared_error", n_jobs= -1, verbose = 1)
modelgsGTR.fit(X_train,y_train)
modelgsGTR.best_score_
  • xgboost
import xgboost as xgb

params = {'objective':'reg:linear',
          'booster':'gbtree',
          'eta':0.03,
          'max_depth':10,
          'subsample':0.9,
          'colsample_bytree':0.7,
          'silent':1,
          'seed':10}
num_boost_round = 6000
dtrain = xgb.DMatrix(X_train, y_train)
dtest = xgb.DMatrix(X_test, y_test)

evals = [(dtrain, 'train'), (dtest, 'validation')]

gbm = xgb.train(params, # 模型参数
                dtrain, # 训练数据
                num_boost_round, # 轮次,决策树的个数
                evals=evals, # 验证,评估的数据
                early_stopping_rounds=100, # 在验证集上,当连续n次迭代,分数没有提高后,提前终止训练
                verbose_eval=True) # 打印输出log日志,每次训练详情

5.2 正则化

在这里插入图片描述
作用:

  1. 抵制w无限增大,防止溢出
  2. 减少训练集与测试集之间的结果差异,防止过拟合
  3. 或多或少影响训练集的效果

L2使得所有w均变小
L1使得最不重要的特征维度变小,增强泛化能力,也起到降维的作用。L1在实际应用中较多。

6 模型评估

在这里插入图片描述

  • Accuracy 准确率:模型预测正确结果所占的比例,容易受到正负样本不平衡时影响
    在这里插入图片描述

  • Precision 精确率:模型预测为正样本占实际正样本的比例,容易受到所选阈值的影响。希望事务精准发生,对精确率要求相对较高(比如推送广告)
    在这里插入图片描述

  • Recall 召回率:正样本占所有模型预测为正样本的比例,容易受到所选阈值的影响。希望负面或不好的事务不发生,对召回率要求相对较高(比如投送涉及黄、赌、毒的内容文章)
    在这里插入图片描述

  • F1 score (F1):模型精确率和召回率的一种加权平均,它的最大值是1,最小值是0
    在这里插入图片描述

  • ROC/AUC (Receiver Operating characteristic 接收者操作特征曲线, Area Under Carve 曲线下面积)
    ROC的曲线由所有阈值点theta组成,其下面积越大说明分类效果越好

在这里插入图片描述

thresholds = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]
recalls = [] # 召回率
precisions = [] # 精确度
aucs = [] # 曲线下面积
y_pred_proba = grid_search.predict_proba(X_test)
for threshold in thresholds:
    y_ = y_pred_proba[:,1] >= threshold
    cm = confusion_matrix(y_test,y_)
    # TP/(TP + FN)
    recalls.append(cm[1,1]/(cm[1,0] + cm[1,1])) # 召回率
    # TP/(TP + FP)
    precisions.append(cm[1,1]/(cm[0,1] + cm[1,1])) # 精确率
    fpr,tpr,_ = roc_curve(y_test,y_)
    auc_ = auc(fpr,tpr)
    aucs.append(auc_)
    
plt.figure(figsize=(12,6))
plt.plot(thresholds,recalls,label = 'Recall')
plt.plot(thresholds,aucs,label = 'auc')
plt.plot(thresholds,precisions,label = 'precision')
plt.legend()
plt.xlabel('thresholds')

在这里插入图片描述

  • Log loss 损失函数

    • 线性回归(MES 均方误差)
      Log Loss = - 1.0 ( target log(prediction) + (1 - target) * log(1 - prediction) )
    • 逻辑回归(交叉熵)
      在这里插入图片描述
      在这里插入图片描述

请尊重别人的劳动成果 转载请务必注明出处

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

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

相关文章

技术阅读周刊第十四期:Golang 作者 Rob Pike 在 GopherConAU 上的分享

技术阅读周刊,每周更新。 历史更新 20231215:第十期20231122:第十一期20231129:第十二期20240105:第十三期:一些提高生产力的终端命令 What We Got Right, What We Got Wrong URL: https://commandcenter.b…

玩转 openEuler (一)-- 系统安装

简介 openEuler 是一款开源操作系统。当前 openEuler 内核源于Linux,支持鲲鹏及其它多种处理器,能够充分释放计算芯片的潜能,是由全球开源贡献者构建的高效、稳定、安全的开源操作系统,适用于数据库、大数据、云计算、人工智能等…

羊驼2:开放的基础和微调聊天模型--Llama 2论文阅读

论文地址:https://arxiv.org/pdf/2307.09288.pdfd 代码地址:GitHub - facebookresearch/llama-recipes: Examples and recipes for Llama 2 model 问答 用了多少个gpu? 这篇文档中使用了3.3M GPU小时的计算,使用的硬件类型是A…

3万字数据结构与算法学习笔记+知识点总结

文章目录 数据结构与算法排序排序算法常见排序算法复杂度冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort)希尔排序(Shell Sort)堆排序(Heap Sor…

Microsoft Edge如何安装插件去广告

打开enge浏览器,点击这里 选择扩展 点击打开Microsoft Edge网站 点击搜索栏,输入广告拦截,之后点击键盘的Enter键 点击获取就可以了。如果你喜欢其他的插件,也可以在里面搜索并且下载

文献阅读:Large Language Models as Optimizers

文献阅读:Large Language Models as Optimizers 1. 文章简介2. 方法介绍 1. OPRO框架说明2. Demo验证 1. 线性回归问题2. 旅行推销员问题(TSP问题) 3. Prompt Optimizer 3. 实验考察 & 结论 1. 实验设置2. 基础实验结果 1. GSM8K2. BBH3.…

MyBatis的配置及简单使用

1.配置myBatis 1.myBatis的作用 MyBatis 是一个开源的持久层框架,它的主要作用是简化数据库操作,使得开发者能够更方便地与数据库进行交互。 MyBatis 允许开发者使用简单的 XML 或注解配置 SQL 映射,从而实现数据库操作,而不需要…

解决“win11无法识别U盘“问题

在15.6寸笔记本上插上U盘,有时候出现U盘无法识别的现象,出现这种问题的原因有许多,比如U盘的格式不被当前电脑支持、电脑的USB接口电压过低、没有安装U盘驱动等等。     若是U盘格式不支持,则把U盘改成电脑能够识别的格式&#…

C++I/O流——(4)文件输入/输出(第一节)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 含泪播种的人一定能含笑收获&#xff…

Fiddler工具 — 13.AutoResponder应用场景

简单介绍几个应用场景: 场景一:生产环境的请求重定向到本地文件,验证结果。 例如:某网站或者系统修改了问题,但尚未更新到生产环境,可重定向到本地修改后的文件进行验证,这样能够避免更新到生产…

maven管理使用

maven基本使用 一、简介二、配置文件三、项目结构maven基本标签实践(例子) 四、pom插件配置五、热部署六、maven 外部手动加载jar打包方式Maven上传私服或者本地 一、简介 基于Ant 的构建工具,Ant 有的功能Maven 都有,额外添加了其他功能.本地仓库:计算机中一个文件夹,自己定义…

鸿蒙Harmony-层叠布局(Stack)详解

我们总是为了太多遥不可及的东西去拼命,却忘了人生真正的幸福不过是灯火阑珊处的温暖,柴米油盐的充实,人生无论你赚的钱,是多还是少,经历的事情是好还是坏,都不如过好当下的每一天! 目录 一&am…

5.2 Android BCC环境搭建(adeb版,下)

五,运行adeb shell adeb shell 其实这个配置比较简单,也就是5.1中的第三节“adeb prepare --full“和该节的”adeb shell",就可以连接我们的android设备,在android设备中或执行bcc工具,来对我们的android环境进行hook了。 六,其他指令 6.1 从开发机移除adeb adeb…

顶级Web应用程序测试工具列表

今天主要列举Web应用程序的工具。 今天的列表仅仅提供索引功能,具体要使用的同学,可以自行搜索哦。 通过web应用程序测试,在web应用程序公开发布之前,会发现网站功能、安全性、可访问性、可用性、兼容性和性能等问题。 Web应用程…

繁花的范总-UMLChina建模知识竞赛第5赛季第3轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。 如果有第4题,第4题为附加题&am…

基于SSM的法律咨询系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

代码随想录 Leetcode242. 有效的字母异位词

题目&#xff1a; 代码&#xff08;首刷看解析 2024年1月14日&#xff09;&#xff1a; class Solution { public:bool isAnagram(string s, string t) {int hash[26] {0};for(int i 0; i < s.size(); i) {hash[s[i] - a];}for(int i 0; i < t.size(); i) {hash[t[i]…

第十六章 i18n国际化

第十六章 i18n国际化 1.什么是i18n国际化2.i18n国际化三要素介绍3.i18n国际化基础示例4.通过请求头实现国际化5.通过语言类型选择实现国际化6.通过JSTL标签库fmt实现国际化 1.什么是i18n国际化 2.i18n国际化三要素介绍 3.i18n国际化基础示例 如果我要准备一个国际化的信息&…

Windows10下 tensorflow-gpu 配置

越来越多的的人入坑机器学习&#xff0c;深度学习&#xff0c;tensorflow 作为目前十分流行又强大的一个框架&#xff0c;自然会有越来越多的新人&#xff08;我也刚入门&#xff09;准备使用&#xff0c;一般装的都是 CPU 版的 tensorflow&#xff0c;然而使用 GPU 跑 tensorf…

初始化数组

一、静态初始化格式&#xff1a; 数据类型[ ] 数组名 new 数据类型[ ]{元素1&#xff0c;元素2&#xff0c;元素3......} 等号后面的new 数据类型可以省略 注意&#xff1a;什么类型的数组只能存放什么类型的数据 直接打印a或b会显示其地址 数组的元素个数&#xff1a;arr…