一些关于机器学习的练习

为了加深机器学习基础并通过实践学习,收集了以下练习,覆盖了从数据探索、预处理到模型构建和评估的整个流程。这些练习按照机器学习的主要类型分为三部分:监督学习、无监督学习和强化学习。

监督学习练习

  • 房价预测(线性回归)

    • 数据集:使用加利福尼亚房价数据集。
    • 任务:构建一个模型预测加利福尼亚地区的房价。
    • 挑战:尝试不同的预处理方法(标准化、归一化等)和特征选择技术来改进模型性能。

线性回归是一种预测数值型数据的经典统计方法,它假设目标值和特征之间存在线性关系。在房价预测任务中,我们可以使用线性回归模型来预测基于多个特征(如房屋大小、位置、年龄等)的房价。以下是使用加利福尼亚房价数据集进行房价预测的示例代码,以及如何应用不同的预处理方法和特征选择技术来改进模型性能。

加载和预处理数据

首先,我们从scikit-learn中加载加利福尼亚房价数据集,并进行基本的数据预处理。

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 加载数据集
housing = fetch_california_housing()
X, y = housing.data, housing.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 数据预处理:标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

构建和训练线性回归模型

# 创建线性回归模型
model = LinearRegression()# 训练模型
model.fit(X_train_scaled, y_train)# 预测测试集
y_pred = model.predict(X_test_scaled)# 评估模型
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")

挑战:尝试不同的预处理方法和特征选择

  • 预处理方法:除了标准化,你还可以尝试归一化(MinMaxScaler)、对数转换等方法,看看它们如何影响模型的性能。
  • 特征选择:可以使用不同的特征选择方法(如SelectKBest, SelectFromModel)来选择最有影响力的特征,这有助于模型专注于最重要的信息,提高预测准确性。
from sklearn.feature_selection import SelectKBest, f_regression# 特征选择
selector = SelectKBest(score_func=f_regression, k=5)
X_train_selected = selector.fit_transform(X_train_scaled, y_train)
X_test_selected = selector.transform(X_test_scaled)# 使用选择的特征重新训练模型
model.fit(X_train_selected, y_train)
y_pred_selected = model.predict(X_test_selected)# 评估
mse_selected = mean_squared_error(y_test, y_pred_selected)
print(f"Mean Squared Error with selected features: {mse_selected}")

通过实验不同的预处理方法和特征选择技术,你可以找到最适合特定数据集的配置,从而优化模型性能。每个数据集都是独特的,最佳的数据预处理和特征选择方法可能会有所不同。

  • 手写数字识别(神经网络)

    • 数据集:MNIST手写数字数据集。
    • 任务:构建一个深度学习模型识别手写数字(0-9)。
    • 挑战:实现并调整不同的神经网络架构(如CNN),并使用技巧如正则化、dropout来防止过拟合。

要在Python中实现手写数字识别任务,我们可以使用keras库,它是TensorFlow的一个高级接口,提供了构建和训练深度学习模型的便捷方法。以下是使用卷积神经网络(CNN)对MNIST手写数字数据集进行分类的一个基础示例。由于我的环境无法直接运行深度学习代码,我将提供一个示范性的代码示例,你可以在本地环境中运行它。

确保你已经安装了tensorflowkeras库。如果没有,你可以通过pip install tensorflow命令进行安装。

