波士顿房价数据集进行数据预处理和模型训练(Python)

news2024/12/26 23:22:39

目录

前言

一、数据预处理定义

二、波士顿房价数据进行数据预处理

2.1 下载波士顿房价数据集

 2.2 查看数据集的描述、特征及数据条数、特征数量

2.3 将数据读入pandas的DataFrame并转存到csv文件

2.4 查看数据集各个特征的类型以及是否有空值

2.5 对数据集做中心化度量:计算各个特征的中位数和均值,分析中位数和均值情况

2.6 对数据集做离散化度量:对第一个特征画盒图(箱线图),检查孤立点(离群点)

2.7 对所有特征画盒图(箱线图),检查孤立点(离群点)

2.8 对第一个特征排序后画散点图

2.9 对第一个特征画分位数图

2.10 对所有特征画分位数图

2.11 使用线性回归方法拟合第一个特征

2.12 使用局部回归(Loess)曲线(用一条曲线拟合散点图)方法拟合第一个特征数据

2.13 对第三个特征分两段画分位数-分位数图

2.14 画直方图,查看各个特征的分布和数据倾斜情况

2.15 对所有特征画直方图,查看数据的分布和数据倾斜情况

2.16 寻找所有特征之间的相关性并找出相关性大于 0.7 的特征对,做特征规约

三、波士顿房价数据进行模拟训练(切分数据集7:3)

3.1 将数据集按7:3的比例切分为训练集和测试集,对全部特征(不切片)使用线性回归算法进行训练,显示训练集拟合度和测试集拟合度

3.2 对数据集进行按列归一化操作,使用梯度下降算法进行训练,显示训练集拟合度和测试集拟合度

3.3 将随机森林算法用于回归问题:将波士顿房价数据集按7:3切分为训练集和测试集,使用随机森林回归器进行训练,显示训练集准确度和测试集准确度

3.4 将GBDT算法用于回归问题:将波士顿房价数据集按7:3切分为训练集和测试集,使用GBDT回归器进行训练,显示训练集准确度和测试集准确度

3.5 将岭回归算法用于回归问题:将波士顿房价数据集按7:3切分为训练集和测试集,使用岭回归算法进行训练,显示训练集拟合度和测试集拟合度;导入sklearn的MSE和MAE方法计算均方误差和平均绝对误差评价指标

3.6 测试值与预测值之间的差距

总结


前言

根据数据预处理的过程和步骤,对波士顿房价数据集进行数据预处理和模型训练(需要将数据集切分为训练集和测试集)在进行模型训练时进行数据按列归一化、特征规约/特征抽取等数据预处理操作,训练出高分模型后在测试集上进行测试,在测试集上验证准确度。这几天没有更新就是在做这个数据预处理的大作业和其他的大作业。现在总算是做完了,发上来大家一起研究讨论讨论,有什么不足的地方还请评论出来,我们一起学习~


一、数据预处理定义

数据预处理(Data Preprocessing)是指在对数据进行挖掘以前,需要对原始数据进行清理、集合和变换等一系列处理工作,以达到挖掘算法进行知识获取研究所要求的最低规范和标准。通过数据预处理工作,可以使残缺的数据完整,并将错误的数据纠正、多余的数据去除,进而将所需的数据进行数据集成。数据预处理的常见方法有数据清洗、数据集成和数据变换。

总体的流程图如下图所示:

 

二、波士顿房价数据进行数据预处理

2.1 下载波士顿房价数据集

代码:

from sklearn.datasets import load_boston

housing = load_boston()
print(housing.keys())

效果图:

 2.2 查看数据集的描述、特征及数据条数、特征数量

代码:

print(housing.DESCR)
print(housing.feature_names)

X=housing.data
print(X.shape,X)
y=housing.target
print(y.shape,y)

 效果图:

 分析:可看出波士顿房价有506条数据,13个特征。

 每个特征的中文含义如下:

