Python机器学习(十)经典算法大全

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2021.12.12

由于knn算法涉及到距离的概念,KNN算法需要先进行归一化处理

fromsklearn.preprocessingimportStandardScalerstandardScaler=StandardScaler()standardScaler.fit(X_train)X_train_standard=standardScaler.transform(X_train)X_test_standard=standardScaler.transform(X_test)归一化之后送入模型进行训练

fromsklearn.neighborsimportKNeighborsClassifierknn_clf=KNeighborsClassifier(n_neighbors=8)knn_classifier.fit(X_train_standard,y_train)y_predict=knn_clf.predict(X_test_standard)#默认的预测指标为分类准确度knn_clf.score(X_test,y_test)1.2网格搜索GridSearchCV使用网格搜索来确定KNN算法合适的超参数

fromsklearn.neighborsimportKNeighborsClassifierknn_clf=KNeighborsClassifier(n_neighbors=8)knn_classifier.fit(X_train_standard,y_train)y_predict=knn_clf.predict(X_test_standard)#默认的预测指标为分类准确度knn_clf.score(X_test,y_test)1.3交叉验证GridSearchCV本身就包括了交叉验证,也可自己指定参数cv默认GridSearchCV的KFold平分为3份

自己指定交叉验证,查看交叉验证成绩fromsklearn.model_selectionimportcross_val_score#默认为分成3份cross_val_score(knn_clf,X_train,y_train,cv=5)这里默认的scoring标准为accuracy有许多可选的参数,具体查看官方文档

封装成函数,在fit完模型之后,一次性查看多个评价指标的成绩这里选的只是针对分类算法的指标,也可以是针对回归,聚类算法的评价指标

defcv_score_train_test(model):num_cv=5score_list=["accuracy","f1","neg_log_loss","roc_auc"]forscoreinscore_list:print(score,"\ttrain:",cross_val_score(model,X_train,y_train,cv=num_cv,scoring=score).mean())print(score,"\ttest:",cross_val_score(model,X_test,y_test,cv=num_cv,scoring=score).mean())2.线性回归2.1简单线性回归fromsklearn.linear_modelimportLinearRegressionlinreg=LinearRegression()linreg.fit(X_train,y_train)#查看截距和系数printlinreg.intercept_printlinreg.coef_lin_reg.score(X_test,y_test)y_predict=linreg.predict(X_test)2.2多元线性回归在更高维度的空间中的“直线”,即数据不只有一个维度,而具有多个维度

代码和上面的简单线性回归相同

使用梯度下降法之前,需要对数据进行归一化处理

回到顶部

SGD_reg

fromsklearn.linear_modelimportSGDRegressorsgd_reg=SGDRegressor(max_iter=100)sgd_reg.fit(X_train_standard,y_train_boston)sgd_reg.score(X_test_standard,y_test_boston)3.2确定梯度下降计算的准确性以多元线性回归的目标函数(损失函数)为例

比较使用数学推导式(得出具体解析解)的方法和debug的近似方法的比较

PCA算法不能在前处理进行归一化处理,否则将会找不到主成分

#对于二维的数据样本来说fromsklearn.decompositionimportPCApca=PCA(n_components=1)#指定需要保留的前n个主成分,不指定为默认保留所有pca.fit(X)比如,要使用KNN分类算法,先进行数据的降维操作

fromsklearn.decompositionimportPCApca=PCA(n_components=2)#这里也可以给一个百分比,代表想要保留的数据的方差占比pca.fit(X_train)#训练集和测试集需要进行相同降维处理操作X_train_reduction=pca.transform(X_train)X_test_reduction=pca.transform(X_test)#降维完成后就可以送给模型进行拟合knn_clf=KNeighborsClassifier()knn_clf.fit(X_train_reduction,y_train)knn_clf.score(X_test_reduction,y_test)4.2降维的维数和精度的取舍指定的维数,能解释原数据的方差的比例

pca.explained_variance_ratio_#指定保留所有的主成分pca=PCA(n_components=X_train.shape[1])pca.fit(X_train)pca.explained_variance_ratio_#查看降维后特征的维数pca.n_components_把数据降维到2维,可以进行scatter的可视化操作

先使用pca降维,之后再反向,升维

