【Kaggle】练习赛《鲍鱼年龄预测》(上)

news2025/1/15 23:48:01

前言

上一篇文章,讲解了《肥胖风险的多类别预测》机器学习方面的文章,主要是多分类算法的运用,本文是一个回归的算法,本期是2024年4月份的题目《Regression with an Abalone Dataset》即《鲍鱼年龄预测》,在此分享高手在这个比赛过程的代码。
由于内容比较多,分成两篇来完成,上篇着重 讲解数据探索( EDA) 方面,下篇讲解 建模优化方面。

题目简介

先上一张鲍鱼的图。
abalone
这一段话写得非常棒,我就直接引用了。

🚀 在这个激动人心的探索中,我们深入了解鲍鱼生物学的迷人世界。我们的使命?利用先进的机器学习技术,根据鲍鱼的身体测量结果预测鲍鱼的年龄。
我们的数据集是从对这些海洋软体动物的细致研究和观察中收集的信息宝库。🐚 从外壳尺寸到身体质量,我们拥有解开鲍鱼年龄预测秘密所需的所有工具。
但为什么这个预测任务很重要?鲍鱼的年龄传统上是通过费力的方法来确定的,包括外壳切片和显微镜检查。
🕵️‍♂️ 通过利用现成的物理测量,我们旨在简化这一过程,并提供更快、更高效的替代方案。
当我们开始这段旅程时,我们将深入研究数据集,探索鲍鱼的不同特征与年龄之间的关系。通过分类和回归技术,我们将努力将均方根对数误差(RMSLE)降至最低,并提供准确的预测。📊💡
所以,准备好让自己沉浸在鲍鱼生物学和预测建模的世界中。用决心和创新,让我们一起揭开鲍鱼年龄预测的奥秘!🌊🔍✨

加载库

保证完整性,这部分也写上了。

# 加载库
import warnings as wrn
wrn.filterwarnings('ignore', category = DeprecationWarning) 
wrn.filterwarnings('ignore', category = FutureWarning) 
wrn.filterwarnings('ignore', category = UserWarning) 

import optuna
import xgboost as xgb
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import GroupKFold
from sklearn.metrics import accuracy_score, classification_report, mean_absolute_error
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import LinearSVC
from sklearn.preprocessing import RobustScaler
from sklearn.pipeline import make_pipeline
from sklearn.decomposition import PCA
from sklearn.model_selection import cross_val_score
from sklearn.metrics import make_scorer, accuracy_score, median_absolute_error
from imblearn.over_sampling import RandomOverSampler
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import mean_squared_error, r2_score
import lightgbm as lgb
import numpy as np
from scipy import stats

加载数据

# 加载所有数据
train_data = pd.read_csv("/kaggle/input/playground-series-s4e4/train.csv")
test_data = pd.read_csv("/kaggle/input/playground-series-s4e4/test.csv")
original_data = pd.read_csv('/kaggle/input/abalone-dataset/abalone.csv')

这里特别说明一下,这个original_data 是原始数据集,即来自于UCI。参考链接为:https://archive.ics.uci.edu/dataset/1/abalone

查看数据

y = train_data['Rings'] 
id_test = test_data['id']

train_data = train_data.drop(['id'], axis = 1)
test_data = test_data.drop(['id'], axis = 1)

train_data.columns = original_data.columns
test_data.columns = original_data.drop(['Rings'], axis=1).columns
train_data.head()
SexLengthDiameterHeightWhole weightShucked weightViscera weightShell weightRings
0F0.5500.4300.1500.77150.32850.14650.240011
1F0.6300.4900.1451.13000.45800.27650.320011
2I0.1600.1100.0250.02100.00550.00300.00506
3M0.5950.4750.1500.91450.37550.20550.250010
4I0.5550.4250.1300.78200.36950.16000.19759

训练集情况

# 查看数据结构

num_train_rows, num_train_columns = train_data.shape

num_test_rows, num_test_columns = test_data.shape

num_original_rows, num_original_columns = original_data.shape

print("Training Data:")
print(f"Number of Rows: {num_train_rows}")
print(f"Number of Columns: {num_train_columns}\n")

print("Test Data:")
print(f"Number of Rows: {num_test_rows}")
print(f"Number of Columns: {num_test_columns}\n")

print("Original Data:")
print(f"Number of Rows: {num_original_rows}")
print(f"Number of Columns: {num_original_columns}")