import numpy as np
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.utils import to_categorical# 加载MNIST数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()# 数据预处理
# 归一化
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255# 调整数据维度,以符合CNN的输入要求
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)# 将目标变量转换为二进制类别矩阵
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)# 构建模型
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))# 编译模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])# 训练模型
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=200)# 评估模型
score = model.evaluate(X_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

这个示例使用了一个简单的CNN架构,包括卷积层、池化层、Dropout层和全连接层。Dropout层在训练过程中随机丢弃一部分神经元,以减轻过拟合的问题。模型使用adam优化器和categorical_crossentropy作为损失函数进行编译。在MNIST数据集上进行了10轮训练后,模型的性能通过在测试集上的损失和准确率来评估。

请注意,实际应用中可能需要进一步调整网络架构和超参数(如学习率、批大小、Dropout比率等)来改善模型的性能。此外,增加卷积层和池化层的数量,或使用更复杂的架构(如ResNet、Inception等),可能会获得更好的结果。

  • 邮件垃圾分类(逻辑回归/支持向量机)

    • 数据集:任何公开的邮件分类数据集,例如Spambase数据集。
    • 任务:构建一个模型,根据邮件内容判断邮件是垃圾邮件还是正常邮件。
    • 挑战:尝试不同的文本特征提取方法(如TF-IDF、词袋模型)和机器学习算法。

以下是一个使用逻辑回归和支持向量机(SVM)对邮件进行垃圾分类的示例。我们将使用TF-IDF方法进行文本特征提取:

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score# 假设emails和labels是你的数据集和标签
# emails = ["your email data here"]
# labels = [0, 1, 0, 1, ...]  # 0代表正常邮件,1代表垃圾邮件# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(emails, labels, test_size=0.2, random_state=42)# 使用TF-IDF进行文本特征提取
vectorizer = TfidfVectorizer(stop_words='english', max_features=1000)
X_train_tfidf = vectorizer.fit_transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)# 逻辑回归分类器
logistic_clf = LogisticRegression()
logistic_clf.fit(X_train_tfidf, y_train)
y_pred_logistic = logistic_clf.predict(X_test_tfidf)# 支持向量机分类器
svm_clf = SVC()
svm_clf.fit(X_train_tfidf, y_train)
y_pred_svm = svm_clf.predict(X_test_tfidf)# 评估模型
accuracy_logistic = accuracy_score(y_test, y_pred_logistic)
accuracy_svm = accuracy_score(y_test, y_pred_svm)print(f"Logistic Regression Accuracy: {accuracy_logistic}")
print(f"SVM Accuracy: {accuracy_svm}")

在这个示例中,我们首先使用TfidfVectorizer对邮件文本进行TF-IDF转换,将文本数据转化为模型可以处理的数值特征。然后,我们使用LogisticRegressionSVC(支持向量机)两种不同的分类器来训练模型,并在测试集上评估模型的准确率。

请注意,实际应用中可能需要调整TfidfVectorizer的参数(如max_features)、选择合适的模型参数,或尝试不同的文本预处理方法(如词干提取、去除停用词等),以获得更好的分类性能。此外,考虑到数据集的具体情况和模型性能的需求,实验不同的特征提取方法和机器学习算法是非常必要的。

无监督学习练习

  • 客户细分(K-均值聚类)

    • 数据集:使用任何公开的客户数据集,如零售数据。
    • 任务:根据购买行为对客户进行分组。
    • 挑战:尝试不同的聚类算法(如DBSCAN、层次聚类)和调整参数来找到最佳的客户分组。

使用KMeans进行客户细分

from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import pandas as pd# 加载客户数据集
# 假设df是一个Pandas DataFrame,包含了你感兴趣的特征
# df = pd.read_csv('your_customer_data.csv')# 对数据进行标准化处理
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df)# 使用KMeans进行聚类
kmeans = KMeans(n_clusters=5, random_state=42)
kmeans.fit(scaled_features)# 将聚类结果添加到原始DataFrame中
df['Cluster'] = kmeans.labels_# 查看聚类结果
print(df.head())

在这个示例中,我们首先对特征进行了标准化处理,这是聚类分析中的一个常见步骤,以确保所有特征在相同的尺度上。然后,我们使用KMeans算法对客户进行了分组,这里假设我们想要将客户分成5个群体。

尝试其他聚类算法

DBSCAN
from sklearn.cluster import DBSCAN# 使用DBSCAN进行聚类
dbscan = DBSCAN(eps=0.5, min_samples=5)
df['Cluster'] = dbscan.fit_predict(scaled_features)# 查看聚类结果
print(df.head())
层次聚类
from sklearn.cluster import AgglomerativeClustering# 使用层次聚类进行聚类
agg_clustering = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
df['Cluster'] = agg_clustering.fit_predict(scaled_features)# 查看聚类结果
print(df.head())