CRIM: 城镇人均犯罪率
ZN: 住宅用地所占比例
INDUS: 城镇中非商业用地所占比例
CHAS: 查尔斯河虚拟变量,用于回归分析
NOX: 环保指数
RM: 每栋住宅的房间数
AGE: 1940 年以前建成的自住单位的比例
DIS: 距离 5 个波士顿的就业中心的加权距离
RAD: 距离高速公路的便利指数
TAX: 每一万美元的不动产税率
PTRATIO: 城镇中的教师学生比例
B: 城镇中的黑人比例
LSTAT: 地区中有多少房东属于低收入人群

2.3 将数据读入pandas的DataFrame并转存到csv文件

代码:

import pandas as pd
df=pd.DataFrame()
for i in range(X.shape[1]):
    df[housing.feature_names[i]]=X[:,i]
df['target']=y
df.to_csv('boston_housing.csv',index=None)
print(df)

效果图:

 分析:已经生成.csv文件,并且数据已经存储进去,打印出的效果图如上图所示。

2.4 查看数据集各个特征的类型以及是否有空值

代码:

print(df.info())

效果图:

 分析:可从上图中看到没有空值。

2.5 对数据集做中心化度量:计算各个特征的中位数和均值,分析中位数和均值情况

代码:

print(df.describe())

效果图:

 分析:可从上图中看到波士顿房价的每一个特征的均值和中位数,个特征的均值和中位数的值还差不多,只有个别特征,如CRIM、ZN这些特征偏离性严重。

2.6 对数据集做离散化度量:对第一个特征画盒图(箱线图),检查孤立点(离群点)

代码:

plt.boxplot(X[:,0],showmeans=True,meanline=True)
plt.show()

效果图:

 分析:第一个特征的孤立点很多,在均值和中位数分析时也是一样,偏离性严重。

2.7 对所有特征画盒图(箱线图),检查孤立点(离群点)

代码:

plt.figure(figsize=(15, 15))
#对所有特征(收入中位数)画盒图(箱线图)
for i in range(X.shape[1]):
    plt.subplot(4,4,i+1)
    plt.boxplot(X[:,i],showmeans = True ,meanline = True)
    #x,y坐标轴标签
    plt.xlabel(housing['feature_names'][i])
plt.subplot(4,4,14)
#绘制直方图
plt.boxplot(y, showmeans = True ,meanline = True)
#x,y坐标轴标签
plt.xlabel('target')
plt.show()

效果图:

 分析:也可看出大部分特征没有离群点,只有个别特征存在离群点。也可从每个特征的均值和中位数中看出来。

2.8 对第一个特征排序后画散点图

代码:

x_sorted=np.sort(df.iloc[:,0].values)
# 画散点图
plt.scatter([i for i in range(X.shape[0])],x_sorted)
# 画x,y坐标轴标签
plt.xlabel('Count')
plt.ylabel('sorted'+housing['feature_names'][0])
plt.show()

效果图:

 分析:从人均犯罪率来看,大部分犯罪率都几乎为0,也有些犯罪率高达80%以上。

2.9 对第一个特征画分位数图

代码:

x_sorted=np.sort(df.iloc[:,0].values)
# 画散点图
plt.scatter([i for i in range(X.shape[0])],x_sorted)
# 画中位数点
plt.scatter([round(X.shape[0]/4),round(X.shape[0]/2),round(X.shape[0]*3/4)],
           [np.quantile(x_sorted,0.25),np.quantile(x_sorted,0.5),np.quantile(x_sorted,0.75)],color='red')
# 画x,y坐标轴标签
plt.xlabel('Count')
plt.ylabel('sorted'+housing['feature_names'][0])
plt.show()

效果图:

 分析:从图可看出75%的人群犯罪率几乎为0,25%的人群犯罪率比较高。

2.10 对所有特征画分位数图

代码:

plt.figure(figsize=(10, 10))
for j in range(X.shape[1]):

    # 对第一个特征(收入中位数)数据排序
    x_sorted=np.sort(df.iloc[:,j].values)
    plt.subplot(4,4,j+1)
    # 画散点图
    plt.scatter([i for i in range(X.shape[0])],x_sorted)
    # 画中位数点
    plt.scatter([round(X.shape[0]/4),round(X.shape[0]/2),round(X.shape[0]*3/4)],
                [np.quantile(x_sorted,0.25),np.quantile(x_sorted,0.5),np.quantile(x_sorted,0.75)],color='red')
    # 画x,y坐标轴标签
    plt.xlabel('Count')
    plt.ylabel('sorted'+housing['feature_names'][j])
plt.subplot(4,4,13)
plt.show()

效果图:

 分析:从图中可分析出每个特征的趋势和占比情况。

2.11 使用线性回归方法拟合第一个特征

代码:

X_list=[i for i in range(X.shape[0])]
X_array=np.array(X_list)
# 转换为矩阵
X_reshape=X_array.reshape(X.shape[0],1)
# 排序
x_sorted=np.sort(df.iloc[:,0].values)
from sklearn import linear_model
linear=linear_model.LinearRegression()
# 进行线性回归拟合
linear.fit(X_reshape,x_sorted)
# 对训练结果做拟合度评分
print("training score: ",linear.score(X_reshape,x_sorted))
plt.scatter(X_list,x_sorted)

y_predict=linear.predict(X_reshape)
plt.plot(X_reshape,y_predict,color='red')
plt.show()

效果图:

 分析:使用线性回归拟合第一个特征得分为33.9%,拟合度不高

2.12 使用局部回归(Loess)曲线(用一条曲线拟合散点图)方法拟合第一个特征数据

代码:

X_list=[i for i in range(X.shape[0])]
X_array=np.array(X_list)
# 转换为矩阵
X_reshape=X_array.reshape(X.shape[0],1)
# 排序
x_sorted=np.sort(df.iloc[:,0].values)
from sklearn import linear_model
# linear=linear_model.LinearRegression()
linear=linear_model.Lasso(fit_intercept=False)
# 进行Lasso局部回归拟合
linear.fit(X_reshape,x_sorted)
# 对训练结果做拟合度评分
print("training score: ",linear.score(X_reshape,x_sorted))
plt.scatter(X_list,x_sorted)

y_predict=linear.predict(X_reshape)
plt.plot(X_reshape,y_predict,color='red')
plt.show()

效果图:

分析:使用局部回归曲线拟合第一个特征得分为25.3%,拟合度也不高。

2.13 对第三个特征分两段画分位数-分位数图

代码:

import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(5,5))

df_new1=df[df['INDUS']<=df['INDUS'].mean()]
df_new2=df[df['INDUS']>df['INDUS'].mean()]

part1=np.sort(df_new1.iloc[:,0].values)[:df_new2['INDUS'].count()]
part2=np.sort(df_new2.iloc[:,0].values)[:df_new2['INDUS'].count()]

plt.xlim(part2[0],part2[-1])
plt.ylim(part2[0],part2[-1])
plt.plot([part2[0],part2[-1]],[part2[0],part2[-1]])

plt.scatter(part1,part2)
plt.scatter([np.quantile(part1,0.25),np.quantile(part1,0.5),np.quantile(part1,0.75)],
            [np.quantile(part2,0.25),np.quantile(part2,0.5),np.quantile(part2,0.75)],color='red')
plt.show()

效果图:

 分析:通过分位数-分位数图可发现都在其上方,人均犯罪率75%的人群在10%以下,有25%的人群犯罪率在10%以上。

2.14 画直方图,查看各个特征的分布和数据倾斜情况

代码:

plt.hist(X[:,0],edgecolor='k')
plt.show()

效果图:

 分析:从直方图也可看出上述的情况。人均犯罪率为0的居多数。也符合现实生活,但该城市的犯罪率也是比较高的。

2.15 对所有特征画直方图,查看数据的分布和数据倾斜情况

代码:

plt.figure(figsize=(10, 10))
for i in range(X.shape[1]):
    plt.subplot(4,4,i+1)
    plt.hist(X[:,i],edgecolor='k')