Training Data:
Number of Rows: 90615
Number of Columns: 9

Test Data:
Number of Rows: 60411
Number of Columns: 8

Original Data:
Number of Rows: 4177
Number of Columns: 9

# 查看重复缺失等情况

missing_values_train = pd.DataFrame({'Feature': train_data.columns,
                              '[TRAIN] No. of Missing Values': train_data.isnull().sum().values,
                              '[TRAIN] % of Missing Values': ((train_data.isnull().sum().values)/len(train_data)*100)})

missing_values_test = pd.DataFrame({'Feature': test_data.columns,
                             '[TEST] No.of Missing Values': test_data.isnull().sum().values,
                             '[TEST] % of Missing Values': ((test_data.isnull().sum().values)/len(test_data)*100)})

missing_values_original = pd.DataFrame({'Feature': original_data.columns,
                             '[ORIGINAL] No.of Missing Values': original_data.isnull().sum().values,
                             '[ORIGINAL] % of Missing Values': ((original_data.isnull().sum().values)/len(original_data)*100)})

unique_values = pd.DataFrame({'Feature': train_data.columns,
                              'No. of Unique Values[FROM TRAIN]': train_data.nunique().values})

feature_types = pd.DataFrame({'Feature': train_data.columns,
                              'DataType': train_data.dtypes})

merged_df = pd.merge(missing_values_train, missing_values_test, on='Feature', how='left')
merged_df = pd.merge(merged_df, missing_values_original, on='Feature', how='left')
merged_df = pd.merge(merged_df, unique_values, on='Feature', how='left')
merged_df = pd.merge(merged_df, feature_types, on='Feature', how='left')

merged_df
Feature[TRAIN] No. of Missing Values[TRAIN] % of Missing Values[TEST] No.of Missing Values[TEST] % of Missing Values[ORIGINAL] No.of Missing Values[ORIGINAL] % of Missing ValuesNo. of Unique Values[FROM TRAIN]DataType
0Sex00.00.00.000.03object
1Length00.00.00.000.0157float64
2Diameter00.00.00.000.0126float64
3Height00.00.00.000.090float64
4Whole weight00.00.00.000.03175float64
5Shucked weight00.00.00.000.01799float64
6Viscera weight00.00.00.000.0979float64
7Shell weight00.00.00.000.01129float64
8Rings00.0NaNNaN00.028int64

数据无重复、无缺失

train_data.describe().T
countmeanstdmin25%50%75%max
Length90615.00.5170980.1182170.07500.44500.54500.60000.8150
Diameter90615.00.4016790.0980260.05500.34500.42500.47000.6500
Height90615.00.1354640.0380080.00000.11000.14000.16001.1300
Whole weight90615.00.7890350.4576710.00200.41900.79951.06752.8255
Shucked weight90615.00.3407780.2044280.00100.17750.33000.46301.4880
Viscera weight90615.00.1694220.1009090.00050.08650.16600.23250.7600
Shell weight90615.00.2258980.1302030.00150.12000.22500.30501.0050
Rings90615.09.6967943.1762211.00008.00009.000011.000029.0000
数据集特征说明
列名完整含义详细说明
‘id’id鲍鱼的唯一号
‘Sex’性别指示鲍鱼性别的分类变量。可能的值为M(男性)、F(女性)和I(婴儿)
‘Length’长度表示最长外壳测量值的连续变量,单位为毫米。
‘Diameter’直径表示外壳直径的连续变量,垂直于长度测量,单位为毫米。
‘Height’高度表示鲍鱼高度的连续变量,鲍鱼壳中有肉,单位为毫米。
‘Whole_weight’整体重量表示鲍鱼整体重量的连续变量,单位为克。
‘Shucked_weight’去皮重量表示肉(去皮后)重量的连续变量,单位为克。
‘Viscera_weight’内脏重量表示肠道重量(出血后)的连续变量,单位为克。
‘Shell_weight’贝壳重量表示贝壳重量(干燥后)的连续变量,单位为克。
‘Rings’以年为单位表示鲍鱼年龄的整数变量。+1.5的值表示实际年龄(以年为单位)。