fromsklearn.decompositionimportPCApca=PCA(0.7)pca.fit(X)pca.n_components_X_reduction=pca.transform(X)X_inversed=pca.inverse_transform(X_reduction)5.多项式回归与模型泛化多项式回顾需要指定最高的阶数,degree

拟合的将不再是一条直线

只有一个特征的样本,进行多项式回归可以拟合出曲线,并且在二维平面图上进行绘制

而对于具有多个特征的样本,同样可以进行多项式回归,但是不能可视化拟合出来的曲线

GridSearchCV:用于寻找给定模型的最优的参数

Pipeline:用于将几个流程整合在一起(PolynomialFeatures()、StandardScaler()、LinearRegression())

如果非要把上两者写在一起,应该把指定好param_grid参数的grid_search作为成员,传递给Pipeline

首先明确:

模型泛化是为了解决模型过拟合的问题

岭回归是模型正则化的一种处理方式,也称为L2正则化

岭回归是线性回归的一种正则化处理后的模型(作为pipeline的成员使用)

fromsklearn.linear_modelimportRidgefromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportPipelinedefRidgeRegression(degree,alpha):returnPipeline([("poly",PolynomialFeatures(degree=degree)),("std_scaler",StandardScaler()),("ridge_reg",Ridge(alpha=alpha))])ridge_reg=RidgeRegression(degree=20,alpha=0.0001)ridge_reg.fit(X_train,y_train)y_predict=ridge_reg.predict(X_test)mean_squared_error(y_test,y_predict)代码中:

alpha为L2正则项前面的系数,代表的含义与LASSO回归相同

alpha越小,越倾向于选择复杂模型

alpha越大,越倾向于选择简单模型

Ridge回归、LASSO回归的区别

Ridge:更倾向于保持为曲线

LASSO:更倾向于变为直线(即趋向于使得部分theta变成0,因此有特征选择的作用)

岭回归是模型正则化的一种处理方式,也称为L1正则化

fromsklearn.linear_modelimportLassofromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportPipelinedefLassoRegression(degree,alpha):returnPipeline([("poly",PolynomialFeatures(degree=degree)),("std_scaler",StandardScaler()),("lasso_reg",Lasso(alpha=alpha))])lasso_reg=LassoRegression(3,0.01)lasso_reg.fit(X_train,y_train)y_predict=lasso_reg.predict(X_test)mean_squared_error(y_test,y_predict)6.逻辑回归将样本特征与样本发生的概率联系起来。

既可看做回归算法,也可分类算法

通常作为二分类算法

plot_decision_boundary(poly_log_reg,axis=[-4,4,-4,4])plt.scatter(X[y==0,0],X[y==0,1])plt.scatter(X[y==1,0],X[y==1,1])plt.show()6.3逻辑回归中的正则化项和惩罚系数C公式为:

C*J(θ)+L1

C*J(θ)+L2

上式中:

C越大,L1、L2的作用越弱,模型越倾向复杂

C越小,相对L1、L2作用越强,J(θ)作用越弱,模型越倾向简单

scikit封装了OvOOvR这两个类,方便其他二分类算法,使用这两个类实现多分类

例子中:log_reg是已经创建好的逻辑回归二分类器

fromsklearn.multiclassimportOneVsRestClassifierovr=OneVsRestClassifier(log_reg)ovr.fit(X_train,y_train)ovr.score(X_test,y_test)fromsklearn.multiclassimportOneVsOneClassifierovo=OneVsOneClassifier(log_reg)ovo.fit(X_train,y_train)ovo.score(X_test,y_test)7.支撑向量机SVM注意

由于涉及到距离的概念,因此,在SVM拟合之前,必须先进行数据标准化

支撑向量机要满足的优化目标是:

使“最优决策边界”到与两个类别的最近的样本的距离最远

即,使得margin最大化

分为:

HardMarginSVM

SoftMarginSVM

为了改善SVM模型的泛化能力,需要进行正则化处理,同样有L1、L2正则化

正则化即弱化限定条件,使得某些样本可以不再Margin区域内

惩罚系数C是乘在正则项前面的

min12||w||2+C∑i=1mξi,L1正则项min12||w||2+C∑i=1mξi,L1正则项

min12||w||2+C∑i=1mξ2i,L2正则项min12||w||2+C∑i=1mξi2,L2正则项