调整参数和选择算法

  • KMeansn_clusters是一个关键参数,决定了聚类的数量。可以使用轮廓分析或肘方法来帮助确定最佳的聚类数量。
  • DBSCANepsmin_samples是关键参数,分别决定了样本成为核心点的条件。这些参数对结果的影响较大,通常需要通过尝试不同的值来找到最佳的参数设置。
  • 层次聚类n_clustersaffinitylinkage是重要的参数,它们分别控制聚类的数量、用于计算距离的方法和聚类合并的准则。

选择哪种聚类算法以及相应的参数设置,取决于数据集的特性和分析任务的目标。实践中,通常建议尝试多种聚类算法和参数配置,然后根据聚类的质量(例如,通过轮廓系数评估)来选择最佳的方法。

  • 图像压缩(主成分分析)

    • 数据集:任意选择一组图片。
    • 任务:使用PCA对图片进行压缩和重构。
    • 挑战:分析压缩比例与图像质量之间的关系,并尝试使用其他降维技术。

使用PCA进行图像压缩和重构

假设你已经安装了必要的Python库,如numpy, matplotlib, 和scikit-learn。如果没有,你可以通过pip安装它们。

以下是使用PCA对单张图片进行压缩和重构的步骤:

  1. 加载图片:首先,我们需要加载一张图片并将其转换为合适的格式。

  2. 应用PCA:然后,我们将应用PCA来降低图片的维度,实现压缩。

  3. 重构图片:最后,我们将使用PCA的逆变换来重构图片,尽量恢复原始图片。

import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from PIL import Image# 加载图片并转换为灰度图
image_path = 'path_to_your_image.jpg'
image = Image.open(image_path).convert('L')
image_array = np.array(image)# 展平图像数组
h, w = image_array.shape
image_flattened = image_array.flatten().reshape(1, h * w)# 应用PCA
n_components = 100  # 选择保留的主成分数量
pca = PCA(n_components=n_components)
image_compressed = pca.fit_transform(image_flattened)# 重构图像
image_reconstructed = pca.inverse_transform(image_compressed).reshape(h, w)# 显示原始和重构的图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image_array, cmap='gray')
plt.title('Original Image')
plt.subplot(1, 2, 2)
plt.imshow(image_reconstructed, cmap='gray')
plt.title('Reconstructed Image')
plt.show()

分析压缩比例与图像质量之间的关系

压缩比例与图像质量之间的关系可以通过改变n_components(PCA中保留的主成分数量)来探索。减少n_components会增加压缩比例,但可能会降低重构图像的质量。通过观察不同n_components值对应的重构图像,可以分析这种权衡关系。

尝试其他降维技术