该数据集为大量鲍鱼标本提供了一套全面的物理测量数据。包括分类变量和连续变量在内的各种特征使该数据集非常适合各种预测建模任务,特别是基于这些容易获得的物理特征预测鲍鱼年龄。目标变量Rings表示鲍鱼壳中的环数,这是动物年龄的代表。预测鲍鱼的年龄是一项具有挑战性的任务,因为传统的环数方法既耗时又乏味。因此,该数据集提供了一个机会,可以探索使用可用的物理测量来估计鲍鱼年龄的替代、更有效的方法。

数据探索 (EDA)

numerical_variables = ['Length', 'Diameter', 'Height', 'Whole weight', 'Shucked weight', 'Viscera weight', 'Shell weight']
target_variable = 'Rings'
categorical_variables = ['Sex']

特征分为数值型和分类型,本题 数据结构相对比较简单

数值型特征分布图

# 分析数值型特征

# Define a custom color palette
custom_palette = [
    '#28ae80', 
    '#d3eb0c', 
    '#ff9a0b'
]

# Add 'Dataset' column to distinguish between train and test data
train_data['Dataset'] = 'Train'
test_data['Dataset'] = 'Test'
original_data['Dataset'] = 'Original'

variables = [col for col in train_data.columns if col in numerical_variables]

# Function to create and display a row of plots for a single variable
def create_variable_plots(variable):
    sns.set_style('whitegrid')
    
    fig, axes = plt.subplots(1, 2, figsize=(12, 4))

    # Box plot
    plt.subplot(1, 2, 1)
    if variable == 'Whole weight.1' or variable == 'Whole weight.2':
        sns.boxplot(data=pd.concat([train_data, test_data]), x=variable, y="Dataset", palette=custom_palette)
    else:
        sns.boxplot(data=pd.concat([train_data, test_data, original_data.dropna()]), x=variable, y="Dataset", palette=custom_palette)
    plt.xlabel(variable)
    plt.title(f"Box Plot for {variable}", fontweight='bold', fontfamily='serif')

    # Separate Histograms
    plt.subplot(1, 2, 2)
    if variable =='Whole weight.1' or variable =='Whole weight.2':
        sns.histplot(data=train_data, x=variable, color=custom_palette[0], kde=True, bins=30, label="Train")
        sns.histplot(data=test_data, x=variable, color=custom_palette[1], kde=True, bins=30, label="Test")
    else:
        sns.histplot(data=train_data, x=variable, color=custom_palette[0], kde=True, bins=30, label="Train")
        sns.histplot(data=test_data, x=variable, color=custom_palette[1], kde=True, bins=30, label="Test")
        sns.histplot(data=original_data.dropna(), x=variable, color=custom_palette[2], kde=True, bins=30, label="Original")
    plt.xlabel(variable)
    plt.ylabel("Frequency")
    plt.title(f"Histogram for {variable} [TRAIN, TEST & ORIGINAL]", fontweight='bold', fontfamily='serif')
    plt.legend()

    # Adjust spacing between subplots
    plt.tight_layout()

    # Show the plots
    plt.show()

# Perform univariate analysis for each variable
for variable in variables:
    create_variable_plots(variable)

# Drop the 'Dataset' column after analysis
train_data.drop('Dataset', axis=1, inplace=True)
test_data.drop('Dataset', axis=1, inplace=True)
original_data.drop('Dataset', axis=1, inplace=True)

1
2
3
45
6
7

分类型特征分布图
# 分析分类型特征

# Define a custom color palette for categorical features
categorical_palette = ['#33638d', '#28ae80', '#d3eb0c', '#ff9a0b']

# List of categorical variables
categorical_variables = [col for col in categorical_variables]

# Function to create and display a row of plots for a single categorical variable
def create_categorical_plots(variable):
    sns.set_style('whitegrid')
    
    fig, axes = plt.subplots(1, 2, figsize=(12, 4))

    # Pie Chart
    plt.subplot(1, 2, 1)
    train_data[variable].value_counts().plot.pie(autopct='%1.1f%%', colors=categorical_palette, wedgeprops=dict(width=0.3), startangle=140)
    plt.title(f"Pie Chart for {variable}", fontweight='bold', fontfamily='serif')

    # Bar Graph
    plt.subplot(1, 2, 2)
    sns.countplot(data=pd.concat([train_data, test_data, original_data.dropna()]), x=variable, palette=categorical_palette)
    plt.xlabel(variable)
    plt.ylabel("Count")
    plt.title(f"Bar Graph for {variable} [TRAIN, TEST & ORIGINAL]", fontweight='bold', fontfamily='serif')

    # Adjust spacing between subplots
    plt.tight_layout()

    # Show the plots
    plt.show()