变化规律:

C越大,容错空间越小,越偏向于HardMargin

C越小,容错空间越大,越偏向于SoftMargin

fromsklearn.preprocessingimportStandardScalerstandardScaler=StandardScaler()standardScaler.fit(X)X_standard=standardScaler.transform(X)fromsklearn.svmimportLinearSVCsvc=LinearSVC(C=1e9)svc.fit(X_standard,y)简洁起见,可以用Pipeline包装起来

fromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportLinearSVCfromsklearn.pipelineimportPipelinedefLinear_svc(C=1.0):returnPipeline([("std_scaler",StandardScaler()),("linearSVC",LinearSVC(C=C))])linear_svc=Linear_svc(C=1e5)linear_svc.fit(X,y)7.3多项式特征SVM明确:使用多项式核函数的目的都是将数据升维,使得原本线性不可分的数据变得线性可分

在SVM中使用多项式特征有两种方式

使用线性SVM,通过pipeline将**poly、std、linear_svc**三个连接起来

使用多项式核函数SVM,则Pipeline只用包装std、kernelSVC两个类

fromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportSVCfromsklearn.pipelineimportPipelinedefRBFkernelSVC(gamma=1.0):returnPipeline([("std_standard",StandardScaler()),("svc",SVC(kernel="rbf",gamma=gamma))])svc=RBFkernelSVC(gamma=1.0)svc.fit(X,y)超参数gammaγγ规律:

gamma越大,高斯核越“窄”,头部越“尖”

gamma越小,高斯核越“宽”,头部越“平缓”,图形叉得越开

若gamma太大,会造成过拟合

若gamma太小,会造成欠拟合,决策边界变为直线

指定margin区域垂直方向上的距离epsilon

通用可以分为线性SVR和多项式SVR

fromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportLinearSVRfromsklearn.svmimportSVRfromsklearn.pipelineimportPipelinedefStandardLinearSVR(epsilon=0.1):returnPipeline([("std_scaler",StandardScaler()),("linearSVR",LinearSVR(epsilon=epsilon))])svr=StandardLinearSVR()svr.fit(X_train,y_train)svr.score(X_test,y_test)#可以使用cross_val_score来获得交叉验证的成绩,成绩更加准确8.决策树非参数学习算法、天然可解决多分类问题、可解决回归问题(取叶子结点的平均值)、非常容易产生过拟合

可以考虑使用网格搜索来寻找最优的超参数

划分的依据有基于信息熵、基于基尼系数(scikit默认用gini,两者没有特别优劣之分)

ID3、C4.5都是使用“entropy"评判方式

CART(ClassificationandRegressionTree)使用的是“gini"评判方式

常用超参数:

max_depth

min_samples_split(设置最小的可供继续划分的样本数量)

min_samples_leaf(指定叶子结点最小的包含样本的数量)

max_leaf_nodes(指定,最多能生长出来的叶子结点的数量)

fromsklearn.treeimportDecisionTreeClassifierdt_clf=DecisionTreeClassifier(max_depth=2,criterion="gini")#dt_clf=DecisionTreeClassifier(max_depth=2,criterion="entropy")dt_clf.fit(X,y)8.2回归fromsklearn.treeimportDecisionTreeRegressordt_reg=DecisionTreeRegressor()dt_reg.fit(X_train,y_train)dt_reg.score(X_test,y_test)#计算的是R2值9.集成学习和随机森林9.1HardVotingClassifier把几种分类模型包装在一起,根据每种模型的投票结果来得出最终预测类别

可以先使用网格搜索把每种模型的参数调至最优,再来Voting

所以,每种模型都应该能估计结果的概率

逻辑回归

KNN

决策树(叶子结点一般不止含有一类数据,因此可以有概率)

SVM中的SVC(可指定probability参数为True)

True:放回取样

False:不放回取样

(2)这类集成学习方法需要指定一个baseestimator

(3)放回取样,会存在oob(outofbag)的样本数据,比例约37%,正好作为测试集

obb_score=True/False,是否使用oob作为测试集

(4)产生差异化的方式:

只针对特征进行随机采样:randomsubspace

既针对样本,又针对特征随机采样:randompatches