除了PCA之外,还有其他降维技术可以用于图像压缩,例如:

  • 随机投影sklearn.random_projection
  • 非负矩阵分解(NMF,sklearn.decomposition.NMF

这些方法也可以用类似的方式应用于图像压缩,通过比较不同方法的效果,你可以深入理解各种降维技术在图像压缩任务中的表现和适用性。

强化学习练习

  • 经典控制任务(Q学习/策略梯度)

    • 环境:使用OpenAI Gym提供的环境,如CartPole或MountainCar。
    • 任务:训练一个智能体控制杆保持平衡或者车辆达到山顶。
    • 挑战:尝试不同的强化学习算法和调整其参数来提高智能体的性能。

在强化学习中,Q学习和策略梯度是两种经典的算法,适用于解决各种控制任务。下面提供一个概念性的示例来说明如何使用Q学习算法在CartPole环境中训练智能体。

环境安装

首先,确保你已经安装了gym库。如果没有,你可以通过运行pip install gym来安装它。

Q学习示例

Q学习是一种无模型的强化学习算法,可以用于学习动作价值函数(即Q函数)。以下是一个使用Q学习在CartPole环境中训练智能体的基础框架:

 import gym
import numpy as np# 初始化环境
env = gym.make('CartPole-v1')
n_actions = env.action_space.n
n_states = env.observation_space.shape[0]# 初始化Q表
Q = np.zeros((n_states, n_actions))# 超参数
alpha = 0.1  # 学习率
gamma = 0.99  # 折扣因子
epsilon = 0.1  # 探索率# 训练过程
for episode in range(1000):state = env.reset()done = Falsewhile not done:# epsilon-贪婪策略进行动作选择if np.random.rand() < epsilon:action = env.action_space.sample()  # 探索else:action = np.argmax(Q[state, :])  # 利用# 执行动作next_state, reward, done, _ = env.step(action)# Q表更新Q[state, action] = Q[state, action] + alpha * (reward + gamma * np.max(Q[next_state, :]) - Q[state, action])state = next_state# 测试智能体

请注意,这里的代码只是一个概念性的框架。实际上,由于CartPole环境的状态空间是连续的,直接使用这种方法无法高效实现。你需要对状态空间进行离散化,或使用深度Q网络(DQN)等方法来处理连续状态空间。

策略梯度

策略梯度方法直接对策略进行参数化,并通过梯度上升来优化策略。与Q学习等价值基方法不同,策略梯度方法属于策略基方法。

挑战

  • 尝试使用不同的强化学习算法,如DQN、A2C、PPO等,它们在处理连续状态空间时表现更好。
  • 调整算法的参数(如学习率、折扣因子)来优化智能体的性能。
  • 使用OpenAI Gym的其他环境来测试算法的通用性。

实现这些算法并调整参数需要对强化学习的理论和实践有深入的了解,但这也是学习和掌握强化学习非常重要的一部分。通过实验和研究,你可以更好地理解不同算法的工作原理和适用场景。

  • 玩简单的游戏(深度Q网络)

    • 环境:选择一个简单的游戏环境,如OpenAI Gym的Pong。
    • 任务:使用深度Q网络(DQN)训练一个智能体玩游戏。
    • 挑战:实现并调整高级技术如经验回放和目标网络,以提高智能体的学习效率和稳定性。

深度Q网络(Deep Q-Network, DQN)是一种将深度学习与Q学习相结合的强化学习算法,它通过使用神经网络来近似Q函数。DQN在处理具有高维状态空间的任务时表现出色,如视频游戏。下面是一个实现DQN来训练智能体玩OpenAI Gym中Pong游戏的概念性代码框架。

import numpy as np
import tensorflow as tf
from tensorflow.keras import models, layers, optimizers
import gym
import random
from collections import deque# 创建环境
env = gym.make('Pong-v0')
num_actions = env.action_space.n# 创建DQN模型
def create_model():model = models.Sequential([layers.Conv2D(32, (8, 8), strides=(4, 4), activation='relu', input_shape=(210, 160, 3)),layers.Conv2D(64, (4, 4), strides=(2, 2), activation='relu'),layers.Conv2D(64, (3, 3), activation='relu'),layers.Flatten(),layers.Dense(512, activation='relu'),layers.Dense(num_actions)])model.compile(optimizer=optimizers.Adam(), loss='mse')return model# 经验回放
class ReplayBuffer:def __init__(self, capacity):self.buffer = deque(maxlen=capacity)def add(self, experience):self.buffer.append(experience)def sample(self, batch_size):return random.sample(self.buffer, batch_size)# 创建DQN和目标网络
dqn_model = create_model()
target_model = create_model()
target_model.set_weights(dqn_model.get_weights())# 超参数
batch_size = 32
update_target_network = 1000
replay_buffer = ReplayBuffer(capacity=10000)
gamma = 0.99  # 折扣因子# 训练循环
for episode in range(1000):state = env.reset()done = Falsetotal_reward = 0while not done:# 使用epsilon-贪婪策略选择动作if np.random.rand() < epsilon:action = env.action_space.sample()else:action_values = dqn_model.predict(state[np.newaxis, :, :, :])action = np.argmax(action_values[0])next_state, reward, done, _ = env.step(action)total_reward += reward# 保存经验replay_buffer.add((state, action, reward, next_state, done))# 从经验回放中采样if len(replay_buffer.buffer) > batch_size:batch = replay_buffer.sample(batch_size)# 更新DQN模型...# 更新目标网络if episode % update_target_network == 0:target_model.set_weights(dqn_model.get_weights())# 测试智能体...

关键技术

  • 经验回放(Experience Replay):通过保存智能体的经验(状态、动作、奖励等)并随机从中抽样来训练DQN,这有助于打破经验之间的相关性,提高学习的稳定性和效率。

  • 目标网络(Target Network):使用一个独立的网络来估计TD目标,这有助于稳定学习过程。目标网络的参数定期(而非每个步骤)从DQN中复制过来。

挑战

  • 实现DQN训练过程中的细节,如从经验回放中采样并计算损失,以及如何精确更新DQN模型。
  • 调整超参数(如学习率、回放缓冲区大小、epsilon值等)以优化智能体的性能。
  • 实验不同的网络架构和高级技术(如双重DQN、优先级经验回放等)以进一步提高智能体的学习效率和稳定性。

请注意,由于Pong游戏的状态空间(即屏幕图像)非常大且连续,直接使用上述代码可能需要相当大的计算资源和时间来训练有效的模型。在实际应用中,可能需要预处理图像(如裁剪、灰度化、下采样)以减少输入的维度,以及调整网络架构以适应特定的任务。

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

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

相关文章

使用C++调用讯飞星火API的详细指南

正文&#xff1a; 科大讯飞是中国领先的人工智能公司&#xff0c;其讯飞星火API为开发者提供了丰富的接口和服务&#xff0c;支持各种语音和语言技术的应用。下面是使用C接入讯飞星火API的步骤和代码示例。 步骤一&#xff1a;注册账号并创建应用 首先&#xff0c;您需要访问科…

蓝色wordpress外贸建站模板

蓝色wordpress外贸建站模板 https://www.mymoban.com/wordpress/7.html

ES 7.12官网阅读-ILM(index lifecycle management)

官网文档&#xff1a;ILM: Manage the index lifecycle | Elasticsearch Guide [7.12] | Elastic ILM&#xff1a;管理 index 的生命周期 可以根据你的性能、弹性、保存时长需求&#xff0c;使用ILM策略来自动管理你的index&#xff1b;比如 1. 当一个index达到确定的大小&a…

保护你的 Java 代码:深入了解代码混淆

在当今数字化时代&#xff0c;软件开发领域竞争激烈&#xff0c;而保护你的代码免受恶意攻击和盗用是至关重要的。代码混淆是一种常用的技术&#xff0c;用于增加攻击者分析和逆向工程代码的难度&#xff0c;从而提高代码的安全性。本文将介绍代码混淆的基本概念和详细办法&…

element-ui badge 组件源码分享

今日简单分享 badge 组件的源码实现&#xff0c;主要从以下两个方面&#xff1a; 1、badge 组件页面结构 2、badge 组件属性 一、badge 组件页面结构 二、badge 组件属性 补充几个标签的用途&#xff1a; sub&#xff1a;下标、sup&#xff1a;上标、var 变量 代码如下&am…

<网络> 网络Socket 编程基于UDP协议模拟简易网络通信

目录 前言&#xff1a; 一、预备知识 &#xff08;一&#xff09;IP地址 &#xff08;二&#xff09;端口号 &#xff08;三&#xff09;端口号与进程PID &#xff08;四&#xff09;传输层协议 &#xff08;五&#xff09;网络字节序 二、socket 套接字 &#xff08;…

Java基础知识总结(第八篇):集合:Collection(List、Set)、Map、Collections 工具类

声明: 1. 本文根据韩顺平老师教学视频自行整理&#xff0c;以便记忆 2. 若有错误不当之处, 请指出 系列文章目录 Java基础知识总结&#xff08;第一篇&#xff09;&#xff1a;基础语法 Java基础知识总结&#xff08;第二篇&#xff09;&#x…

Kaggle:收入分类

先看一下数据的统计信息 import pandas as pd # 加载数据&#xff08;保留原路径&#xff0c;但在实际应用中建议使用相对路径或环境变量&#xff09; data pd.read_csv(r"C:\Users\11794\Desktop\收入分类\training.csv", encodingutf-8, encoding_errorsrepl…

STC8H8K64U 学习笔记 - 基础代码

STC8H8K64U 学习笔记 - 基础代码 环境说明引脚说明 基础代码电动马达蜂鸣器小蓝灯LED 灯走马灯来回灯流水灯流水逐灭灯相遇灯 独立按键 串口串口接收查询按键反馈 环境说明 该内容仅针对我自己学习的开发板做的笔记&#xff0c;在实际开发中需要针对目标电路板的原理图进行针对…

STM32-02基于HAL库(CubeMX+MDK+Proteus)GPIO输出案例(LED流水灯)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式&#xff0c;生成代码四、MDK打开生成项目&#xff0c;编写HAL库的GPIO输出代码五、运行仿真程序&#xff0c;调试代码 一、功能需求分析 在完成开发环境搭建之后&#xff0c;开始使用STM32GP…

Pandas处理缺省数据

背景&#xff1a; SQL查询数据为空或者null的字段&#xff0c;如果查询字段为或者NULL需要设置为NULL 解决方案&#xff1a; 只处理指定字段 在 Pandas 中处理缺失数据&#xff08;如 SQL 查询结果中的空字符串或 NULL 值&#xff09;可以通过 fillna() 方法来实现。您可以将…

玩机进阶教程-----高通9008线刷XML脚本修改备份 檫除的操作步骤解析

在高通9008官方固件中我们可以看到刷写需要的脚本rawprogram0.xml和辅助脚本patch0.xml&#xff0c;脚本的作用在于将固件内各个分区对应写入手机内。根据分区地址段。然后判断脚本中那些分区不写入。以下步骤将分析emmc字库为例来讲解如何将默认刷入脚本修改为备份 檫除脚本。…

2013年认证杯SPSSPRO杯数学建模B题(第二阶段)流行音乐发展简史全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 B题 流行音乐发展简史 原题再现&#xff1a; 随着互联网的发展&#xff0c;流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好&#xff0c;自动推荐并播放其它音乐。由于每个人喜好…

乐校园二手书交易管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)大学生闲置二手书在线销售

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