# Perform univariate analysis for each categorical variable
for variable in categorical_variables:
    create_categorical_plots(variable)

在这里插入图片描述

目标特征分布图
# 分析目标特征

target_palette = ['#3b528b','#1fa088','#9ee742','#d6f015','#e0d20a','#ffaa08','#ff522f','#d7043d']

fig, axes = plt.subplots(1, 2, figsize=(12, 4))

# Box plot
plt.subplot(1, 2, 1)
sns.boxplot(data=train_data, x=target_variable, palette=target_palette)
plt.xlabel(variable)
plt.title(f"Box Plot for {target_variable} [TRAIN]", fontweight='bold', fontfamily='serif')

# Separate Histograms
plt.subplot(1, 2, 2)
sns.histplot(data=train_data, x=target_variable, color=target_palette[1], kde=True, bins=30, label="Train")
plt.xlabel(variable)
plt.ylabel("Frequency")
plt.title(f"Histogram for {target_variable} [TRAIN]", fontweight='bold', fontfamily='serif')
plt.legend()

# Adjust spacing between subplots
plt.tight_layout()

# Show the plots
plt.show()

在这里插入图片描述
数据集“环”表示鲍鱼壳中的环的数量,这是动物年龄的代表。该变量的值范围从1到29,根据具体问题和建模方法,可以将其视为连续变量和分类变量。

  1. 连续变量法:
  • 由于“环”变量代表鲍鱼的年龄,因此可以将其视为连续变量。
  • 这意味着这项任务可以作为一个回归问题来处理,其中的目标是根据可用的物理测量来预测每只鲍鱼的确切环数(年龄)。
  • 可以使用线性回归和决策树等建模技术来学习特征与连续“环”目标之间的关系。
  1. 分类变量法:
  • 或者,“环”变量可以被视为一个分类变量,其中不同的值(1到29)代表不同的年龄组或类别。
  • 在这种情况下,该任务可以被定义为一个分类问题,其中的目标是根据物理测量来预测每只鲍鱼的年龄组(类别)。
  • 可以使用逻辑回归、决策树或随机森林等建模技术来学习特征和分类“环”目标之间的映射。

连续变量法或分类变量法之间的选择取决于问题的具体要求和模型的预期用途。如果目标是预测鲍鱼的确切年龄,那么连续变量法可能更适合。然而,如果重点是将鲍鱼分为不同的年龄组,那么分类变量方法可能更合适。

我将探索这两种方法,并比较它们的性能,以确定为给定问题建模“环”变量的最佳方式。

偏度条形图
# 测量和比较所有特征之间的偏度,并使用条形图进行比较

skew_merged = pd.DataFrame(data = train_data[numerical_variables].skew(), columns = ['Skewness'])
skew_sorted = skew_merged.sort_values(ascending = False, by = 'Skewness')

sns.barplot(x=skew_sorted.Skewness, y=skew_sorted.index, palette='viridis')
plt.title('Skewness in Explanatory Variables', fontweight='bold', fontfamily='serif')
plt.xlabel('Value')
plt.ylabel('Skewness')
plt.show()

在这里插入图片描述

相关性热力图
# 计算相关性的热力图
corr_train = train_data[numerical_variables].corr()
corr_test = test_data[numerical_variables].corr()

# Create masks for the upper triangle
mask_train = np.triu(np.ones_like(corr_train, dtype=bool))
mask_test = np.triu(np.ones_like(corr_test, dtype=bool))

# Set the text size and rotation
annot_kws = {"size": 8, "rotation": 45}

# Generate heatmaps for train_data
plt.figure(figsize=(18, 7))
plt.subplot(1, 2, 1)
ax_train = sns.heatmap(corr_train, mask=mask_train, cmap='viridis', annot=True,
                      square=True, linewidths=.5, xticklabels=1, yticklabels=1, annot_kws=annot_kws)
plt.title('Correlation Heatmap - Train Data', fontweight='bold', fontfamily='serif')

# Generate heatmaps for test_data
plt.subplot(1, 2, 2)
ax_test = sns.heatmap(corr_test, mask=mask_test, cmap='viridis', annot=True,
                     square=True, linewidths=.5, xticklabels=1, yticklabels=1, annot_kws=annot_kws)