random_subspaces_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=500,bootstrap=True,oob_score=True,n_jobs=-1,max_features=1,bootstrap_features=True)random_subspaces_clf.fit(X,y)random_subspaces_clf.oob_score_random_patches_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=100,bootstrap=True,oob_score=True,n_jobs=-1,max_features=1,bootstrap_features=True)random_patches_clf.fit(X,y)random_patches_clf.oob_score_参数解释:

max_samples:如果和样本总数一致,则不进行样本随机采样

max_features:指定随机采样特征的个数(应小于样本维数)

bootstrap_features:指定是否进行随机特征采样

oob_score:指定是都用oob样本来评分

bootstrap:指定是否进行放回取样

随机森林是指定了BaseEstimator为DecisionTree的Bagging集成学习模型

已经被scikit封装好,可以直接使用

特点:

决策树在结点划分上,使用随机的特征和阈值

提供了额外的随机性,可以抑制过拟合,但会增大Bias(偏差)

具有更快的训练速度

fromsklearn.ensembleimportExtraTreesRegressoret_clf=ExtraTreesClassifier(n_estimators=500,bootstrap=True,oob_score=True,random_state=666)et_clf.fit(X,y)et_clf.oob_score_9.5AdaBoosting每个子模型模型都在尝试增强(boost)整体的效果,通过不断的模型迭代,更新样本点的权重

AdaBoosting没有oob的样本,因此需要进行train_test_split

需要指定BaseEstimator

fromsklearn.ensembleimportAdaBoostClassifierfromsklearn.treeimportDecisionTreeClassifierada_clf=AdaBoostClassifier(DecisionTreeClassifier(max_depth=2),n_estimators=500)ada_clf.fit(X_train,y_train)ada_clf.score(X_test,y_test)9.6GradientBoosting训练一个模型m1,产生错误e1

针对e1训练第二个模型m2,产生错误e2

针对e2训练第二个模型m3,产生错误e3

......

最终的预测模型是:m1+m2+m3+...m1+m2+m3+...

GradientBoosting是基于决策树的,不用指定BaseEstimator

fromsklearn.ensembleimportGradientBoostingClassifiergb_clf=GradientBoostingClassifier(max_depth=2,n_estimators=30)gb_clf.fit(X_train,y_train)gb_clf.score(X_test,y_test)总结上述提到的集成学习模型,不仅可以用于解决分类问题,也可解决回归问题

fromsklearn.ensembleimportBaggingRegressorfromsklearn.ensembleimportRandomForestRegressorfromsklearn.ensembleimportExtraTreesRegressorfromsklearn.ensembleimportAdaBoostRegressorfromsklearn.ensembleimportGradientBoostingRegressor例子:决策树和AdaBoosting回归问题效果对比

本例的notebook笔记文件:git仓库

实例代码:

frommatplotlibimportpyplotaspltfromsklearn.metricsimportaccuracy_scoreimportnumpyasnpimportseabornassns;sns.set()%matplotlibinline10.1传统K-means聚类构造数据集

fromsklearn.datasets.samples_generatorimportmake_blobsX,y_true=make_blobs(n_samples=300,centers=4,cluster_std=0.60,random_state=0)plt.scatter(X[:,0],X[:,1],s=50)fromsklearn.clusterimportKMeanskmeans=KMeans(n_clusters=4)kmeans.fit(X)y_kmeans=kmeans.predict(X)绘制聚类结果,画出聚类中心

构造数据

fromsklearn.datasetsimportmake_moonsX,y=make_moons(200,noise=0.05,random_state=0)传统kmeans聚类失败的情况

fromsklearn.datasetsimportload_digitsdigits=load_digits()进行聚类

kmeans=KMeans(n_clusters=10,random_state=0)clusters=kmeans.fit_predict(digits.data)kmeans.cluster_centers_.shape(10,64)可以将这些族中心点看做是具有代表性的数字

通过流形学习

投影到低维空间

且k-means算法只对简单的,分离性能好的,并且是圆形分布的数据有比较好的效果

本例中所有代码的实现已上传至git仓库

通过实例来观察K-means算法的缺陷

半径是根据最远的点与族中心点的距离算出

下面用一个函数将这个聚类圆圈可视化

在默认参数设置的、数据简单可分的情况下,

GMM的分类效果与k-means基本相同