plt.subplot(4,4,14)
plt.hist(y,edgecolor='k')
plt.show()

效果图:

 

2.16 寻找所有特征之间的相关性并找出相关性大于 0.7 的特征对,做特征规约

代码:

for column in df.columns:
    correlations_data=df.corr()[column].sort_values()
    for key in correlations_data.keys():
        if key != column and abs(correlations_data[key]) >= 0.7:
            print('%s vs %s:' %(column,key),correlations_data[key])

效果图:

 分析:各个特征之间相关性大于0.7的数量比较多,我们在选择特征时最好是特征之间的相关性小于0.7的,这样我们才能很好的对数据进行分析,减少不必要的特征,运算时减少时间。

三、波士顿房价数据进行模拟训练(切分数据集7:3)

3.1 将数据集按7:3的比例切分为训练集和测试集,对全部特征(不切片)使用线性回归算法进行训练,显示训练集拟合度和测试集拟合度

代码:

X_train,X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
print('y_train = ', y_train)
print('y_test = ', y_test)

#线性回归
from sklearn import linear_model
model = linear_model.LinearRegression()
# model.fit(wine_X_train,wine_y_train)

# 模型训练及评估
model.fit(X_train,y_train)
print('\nTrain score:',model.score(X_train,y_train))
print('Test score:',model.score(X_test,y_test))

效果图:

 

3.2 对数据集进行按列归一化操作,使用梯度下降算法进行训练,显示训练集拟合度和测试集拟合度

代码:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# 数据预处理,按列归一化
X_train=preprocessing.scale(X_train)
X_test=preprocessing.scale(X_test)

# 线性回归之梯度下降法
from sklearn import linear_model
model=linear_model.SGDRegressor()
# 模型训练及评估
model.fit(X_train,y_train)
print('\nTrain score:',model.score(X_train,y_train))
print('Test score:',model.score(X_test,y_test))

效果图:

 

3.3 将随机森林算法用于回归问题:将波士顿房价数据集按7:3切分为训练集和测试集,使用随机森林回归器进行训练,显示训练集准确度和测试集准确度

代码:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor

model = RandomForestRegressor()

# 训练评估
model.fit(X_train,y_train)
print('Train score:%f' % (model.score(X_train,y_train)))
print('Test score:%f' % (model.score(X_test,y_test)))

效果图:

 

3.4 将GBDT算法用于回归问题:将波士顿房价数据集按7:3切分为训练集和测试集,使用GBDT回归器进行训练,显示训练集准确度和测试集准确度

代码:

housing_X=preprocessing.scale(X)
X_train, X_test, y_train, y_test = train_test_split(housing_X, y, test_size=0.3, random_state=0)
# GBDT算法
from sklearn.ensemble import GradientBoostingRegressor
model=GradientBoostingRegressor(random_state=3)

# 模型训练及评估
model.fit(X_train,y_train)
print('Train score:%f' % (model.score(X_train,y_train)))
print('Test score:%f' % (model.score(X_test,y_test)))

效果图:

 

3.5 将岭回归算法用于回归问题:将波士顿房价数据集按7:3切分为训练集和测试集,使用岭回归算法进行训练,显示训练集拟合度和测试集拟合度;导入sklearn的MSE和MAE方法计算均方误差和平均绝对误差评价指标

代码:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

from sklearn import linear_model
model=linear_model.Ridge(alpha=0.3)

model.fit(X_train,y_train)
print("\ntraining score: ",model.score(X_train,y_train))
print("Test score: ",model.score(X_test,y_test))

y_predict=model.predict(X_test)
print("均方误差为: ",mean_squared_error(y_test,y_predict))
print("平均绝对误差为:",mean_absolute_error(y_test,y_predict))
print("R_squared:",r2_score(y_test,y_predict))

效果图:

 

3.6 测试值与预测值之间的差距

代码:

plt.plot(y_test,c="green",label="y_test")
plt.plot(y_predict,c="red",label="y_predict")
plt.legend()
plt.show()