plt.title('Correlation Heatmap - Test Data', fontweight='bold', fontfamily='serif')

# Adjust layout
plt.tight_layout()

# Show the plots
plt.show()

在这里插入图片描述

特征分布散点图
fig, axes = plt.subplots(2, 4, figsize=(16, 8))
axes = axes.flatten()

for i, feature in enumerate(numerical_variables):
    axes[i].scatter(train_data[feature], train_data['Rings'], s=5)
    axes[i].set_xlabel(feature)
    axes[i].set_ylabel('Rings')
    axes[i].set_title(f'Rings vs {feature}')

plt.tight_layout()
plt.show()

在这里插入图片描述
散点图显示,物理测量值(长度、直径、高度、重量)与代表鲍鱼年龄的环数之间存在正相关关系。这表明,更大、更重的鲍鱼往往更老。

为了量化关系的强度,让我们计算“环”和连续特征之间的Pearson相关系数:

相关系数
correlations = train_data[numerical_variables + ['Rings']].corr()
print(correlations['Rings'])

Length 0.623786
Diameter 0.636832
Height 0.665772
Whole weight 0.617274
Shucked weight 0.515067
Viscera weight 0.588954
Shell weight 0.694766
Rings 1.000000
Name: Rings, dtype: float64

相关系数表明,所有物理测量值与环的数量都具有中等强度的正相关性,其中壳体重量具有最高的相关性(0.694766)。

性别(雄性、雌性和幼年)对鲍鱼的年龄分布是否存在差异?

性别对年龄的影响
# Bar plot to show the distribution of Rings for each Sex category
plt.figure(figsize=(8, 6))
train_data.groupby('Sex')['Rings'].mean().plot(kind='bar')
plt.xlabel('Sex')
plt.ylabel('Mean Rings')
plt.title('Mean Rings by Sex')
plt.show()

在这里插入图片描述
条形图:按性别划分的平均环

条形图显示了每个性别类别的戒指平均数量。
我们可以看到,雌性鲍鱼的平均环数高于雄性和幼年鲍鱼。

# Bar plot to show the distribution of Rings for each Sex category
plt.figure(figsize=(8, 6))
train_data.groupby('Sex')['Rings'].mean().plot(kind='bar')
plt.xlabel('Sex')
plt.ylabel('Mean Rings')
plt.title('Mean Rings by Sex')
plt.show()

在这里插入图片描述
盒图:按性别划分的环分布

盒图提供了《指环王》在性别类别中分布的更详细比较。
该图显示,雌性鲍鱼的环的中位数和四分位间距(IQR)略高于雄性和幼年鲍鱼。
对于所有类别,似乎也存在一些具有非常高环值的异常值。

建模
准备数据
dd={"M":0,"F":1,"I":2}
train_data['Sex'] = train_data['Sex'].map(dd)
text_data['Sex'] = test_data['Sex'].map(dd)
X=train.drop(["Rings"],axis=1)
加载各类算法
from sklearn.linear_model import LogisticRegression,LinearRegression
from sklearn.svm import SVC
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB, BernoulliNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.ensemble import RandomForestRegressor, ExtraTreesClassifier, GradientBoostingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from catboost import CatBoostClassifier
from sklearn.ensemble import HistGradientBoostingClassifier
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor
from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier

# Set a seed for reproducibility
seed = 42

# Initialize all the classification models in the requested format
log_reg = LogisticRegression(random_state=seed, max_iter=1000000)
svc = SVC(random_state=seed, probability=True)
lda = LinearDiscriminantAnalysis()
gnb = GaussianNB()
bnb = BernoulliNB()
knn = KNeighborsClassifier()
gauss = GaussianProcessClassifier(random_state=seed)
rf = RandomForestRegressor(random_state=seed)
et = ExtraTreesClassifier(random_state=seed)
xgb = XGBRegressor(random_state=seed)
lgb = LGBMRegressor(random_state=seed, verbosity=0)
dart = LGBMClassifier(random_state=seed, boosting_type='dart')
cb = CatBoostRegressor(random_state=seed, verbose=0)
gb = GradientBoostingClassifier(random_state=seed)
hgb = HistGradientBoostingClassifier(random_state=seed)
lr = LinearRegression()
rf_classifier = RandomForestClassifier(random_state=seed)
et_classifier = ExtraTreesClassifier(random_state=seed)
xgb_classifier = XGBClassifier(random_state=seed)
lgb_classifier = LGBMClassifier(random_state=seed, verbosity=0)
cb_classifier = CatBoostClassifier(random_state=seed, verbose=0)
选出合适算法
import warnings
# Ignore all warnings
warnings.filterwarnings("ignore")