probs=gmm.predict_proba(X)print(probs[:5].round(3))[[0.0.4690.0.531][1.0.0.0.][1.0.0.0.][0.0.0.1.][1.0.0.0.]]编写绘制gmm绘制边界的函数

一个GMM拟合的结果并不是一个聚类模型,而是描述数据分布的生成概率模型。

非线性边界的情况

分布函数的生成模型可以生成新的,与输入数据类似的随机分布函数(生成新的数据点)

用GMM拟合原始数据获得的16个成分生成的400个新数据点

赤池信息量准则(Akaikeinformationcriterion)AIC

贝叶斯信息准则(Bayesianinformationcriterion)BIC

常用指标选择方式

平衡分类问题:

分类准确度、ROC曲线

类别不平衡问题:

精准率、召回率

对于二分类问题,常用的指标是f1、roc_auc

多分类问题,可用的指标为f1_weighted

一般用于平衡分类问题(每个类比的可能性相同)

fromsklearn.metricsimportaccuracy_scoreaccuracy_score(y_test,y_predict)#(真值,预测值)2.混淆矩阵、精准率、召回率精准率:正确预测为1的数量,占,所有预测为1的比例

召回率:正确预测为1的数量,占,所有确实为1的比例

#先真实值,后预测值fromsklearn.metricsimportconfusion_matrixconfusion_matrix(y_test,y_log_predict)fromsklearn.metricsimportprecision_scoreprecision_score(y_test,y_log_predict)fromsklearn.metricsimportrecall_scorerecall_score(y_test,y_log_predict)多分类问题中的混淆矩阵

多分类结果的精准率

fromsklearn.metricsimportprecision_scoreprecision_score(y_test,y_predict,average="micro")多分类问题中的混淆矩阵

fromsklearn.metricsimportconfusion_matrixconfusion_matrix(y_test,y_predict)移除对角线上分类正确的结果,可视化查看其它分类错误的情况同样,横坐标为预测值,纵坐标为真实值

cfm=confusion_matrix(y_test,y_predict)row_sums=np.sum(cfm,axis=1)err_matrix=cfm/row_sumsnp.fill_diagonal(err_matrix,0)plt.matshow(err_matrix,cmap=plt.cm.gray)plt.show()3.F1-scoreF1-score是精准率precision和召回率recall的调和平均数

fromsklearn.metricsimportf1_scoref1_score(y_test,y_predict)4.精准率和召回率的平衡可以通过调整阈值,改变精确率和召回率(默认阈值为0)

拉高阈值,会提高精准率,降低召回率

降低阈值,会降低精准率,提高召回率

#精确率召回率曲线plt.plot(precisions,recalls)plt.show()将精准率和召回率曲线,绘制在同一张图中

注意,当取“最大的”threshold值的时候,精准率=1,召回率=0,

但是,这个最大的threshold没有对应的值

因此thresholds会少一个

TPR:TruePositiverate

FPR:FalsePositiveRateFPR=FPTN+FPFPR=FPTN+FP

绘制ROC曲线

fromsklearn.metricsimportroc_curvefprs,tprs,thresholds=roc_curve(y_test,decision_scores)plt.plot(fprs,tprs)plt.show()计算ROC曲线下方的面积的函数

roc_area_under_curve_score

fromsklearn.metricsimportroc_auc_scoreroc_auc_score(y_test,decision_scores)曲线下方的面积可用于比较两个模型的好坏

总之,上面提到的decision_score是一个概率值,如01二分类问题,应该是将每个样本预测为1的概率,

如某个样本的y_test为1,y_predict_probablity为0.875

每个测试样本对应一个预测的概率值

通常在模型fit完成之后,都会有相应的得到概率的函数,如

model.predict_prob(X_test)

model.decision_function(X_test)

fromsklearn.metricsimportmean_squared_errormean_squared_error(y_test,y_predict)2.平均绝对值误差MAEfromsklearn.metricsimportmean_absolute_errormean_absolute_error(y_test,y_predict)3.均方根误差RMSEscikit中没有单独定于均方根误差,需要自己对均方误差MSE开平方根

fromsklearn.metricsimportr2_scorer2_score(y_test,y_predict)5.学习曲线观察模型在训练数据集和测试数据集上的评分,随着训练数据集样本数增加的变化趋势。