效果图:


 总结

到这里就把我对波士顿数据集进行数据预处理和模型训练的代码和相关的效果图已经展示给大家,如果想学数据预处理的可以用python的scikit-learn包下导入就可跟着做做。还有红酒数据集、鸢尾花数据集、加州房价数据集等,这些都可以拿来练手。其中加州房价的数据比较的多,上万条数据,大家做熟练的话这个数据集是非常不错练手的。

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

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

相关文章

自动驾驶技术平台分享:百度Apollo开放平台8.0再升级,更简单,更便捷,更高效

文章目录自动驾驶技术入门&#xff0c;先看平台Appllo主要优势版本更新新特性颠覆更新“新”架构全新加入软件包管理机制加入新感知模型感知全流程开放与提效全新PnC工具链写在最后自动驾驶技术入门&#xff0c;先看平台 近年来&#xff0c;自动化驾驶的话题越来越成为热点。对…

【十天成为红帽工程师】第六天 DNS域名解析服务器

目录 一、域名解析服务器的介绍 二、DNS域名解析的过程 三、搭建DNS服务器 一、域名解析服务器的介绍 DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互…

ChatGPT:新晋CV工程师

在短短的两个星期内&#xff0c;ChatGPT 迅速成为公众聊天的焦点。超过一百万的人与OpenAI的新聊天机器人“交谈”&#xff0c;让它写诗和大学论文&#xff0c;生成创意食谱&#xff0c;创建虚拟机…它也被用来撰写新闻文章和YouTube视频的介绍。作为计算机视觉公司的机器学习工…

Qt第五十一章:Qt样式表-Qss

目录 一、盒子模型 二、选择器 三、伪状态 四、字体 五、边框 六、背景 七、边距 八、示例大全 一、盒子模型 二、选择器 选择器示例描述通用选择器*匹配所有控件类型选择器QPushButton匹配给定类型控件&#xff0c;包括子类类选择器.QPushButton匹配给定类型控件&…

【PAT甲级 - C++题解】1032 Sharing

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;PAT题解集合 &#x1f4dd;原题地址&#xff1a;题目详情 - 1032 Sharing (pintia.cn) &#x1f511;中文翻译&#xff1a;共享 &#x1f4e3;专栏定位&…

[ 代码审计篇 ] 代码审计案例详解(二) XXE代码审计案例

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

年底了,手机通讯录和相册被恶意APP获取,看我如何破局?

☆ 最近几天突然收到一个朋友的深夜短信&#xff0c;被告知如果有人发送不明信息&#xff0c;或者发送任何不明链接&#xff0c;都不要点开。我经过问朋友&#xff0c;得知下载了一个恶意的APP&#xff0c;把通讯录和手机相册获取了。 ☆ 年底了&#xff0c;很多人发愁过年没有…

ASIO IO_CONTEXT 源码整理