from sklearn.metrics import mean_squared_log_error
import numpy as np

def rmsle(y_true, y_pred):
    return np.sqrt(mean_squared_log_error(y_true, y_pred))

# Fit the models and calculate RMSLE
models = [xgb, lgb, cb, rf]
rmsle_scores = []

for model in models:
    X_train, X_test, y_train, y_test = train_test_split(X,y,
                                                        test_size=0.2,
                                                        random_state=42)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    score = rmsle(y_test, y_pred)
    rmsle_scores.append(score)

# Create a DataFrame with the RMSLE scores
rmsle_df = pd.DataFrame(data=rmsle_scores, columns=['RMSLE'])
rmsle_df.index = ['xgb', 'lgb', 'cb', 'rf']
rmsle_df = rmsle_df.sort_values(by='RMSLE', ascending=False)

# Create a bar graph using Seaborn
plt.figure(figsize=(12, 6))
barplot = sns.barplot(x='RMSLE', y=rmsle_df.index, data=rmsle_df, palette='viridis')

# Add values on the bars with larger and bolder font
for index, value in enumerate(rmsle_df['RMSLE']):
    barplot.text(value + 0.001, index, str(round(value, 5)), ha='left', va='center', fontsize=12, fontweight='bold')

plt.title("Models' RMSLE Scores", fontweight='bold', fontfamily='serif')
plt.xlabel('RMSLE')
plt.ylabel('Models')
plt.show()

在这里插入图片描述

小结

通上述EDA和Modeling 后,对数值结果有了一个初步的了解。不同的模型的结果情况有了一个最基础的 Baseline ,如何提高比赛成绩,将在下一篇做详细的说明。

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

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

相关文章

Vuex的模块化管理

1:定义一个单独的模块。由于mutation的第二个参数只能提交一个对象,所以这里的ThisLog是个json串。 2:在Vuex中的index.js中引入该模块 3:在别的组件中通过...mapState调用模块保存的State的值。 4:用...mapMutations修…

K8S之Job和CronJob控制器

这里写目录标题 Job概念适用场景使用案例 CronJob概念适用场景使用案例 Job 概念 Job控制器用于管理Pod对象运行一次性任务,例如:对数据库备份,可以直接在k8s上启动一个mysqldump备份程序,也可以启动一个pod,这个pod…

LRU的原理与实现(java)

介绍 LRU的英文全称为Least Recently Used,即最近最少使用。它是一种内存数据淘汰算法,当添加想要添加数据而内存不足时,它会优先将最近一段时间内使用最少的数据淘汰掉,再将数据添加进来。 原理 LRU的原理在介绍中就已经基本说…

C++之类和对象(上)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1访问限定符 4.2 类的两种定义方式 第一种: 第二种: 4.3封装 5.类的实例化 6.类对象模型 1.面向过程和面向对象初步认识 C语言是面向过程的,…

华为汽车的“计算+通信”电子电气架构

文章目录 整车结构 硬件平台 软件平台 总结展望 整车EEA(电子电气架构),按照博世提出的演进路径,大致可以划分为四个阶段:分布式模块阶段、区域控制阶段、中央计算阶段、云计算阶段。示例如下: 本文选取…

Java8 进阶

Java8 进阶 文章目录 Java8 进阶什么是函数式接口&#xff1f;public interface Supplierpublic interface Consumerpublic interface Predicatepublic interface FunctionJava8 特性总结&#xff1a;一、Function<T, R>二、Consumer<T>三、Supplier<T>四、P…

BUUCTF:BUU UPLOAD COURSE 1[WriteUP]

构造一句话PHP木马 <?php eval(system($_POST[shell])); ?> 利用eval函数解析$shell的值使得服务器执行system命令 eval函数是无法直接执行命令的&#xff0c;只能把字符串当作php代码解析 这里我们构造的木马是POST的方式上传&#xff0c;那就用MaxHacKBar来执行 …

分布式锁实战

4、分布式锁 4.1 、基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#x…

springBoot--阿里云短信验证