THE END
1.《在Python中用turtle模块画图——导入turtle模块》导入turtle绘图模块是“在Python中用turtle模块画图”这一章节的第一课,也是学生接触turtle绘图的第一课,因此在教学时将turtle绘图类比海龟在沙滩爬行,帮助学生理解;借助动画展示turtle模块的导入命令,画布画笔设置以及控制命令。https://wkzy.scjks.net/course/item/76562
2.《中学生可以这样学Python》(董付国应根球)简介书评作者简介董付国,副教授,自2000年开始一直任教于山东工商学院计算机学院,先后出版《Python程序设计》、《Python程序设计基础》、《Python程序设计(第2版)》、《Python可以这样学》、《Python程序设计开发宝典》、《中学生可以这样学Python》等系列教材,多次获得校级教学优秀效果一等奖,分别使用C#和Python开发过多套适用于油田...http://product.dangdang.com/25183060.html
1.Pythonmatplotlib的绘图风格效果展示大全pythonplt风格Python matplotlib的绘图风格效果展示大全 目前正在学习Python的数据可视化,接触到了matplotlib.pyplot,这里可以看个人爱好设置各种展示效果,也有21种不同的系统绘图风格,鉴于在网上无法找到各个风格的实际效果,且一个一个试验过于麻烦,故把所有绘图风格效果保存下来,方便选择...https://blog.csdn.net/weixin_42968458/article/details/82889736
2.python画图代码大全python画图代码大全 Python是一种高级编程语言,也是非常适合用来进行数据可视化和图形绘制的语言之一。无论是绘制简单的线条图、柱状图、散点图,还是复杂的3D图形、动画图等,Python都可以轻松胜任。下面将介绍一些常用的Python画图代码,以供参考。 1. 导入绘图库 ```python import matplotlib.pyplot as plt import ...http://www.cn86.cn/news/61056.html
3.Python画图常用代码总结大全(20个画图代码现拿现用)pythonPython画图常用代码总结大全(20个画图代码现拿现用)更新时间:2023年06月14日 11:55:26 作者:Python正在输入中... Python是一种高级编程语言,拥有丰富的图形库,可以完成绘制各种类型的图形任务,下面这篇文章主要给大家介绍了关于Python画图常用代码的相关资料,文中介绍的这20个画图代码可以现拿现用,需要的朋友可以...https://www.jb51.net/python/288392fd6.htm
4.python画图代码大全简单51CTO博客已为您找到关于python画图代码大全简单的相关内容,包含IT学习相关文档代码介绍、相关教程视频课程,以及python画图代码大全简单问答内容。更多python画图代码大全简单相关解答可以来51CTO博客参与分享和学习,帮助广大IT技术人实现成长和进步。https://blog.51cto.com/topic/d4431d1420336f2.html
5.Python简单的画爱心代码,完整的Python画爱心代码大全物联沃大家好,本文将围绕用python画一个心形怎么编程展开说明,python简单的画图代码爱心是一个很多人都想弄明白的事情,想搞清楚python画爱心代码大全需要先了解以下几个事情。 python爱心源代码集锦(18款) 本文目录: 一、代码效果预览索引图 二、爱心源代码集锦 (1)、爱心图形1(弧线型)(显示的文字写在代码里) (2)、...https://www.iotword.com/20244.html
6.Python常用画图代码(折线图柱状图饼图)?简单记录一下最简单常用的三种论文插图的python画图代码,以作备忘。 ? 有很多很牛b的作图教程,我也学不来,就扔给大家自己学吧: 如何在论文中画出漂亮的插图?[1] 折线图 代码 代码语言:javascript 复制 importnumpyasnpimportmatplotlib.pyplotasplt ...https://cloud.tencent.com/developer/article/1780434
7.Python绘图,我只用Matplotlib(一)说到数据分析,Python 完全能够胜任这方面的工作。Python 究竟如何在数据分析领域做到游刃有余?因为它有“四板斧”,分别是Matplotlib、NumPy、SciPy/Pandas。Matplotlib 是画图工具,NumPy 是矩阵运算库,SciPy 是数学运算工具,Pandas 是数据处理的工具。 1 为什么选择 Matplotlib? https://www.jianshu.com/p/ebe721199d72