io_context关系图 io_context io_context::io_context(): impl_(add_impl(new impl_type(*this,ASIO_CONCURRENCY_HINT_DEFAULT, false))) { }io_context::io_context(int concurrency_hint): impl_(add_impl(new impl_type(*this, concurrency_hint 1 ? ASIO_CONCURRENCY_HI…

一千元以内的蓝牙耳机推荐,2023年最值得入手的蓝牙耳机分享

对于蓝牙耳机的选购技巧&#xff0c;我还是比较了解的&#xff0c;也知道有哪些蓝牙耳机比较好用&#xff0c;音质也好&#xff0c;但还是有很多人不知道该如何选购耳机&#xff0c;我也总是被问到蓝牙耳机挑选的相关问题&#xff0c;今天就来跟大家一起来了解了解什么蓝牙耳机…

看我这篇没人比你更懂RecyclerView的预加载

实际上&#xff0c;预拉取(prefetch)机制作为RecyclerView的重要特性之一&#xff0c;常常与缓存复用机制一起配合使用、共同协作&#xff0c;极大地提升了RecyclerView整体滑动的流畅度。 并且&#xff0c;这种特性在ViewPager2中同样得以保留&#xff0c;对ViewPager2滑动效…

【面试题】请你谈谈MySQL性能调优的方法

【面试题】请你谈谈MySQL性能调优的方法 这个问题是一个开放性问题&#xff0c;本人这一段时间参加面试&#xff08;2022.12.26&#xff09;经常被问道...... 刚刚开始我回答的很混乱&#xff01;虽然真的知道MySQL性能调优的方法&#xff0c;也做过类似的工作&#xff0c;但…

【BF算法】

BF 算法 BF 算法精讲 在学习到字符串的匹配问题时&#xff0c;了解到了BF算法和KMP算法。 对比这两个算法&#xff0c;先了解BF算法&#xff1b; 字符串匹配问题&#xff0c;比如说&#xff1a;有一个主串 “abbbcdef” &#xff0c; 子串 “bbc”&#xff0c;该问题就是在主…

Linux基础 - DNS服务基础

‍‍&#x1f3e1;博客主页&#xff1a; Passerby_Wang的博客_CSDN博客-系统运维,云计算,Linux基础领域博主 &#x1f310;所属专栏&#xff1a;『Linux基础』 &#x1f30c;上期文章&#xff1a; Linux基础 - Web服务基础 &#x1f4f0;如觉得博主文章写的不错或对你有所帮助…

共享内存和消息队列

共享内存 共享内存指 (shared memory)在多处理器的计算机系统中&#xff0c;可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器&#xff0c;这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后&#xff0c;由于其他处理器也可能要存取&am…

某程序员哀叹:有比我更惨的吗?工作6年攒了200万,高位接盘买了600万的房子,现在房子跌了100多万,每个月还要还2万房贷!...

最近这几年&#xff0c;“人间惨事”层出不穷&#xff0c;许多网友都在网上比惨&#xff0c;今天的故事主角是一位程序员。这位程序员哀叹&#xff1a;有比我更惨的吗&#xff1f;工作6年攒了200多万&#xff0c;凑了300万首付&#xff0c;在杭州未来科技城高位接盘买了600万的…

JavaScript普通函数与箭头函数有怎样的区别?

比较点 普通函数 箭头函数 具体案例 简写 / 箭头函数如果没有参数&#xff0c;同时函数体的返回值只有一句&#xff0c;则{}和return都可以省略。 1、函数简写 this指向 this总是指向调用它的对象&#xff0c;如果作为构造函数&#xff0c;它指向创建的对象实例 箭头…

【MySQL】深入理解数据库事务

文章目录优秀借鉴1、事务由来2、何为ACID2.1、Atomicity原子性2.2、Consistency一致性2.3、Isolation隔离性2.4、Durability持久性3、聊回事务3.1、概念3.2、语法3.2.1、开启事务3.2.2、提交事务3.2.3、回滚事务4、隔离级别4.1、引入4.2、并发问题4.2.1、脏读4.2.2、不可重复读…

Spring Cloud alibaba 使用Nacos配置中心

依赖管理 Spring Cloud Alibaba BOM 包含了它所使用的所有依赖的版本 请将下面的 BOM 添加到 pom.xml 中的 部分。 这将允许我们省略任何Maven依赖项的版本&#xff0c;而是将版本控制委派给BOM。 <dependencyManagement><dependencies><dependency><gr…

2022年底了,你们公司还好吗?我这里不太好

以下这些也是和几个朋友聊天的时候慢慢聊出来的&#xff0c;不一定真实啊&#xff0c;当做大家开发累了以后的一点调味剂吧 一、宇宙厂 1.宇宙人员成本优化计划&#xff0c;随着各个业务确认了优化目标&#xff0c;将在接下来陆续开展。 某中台确认了指标&#xff0c;将在“在职…

力扣刷题记录——121买卖股票的最佳时机 和125. 验证回文串

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《121.买卖股票的最佳时机和125. 验证回文串》。 目录 12…