蓝桥杯相关算法学习(Python)

一、排序 排序算法是指将一组数据按照某种规则重新排列&#xff0c;使得数据呈现出递增或递减的顺序。常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。 1.冒泡排序 解释&#xff1a; 冒泡排序通过不断交换相邻两个元素的位置&#xff0c;使…

Redis从入门到精通(四)Redis实战:短信登录

文章目录 前言第4章 Redis实战&#xff1a;短信登录4.1 基于session实现短信登录4.1.1 短信登录逻辑梳理4.1.2 创建测试项目4.1.3 实现发送短信验证码功能4.1.4 实现用户登录功能4.1.5 实现登录拦截功能4.1.6 session共享问题 4.2 基于Redis实现短信登录4.2.1 Key-Value的结构设…

【华为OD机试】欢乐的周末(并查集和搜索算法—JavaPythonC++JS实现)

本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解代码C/C++题解代码JS题解代码四.代码讲解(Ja…

mysql语句学习

SQL Select语句完整的执行顺序&#xff1a; 1、from子句组装来自不同数据源的数据&#xff1b; &#xff08;先join在on&#xff09; 2、where子句基于指定的条件对记录行进行筛选&#xff1b; 3、group by子句将数据划分为多个分组&#xff1b; 4、使用聚集函数进行计算&a…

优化网络体验:代理IP在提升网页浏览速度和安全性方面的实践

代理IP在提升网络体验&#xff0c;特别是网页浏览速度和安全性方面&#xff0c;具有显著作用。以下是代理IP在这两方面实践应用的详细说明&#xff1a; 一、提升网页浏览速度 1. 缓存加速 许多代理服务器具备缓存功能&#xff0c;它们会对之前请求过的网页内容进行存储。当后续…

postgresql 表、索引的膨胀率监控

表膨胀监控 /* WARNING: executed with a non-superuser role, the query inspect only tables and materialized view (9.3) you are granted to read. * This query is compatible with PostgreSQL 9.0 and more */ SELECT current_database(), schemaname, tblname, bs*tbl…