阿里云短信验证 前言阿里云短信服务免费领取100条短信服务1、开通短信服务2、申请签名3、申请模板4、通过子用户获取账号的AccessKey ID 和AccessKey Secret5、使用教程 前言 在我们平时登录中短信验证吗验证在当今是必不可少的&#xff0c;下面是基于阿里云开发的短信验证操作…

【Qt 学习笔记】详解Qt中的信号和槽

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 详解Qt中的信号与槽 文章编号&#xff1a;Qt 学习笔记 / 12 文章目录…

【数据结构】ArrayList详解

目录 前言 1. 线性表 2. 顺序表 3. ArrayList的介绍和使用 3.1 语法格式 3.2 添加元素 3.3 删除元素 3.4 截取部分arrayList 3.5 其他方法 4. ArrayList的遍历 5.ArrayList的扩容机制 6. ArrayList的优缺点 结语 前言 在集合框架中&#xff0c;ArrayList就是一个…

代码随想录第19天

654. 最大二叉树 已解答 中等 相关标签 相关企业 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀…

Mac 配置 Aria2

文章目录 1. Aria2 安装1.1 安装 brew1.2 安装 Aria2 2. 配置 Aria22.1 创建配置文件 aria2.conf 和空对话文件 aria2.session2.2 编辑配置文件 aria2.conf 3. 开机启动设置3.1 创建用户启动文件3.2 管理自启动项 4. 配置 BT tracker 自动更新4.1 XIU2/TrackersListCollection …

通义灵码-ai编码

https://developer.aliyun.com/topic/lingma/activities/202403?taskCode14508&recordIdb1ef3ba27250a5818b1b6ffe418af658#/?utm_contentm_fission_1 「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」

sourcetree提交代码出现闪退报错(已解决)

当我在sourcetree提交代码时&#xff0c;点击提交按钮出现闪退关闭&#xff0c;并弹出下面的报错框&#xff0c;报错的图片如下&#xff1a; 那么经过了解&#xff0c;出现这样的报错原因是&#xff0c;git的提交时无法定位提交的人是谁&#xff0c;导致无法提交 那么解决的方…

Allavsoft for Mac v3.27.0.8852注册激活版 优秀的视频下载工具

Allavsoft for Mac是一款功能强大的多媒体下载和转换工具&#xff0c;支持从各种在线视频网站和流媒体服务下载视频、音频和图片。它具备批量下载和转换功能&#xff0c;可将文件转换为多种格式&#xff0c;以适应不同设备的播放需求。此外&#xff0c;Allavsoft还提供视频编辑…

ARM v8 Cortex R52内核 02 程序模型 Programmers Model

ARM v8 Cortex R52内核 02 程序模型 Programmers Model 2.1 关于程序模型 Cortex-R52处理器实现了Armv8-R架构。这包括&#xff1a; 所有的异常级别&#xff0c;EL0-EL2。 每个异常级别下的AArch32执行状态。 T32和A32指令集&#xff0c;其中包括&#xff1a; 浮点运算。 …

电子商务平台中大数据的应用|主流电商平台大数据采集API接口

(一)电商平台物流管理中大数据的应用 电商平台订单详情订单列表物流信息API接口应用 电子商务企业对射频识别设备、条形码扫描设备、全球定位系统及销售网站、交通、库存等管理软件数据进行实时或近实时的分析研究,提高物流速度和准确性。部分电商平台已建立高效的物流配送网…

Ruoyi-vue-pro Vue + nginx 二级目录部署到云服务器

http://www.your-server.com/ 这是一级目录&#xff0c;由于项目多&#xff0c;一般会通过二级域名http://oa.your-server.com/或二级目录http://www.your-server.com/oa来发布&#xff0c;本篇记录一下二级目录发布。先看效果 1、router/index.js配置base export default new …

Open CASCADE学习|在给定的TopoDS_Shape中查找与特定顶点 V 对应的TopoDS_Edge编号

enum TopAbs_ShapeEnum{TopAbs_COMPOUND,TopAbs_COMPSOLID,TopAbs_SOLID,TopAbs_SHELL,TopAbs_FACE,TopAbs_WIRE,TopAbs_EDGE,TopAbs_VERTEX,TopAbs_SHAPE}; 这段代码定义了一个名为 TopAbs_ShapeEnum 的枚举类型&#xff0c;它包含了表示不同几何形状类型的常量。这些常量通常…