网站性能检测评分
注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
python3算法
一步一步教你用python编写感知器算法 公司视频课程
感知器算法是最简单的人工神经网络形式之一。感知器是一个单神经元的模型,可以用于两个类别的分类问题,也能为以后开发更大的神经网络奠定基础。在本教程中,你将了解到如何利用 Python 从头开始实现感知器算法。
在完成本教程后,你将学会:
如何训练感知器的网络权重
如何利用感知器做出预测
如何对于现实世界的分类问题实现感知器算法
让我们开始吧。
概述
本节简要介绍了感知器算法和 Sonar 数据集,我们将会在后面应用。
感知器算法
感知器的灵感来自于被称为神经元的单个神经细胞的信息处理过程。
神经元通过其树突接受输入信号,并将电信号向下传递到细胞体内。
通过类似的方式,感知器从训练数据的样本中接受输入信号,训练数据被加权并在称为激活(activation)的线性方程中进行组合。
然后,使用诸如阶跃传递函数(step transfer function)的传递函数将激活变换为输出值或预测。
以这种方式,感知器是用于具有两个类(0 和 1)的问题的分类算法,其中可以使用线性方程来分离这两个类。
它与以类似方式进行预测的线性回归和 logistic 回归密切相关(例如输入的加权和)。
感知器算法的权重必须使用随机梯度下降算法从训练数据中估计。
随机梯度下降
梯度下降是通过跟随成本函数(cost function)的梯度来最小化函数的过程。
这涉及了解成本的形式以及导数,使得从给定的点你可以知道梯度并且可以在该方向上移动,比如下坡到最小值。
在机器学习中,我们可以使用一种技术来评估和更新称为随机梯度下降的每次迭代的权重,以最小化我们的训练数据模型的误差。
这种优化算法的工作方式是每次向模型显示每个训练实例。模型对训练实例进行预测,计算误差并更新模型以便减少下一预测的误差。
该过程可以用于在模型中找到能使训练数据上模型误差最小的权重集合。
对于感知器算法,每次迭代,权重(w)使用以下等式更新:
其中w是正在被优化的权重,learning_rate是必须配置的学习速率(例如 0.01),(expected - predicted)是在归因于权重的训练数据上的模型的预测误差,x是输入值。
Sonar 数据集
我们将在本教程中使用的数据集是 Sonar 数据集。
这是一个描述了声呐啾啾叫声并返回不同服务的试探的数据集。60 个输入变量是在不同角度的返回强度。这是一个二元分类问题,需要一个模型来区分金属圆柱体和岩石。
它是一个很好理解的数据集。所有的变量是连续的,通常在 0 到 1 的范围内。因此,我们不必对输入数据进行归一化,这通常是使用感知器算法的一个好地方。输出变量是字符串「M」(表示矿 mine)和「R」(表示岩石 rock),我们需要将其转换为整数 1 和 0。
通过在数据集(M 或 Mines)中预测具有最多观测值的类,零规则算法(Zero Rule Algorithm)可以实现 53%的精度。
你可以在 UCI Machine Learning repository:
https://archive.ics.uci.edu/ml/datasets/Connectionist+Bench+(Sonar,+Mines+vs.+Rocks))中了解有关此数据集的更多信息。你也可以免费下载数据集,并将其放在工作目录中,文件名为 sonar.all-data.csv。
教程
这个教程分为三个部分:
1.作出预测
2.训练网络权重
3.将 Sonar 数据集建模
这些步骤将带给你实现和应用感知器算法到你自己的分类预测建模问题的基础。
1. 作预测
第一步是开发一个可以进行预测的函数。
这将会需要在随机梯度下降中的候选权重值的评估以及在模型被最终确定之后,我们希望开始对测试数据或新数据进行预测。
下面是一个名为 predict() 的函数,用于预测给定一组权重的行的输出值。
第一个权重始终是偏差,因为它是独立的,不负责特定的输入值。
我们可以设计一个小数据集来测试我们的预测函数。
我们也可以使用之前准备好的权重来为这个数据集做预测。
将所有这些集中起来,我们就可以测试我们的 predict() 函数了,如下:
该函数有两个输入值 X1、X2 和三个权重参数 bias、w1 及 w2。该问题的激活函数有如下的形式:
或者,我们能够手动地选择权重值:
运行这个函数,我们将会得到与期望输出值 (**y**) 相符合的预测值。
现在,我们已经准备好使用随机梯度下降法(SGD)来最优化我们的权重值。
2. 训练神经权重
我们可以使用 SGD,来估计出对于训练集的权重值。
SGD 有两个参数:
学习率(Learning Rate):用来限制每次更新中权重项修正值的大小。
迭代次数(Epochs):在训练集上训练同时更新权重项的次数。
这两个参数,和训练集一起,都将会是预测函数的输入参数。
在这个函数中,我们需要运行三个循环:
1. 对于每次迭代进行循环;
2. 对于一次迭代中,训练集的每一行进行循环;
3. 对于每一行中,每一个值进行循环。
如你所见,我们在每一次迭代中,对训练集每一行中每一个权值都进行更新。
我们基于现有情况模型预测的「误差」,来对权重值进行更新。误差,是由候选权值计算出来的预测值与(数据集中的)期望值的差。
对每一个输入属性,都有一个权重值,并且这些权_重值都连续更新_。如:
偏差项以一种相似的方式更新,不过因为它本身就不与特定的输入值有关,因而在式子中没有输入值的项。
现在,我们把所有的内容组合到一起。如下所示,在 train_weights() 函数中,它使用 SGD 方法,计算对于给定训练集的权重值。
如你所见,我们也在每次迭代中,记录下了平方误差之和(这始终是一个正值)。因而我们能在外循环的每次迭代中,print 一些有用的信息。
我们也可以在我们上面创建的小规模数据集上,对该函数进行测试。
我们将使用 0.1 的学习率和 5 次迭代,也就是把参数在训练集上更新五次,来训练这个模型。
运行这个案例,它将会在每一次迭代结束后,显示出该次迭代后的平方误差和,并在完成所有迭代后,显示最后的权重集。
你可以看到,这个算法很快学会了「解决」这个问题。
现在我们来试试看,如何在一个实际的数据集上应用这个算法。
3. 对声纳数据集进行建模
在这一节中,我们将使用 SGD 方法,对一个声纳数据集,训练一个感知器模型。
在该例子中,我们假定,在当前的工作目录下,有一名为sonar.all-data.csv 的文件,存储着该数据集。
首先该数据集被载入。数据集中字符串格式的数据被转换为数值型,同时输出值从字符串被转换了 0 或 1 的两个整数值。
通过 load_csv(), str_column_to_float()及str_column_to_int() 三个函数,我们实现了对数据集的读取及预处理。
我们使用「k 倍交叉验证法」(k-fold cross validation)来对学习后的模型在未知数据集上的表现进行评估。也就是说,我们需要建立 k 个模型并估计各模型的平均误差。分类准确性将被用于模型的评估工作中。这些工作在 cross_validation_split(), accuracy_metric() 及 evaluate_algorithm() 函数中被完成。
我们将会使用上面设置的 predict() 和 train_weights()函数来训练该模型。同时,我们将会用一个新函数perceptron() 来将它们组合在一起。如下是完整的例子。
在交叉验证中,我们取 k 为 3——也就是对每一块数据,都有 208/3 约 70 个记录,会在每次迭代中被用于计算。我们取 0.1 的学习率及 500 的训练迭代次数,来训练模型。
你可以尝试你自己的参数,并且看看你的结果能否战胜我的分数。运行这个例子,将会显示对 3 倍交叉验证中每一块的分数,以及平均的分类正确率。
我们可以看到,这个正确率约为 73%,高于由仅考虑主要类的零规则算法(Zero Rule Algorithm)得到的 50% 的正确率基准值。
拓展
这一节列举了关于该入门指导的拓展内容,你可以考虑深入探究其中的一些内容。
调试样例参数。尝试着去调整包括学习率、迭代次数乃至于数据预处理的方法,以使模型在该数据集上,得到更高的分数。
批量化进行随机梯度下降。修改随机梯度下降的算法,使得我们能记录下每一次迭代的更新值,并且在迭代结束的时候再基于记录的更新值来更新权重值。
额外的分类问题。将文中提到的技巧,应用于 UCI 机器学习数据集中其他数据。
回顾
在该教程中,你学习了如何从零开始,用 Python 实现,基于随机梯度下降的感知器算法。
你学会了:
如何对一个二元分类问题进行预测。
如何使用随机梯度下降,对一系列的权重值进行最优化。
如何将这个技巧,应用到一个实际的分类预测模型。
关注小编 私信 python资料 获取学习资料
这可能是史上最全的 Python 算法集!| 技术头条 营销视频课程
本文是一些机器人算法(特别是自动导航算法)的Python代码合集。
其主要特点有以下三点:选择了在实践中广泛应用的算法;依赖最少;容易阅读,容易理解每个算法的基本思想。希望阅读本文后能对你有所帮助。
前排友情提示,文章较长,建议收藏后再看。
目录
环境需求怎样使用本地化扩展卡尔曼滤波本地化无损卡尔曼滤波本地化粒子滤波本地化直方图滤波本地化映射高斯网格映射光线投射网格映射k均值物体聚类圆形拟合物体形状识别SLAM迭代最近点匹配EKF SLAMFastSLAM 1.0FastSLAM 2.0基于图的SLAM路径规划动态窗口方式基于网格的搜索迪杰斯特拉算法A*算法势场算法模型预测路径生成路径优化示例查找表生成示例状态晶格规划均匀极性采样(Uniform polar sampling)偏差极性采样(Biased polar sampling)路线采样(Lane sampling)随机路径图(PRM)规划Voronoi路径图规划快速搜索随机树(RRT)基本RRTRRT*基于Dubins路径的RRT基于Dubins路径的RRT*基于reeds-shepp路径的RRT*Informed RRT*批量Informed RRT*三次样条规划B样条规划贝济埃路径规划五次多项式规划Dubins路径规划Reeds Shepp路径规划基于LQR的路径规划Frenet Frame中的最优路径路径跟踪纯追迹跟踪史坦利控制后轮反馈控制线性二次regulator(LQR)转向控制线性二次regulator(LQR)转向和速度控制项目支持
环境需求
Python 3.6.xnumpyscipymatplotlibpandascvxpy 0.4.x
怎样使用
安装必要的库;克隆本代码仓库;执行每个目录下的python脚本;如果你喜欢,则收藏本代码库:)
本地化
扩展卡尔曼滤波本地化
该算法利用扩展卡尔曼滤波器(Extended Kalman Filter, EKF)实现传感器混合本地化。
蓝线为真实路径,黑线为导航推测路径(dead reckoning trajectory),绿点为位置观测(如GPS),红线为EKF估算的路径。
红色椭圆为EKF估算的协方差。
相关阅读:概率机器人学http://probabilistic-robotics.org/
无损卡尔曼滤波本地化
该算法利用无损卡尔曼滤波器(Unscented Kalman Filter, UKF)实现传感器混合本地化。
线和点的含义与EKF模拟的例子相同。
相关阅读:利用无差别训练过的无损卡尔曼滤波进行机器人移动本地化https://researchgate/publication/267963417_Discriminatively_Trained_Unscented_Kalman_Filter_for_Mobile_Robot_Localization
粒子滤波本地化
该算法利用粒子滤波器(Particle Filter, PF)实现传感器混合本地化。
蓝线为真实路径,黑线为导航推测路径(dead reckoning trajectory),绿点为位置观测(如GPS),红线为PF估算的路径。
该算法假设机器人能够测量与地标(RFID)之间的距离。
PF本地化会用到该测量结果。
相关阅读:概率机器人学http://probabilistic-robotics.org/
直方图滤波本地化
该算法是利用直方图滤波器(Histogram filter)实现二维本地化的例子。
红十字是实际位置,黑点是RFID的位置。
蓝色格子是直方图滤波器的概率位置。
在该模拟中,x,y是未知数,yaw已知。
滤波器整合了速度输入和从RFID获得距离观测数据进行本地化。
不需要初始位置。
相关阅读:概率机器人学http://probabilistic-robotics.org/
映射
高斯网格映射
本算法是二维高斯网格映射(Gaussian grid mapping)的例子。
光线投射网格映射
本算法是二维光线投射网格映射(Ray casting grid map)的例子。
k均值物体聚类
本算法是使用k均值算法进行二维物体聚类的例子。
圆形拟合物体形状识别
本算法是使用圆形拟合进行物体形状识别的例子。
蓝圈是实际的物体形状。
红叉是通过距离传感器观测到的点。
红圈是使用圆形拟合估计的物体形状。
SLAM
同时本地化和映射(Simultaneous Localization and Mapping,SLAM)的例子。
迭代最近点匹配
本算法是使用单值解构进行二维迭代最近点(Iterative Closest Point,ICP)匹配的例子。
它能计算从一些点到另一些点的旋转矩阵和平移矩阵。
相关阅读:机器人运动介绍:迭代最近点算法https://cs.gmu.edu/~kosecka/cs685/cs685-icp.pdf
EKF SLAM
这是基于扩展卡尔曼滤波的SLAM示例。
蓝线是真实路径,黑线是导航推测路径,红线是EKF SLAM估计的路径。
绿叉是估计的地标。
相关阅读:概率机器人学http://probabilistic-robotics.org/
FastSLAM 1.0
这是用FastSLAM 1.0进行基于特征的SLAM的示例。
蓝线是实际路径,黑线是导航推测,红线是FastSLAM的推测路径。
红点是FastSLAM中的粒子。
黑点是地标,蓝叉是FastLSAM估算的地标位置。
相关阅读:概率机器人学http://probabilistic-robotics.org/
FastSLAM 2.0
这是用FastSLAM 2.0进行基于特征的SLAM的示例。
动画的含义与FastSLAM 1.0的情况相同。
相关阅读:概率机器人学http://probabilistic-robotics.org/Tim Bailey的SLAM模拟http://www-personal.acfr.usyd.edu.au/tbailey/software/slam_simulations.htm
基于图的SLAM
这是基于图的SLAM的示例。
蓝线是实际路径。
黑线是导航推测路径。
红线是基于图的SLAM估算的路径。
黑星是地标,用于生成图的边。
相关阅读:基于图的SLAM入门http://www2.informatik.uni-freiburg.de/~stachnis/pdf/grisetti10titsmag.pdf
路径规划
动态窗口方式
这是使用动态窗口方式(Dynamic Window Approach)进行二维导航的示例代码。
相关阅读:用动态窗口方式避免碰撞https://ri.cmu.edu/pub_files/pub1/fox_dieter_1997_1/fox_dieter_1997_1.pdf
基于网格的搜索
迪杰斯特拉算法
这是利用迪杰斯特拉(Dijkstra)算法实现的基于二维网格的最短路径规划。
动画中青色点为搜索过的节点。
A*算法
下面是使用A星算法进行基于二维网格的最短路径规划。
动画中青色点为搜索过的节点。
启发算法为二维欧几里得距离。
势场算法
下面是使用势场算法进行基于二维网格的路径规划。
动画中蓝色的热区图显示了每个格子的势能。
相关阅读:机器人运动规划:势能函数https://cs.cmu.edu/~motionplanning/lecture/Chap4-Potential-Field_howie.pdf
模型预测路径生成
下面是模型预测路径生成的路径优化示例。
算法用于状态晶格规划(state lattice planning)。
路径优化示例
查找表生成示例
相关阅读:用于带轮子的机器人的最优不平整地形路径生成http://journals.sagepub/doi/pdf/10.1177/0278364906075328
状态晶格规划
这个脚本使用了状态晶格规划(state lattice planning)实现路径规划。
这段代码通过模型预测路径生成来解决边界问题。
相关阅读:用于带轮子的机器人的最优不平整地形路径生成http://journals.sagepub/doi/pdf/10.1177/0278364906075328用于复杂环境下的高性能运动机器人导航的可行运动的状态空间采样http://frc.ri.cmu.edu/~alonzo/pubs/papers/JFR_08_SS_Sampling.pdf
均匀极性采样(Uniform polar sampling)
偏差极性采样(Biased polar sampling)
路线采样(Lane sampling)
随机路径图(PRM)规划
这个随机路径图(Probabilistic Road-Map,PRM)规划算法在图搜索上采用了迪杰斯特拉方法。
动画中的蓝点为采样点。
青色叉为迪杰斯特拉方法搜索过的点。
红线为PRM的最终路径。
相关阅读:随机路径图https://en.wikipedia.org/wiki/Probabilistic_roadmap
Voronoi路径图规划
这个Voronoi路径图(Probabilistic Road-Map,PRM)规划算法在图搜索上采用了迪杰斯特拉方法。
动画中的蓝点为Voronoi点。
青色叉为迪杰斯特拉方法搜索过的点。
红线为Voronoi路径图的最终路径。
相关阅读:机器人运动规划https://cs.cmu.edu/~motionplanning/lecture/Chap5-RoadMap-Methods_howie.pdf
快速搜索随机树(RRT)
基本RRT
这是个使用快速搜索随机树(Rapidly-Exploring Random Trees,RRT)的简单路径规划代码。
黑色圆为障碍物,绿线为搜索树,红叉为开始位置和目标位置。
RRT*
这是使用RRT*的路径规划代码。
黑色圆为障碍物,绿线为搜索树,红叉为开始位置和目标位置。
相关阅读:最优运动规划的基于增量采样的算法https://arxiv.org/abs/1005.0416最优运动规划的基于采样的算法http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.419.5503&rep=rep1&type=pdf
基于Dubins路径的RRT
为汽车形机器人提供的使用RRT和dubins路径规划的路径规划算法。
基于Dubins路径的RRT*
为汽车形机器人提供的使用RRT*和dubins路径规划的路径规划算法。
基于reeds-shepp路径的RRT*
为汽车形机器人提供的使用RRT*和reeds shepp路径规划的路径规划算法。
Informed RRT*
这是使用Informed RRT*的路径规划代码。
青色椭圆为Informed RRT*的启发采样域。
相关阅读:Informed RRT*:通过对可接受的椭球启发的直接采样实现最优的基于采样的路径规划https://arxiv.org/pdf/1404.2334.pdf
批量Informed RRT*
这是使用批量Informed RRT*的路径规划代码。
相关阅读:批量Informed树(BIT*):通过对隐含随机几何图形进行启发式搜索实现基于采样的最优规划https://arxiv.org/abs/1405.5848
闭合回路RRT*
使用闭合回路RRT*(Closed loop RRT*)实现的基于车辆模型的路径规划。
这段代码里,转向控制用的是纯追迹算法(pure-pursuit algorithm)。
速度控制采用了PID。
相关阅读:使用闭合回路预测在复杂环境内实现运动规划http://acl.mit.edu/papers/KuwataGNC08.pdf)应用于自动城市驾驶的实时运动规划http://acl.mit.edu/papers/KuwataTCST09.pdf[1601.06326]采用闭合回路预测实现最优运动规划的基于采样的算法https://arxiv.org/abs/1601.06326
LQR-RRT*
这是个使用LQR-RRT*的路径规划模拟。
LQR局部规划采用了双重积分运动模型。
相关阅读:LQR-RRT*:使用自动推导扩展启发实现最优基于采样的运动规划http://lis.csail.mit.edu/pubs/perez-icra12.pdfMahanFathi/LQR-RRTstar:LQR-RRT*方法用于单摆相位中的随机运动规划https://github/MahanFathi/LQR-RRTstar
三次样条规划
这是段三次路径规划的示例代码。
这段代码根据x-y的路点,利用三次样条生成一段曲率连续的路径。
每个点的指向角度也可以用解析的方式计算。
B样条规划
这是段使用B样条曲线进行规划的例子。
输入路点,它会利用B样条生成光滑的路径。
第一个和最后一个路点位于最后的路径上。
相关阅读:B样条https://en.wikipedia.org/wiki/B-spline
Eta^3样条路径规划
这是使用Eta ^ 3样条曲线的路径规划。
相关阅读:\eta^3-Splines for the Smooth Path Generation of Wheeled Mobile Robotshttps://ieeexplore.ieee.org/document/4339545/
贝济埃路径规划
贝济埃路径规划的示例代码。
根据四个控制点生成贝济埃路径。
改变起点和终点的偏移距离,可以生成不同的贝济埃路径:
相关阅读:根据贝济埃曲线为自动驾驶汽车生成曲率连续的路径http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.294.6438&rep=rep1&type=pdf
五次多项式规划
利用五次多项式进行路径规划。
它能根据五次多项式计算二维路径、速度和加速度。
相关阅读:用于Agv In定位的局部路径规划和运动控制http://ieeexplore.ieee.org/document/637936/
Dubins路径规划
Dubins路径规划的示例代码。
相关阅读:Dubins路径https://en.wikipedia.org/wiki/Dubins_path
Reeds Shepp路径规划
Reeds Shepp路径规划的示例代码。
相关阅读:15.3.2 Reeds-Shepp曲线http://planning.cs.uiuc.edu/node822.html用于能前进和后退的汽车的最优路径https://pdfs.semanticscholar.org/932e/c495b1d0018fd59dee12a0bf74434fac7af4.pdfghliu/pyReedsShepp:实现Reeds Shepp曲线https://github/ghliu/pyReedsShepp
基于LQR的路径规划
为双重积分模型使用基于LQR的路径规划的示例代码。
Frenet Frame中的最优路径
这段代码在Frenet Frame中生成最优路径。
青色线为目标路径,黑色叉为障碍物。
红色线为预测的路径。
相关阅读:Frenet Frame中的动态接到场景中的最优路径生成https://researchgate/profile/Moritz_Werling/publication/224156269_Optimal_Trajectory_Generation_for_Dynamic_Street_Scenarios_in_a_Frenet_Frame/links/54f749df0cf210398e9277af.pdfFrenet Frame中的动态接到场景中的最优路径生成https://youtube/watch?v=Cj6tAQe7UCY
路径跟踪
姿势控制跟踪
这是姿势控制跟踪的模拟。
相关阅读:Robotics, Vision and Control - Fundamental Algorithms In MATLAB Second, Completely Revised, Extended And Updated Edition | Peter Corke | Springerhttps://springer/us/book/9783319544120
纯追迹跟踪
使用纯追迹(pure pursuit)转向控制和PID速度控制的路径跟踪模拟。
红线为目标路线,绿叉为纯追迹控制的目标点,蓝线为跟踪路线。
相关阅读:城市中的自动驾驶汽车的运动规划和控制技术的调查https://arxiv.org/abs/1604.07446
史坦利控制
使用史坦利(Stanley)转向控制和PID速度控制的路径跟踪模拟。
相关阅读:史坦利:赢得DARPA大奖赛的机器人http://robots.stanford.edu/papers/thrun.stanley05.pdf用于自动驾驶机动车路径跟踪的自动转向方法https://ri.cmu.edu/pub_files/2009/2/Automatic_Steering_Methods_for_Autonomous_Automobile_Path_Tracking.pdf
后轮反馈控制
利用后轮反...
Python简洁实现文本相似度算法(levenstein) 公司视频课程
python中有现成的文本相似度算法levenstein距离(编辑距离)的算法包:python- Levenshtein,可以直接使用:
python-Levenshtein算法库
distance函数计算编辑距离,规则是:添加、删除和替换一个字符距离都+1;
ratio函数计算Levenstein比,其中替换一个字符距离变为2。这个也是我们需要实现的。
但是因为一些原因,有个外部程序调用第三方python包有点问题,所以需要用python写一个简单的Levenstein距离实现算法。本着拿来主义在网上找了找,好多程序执行有问题,所以自己重写了一下:
简洁版Levenshtein.ratio算法
根据百度百科“编辑距离”了解一下具体算法(不要嘲笑),维基百科“Levenshtein distance”也一样:
假设比较“coffee”和‘cafe’的相似度:
① 初始化一个5*7矩阵:
图片来自百度百科
② 除了第一行和第一列,分别计算剩下的值,例如Dij取3个值得最小值:正上方的值distance_matrix(i-1)j+1,左方相邻值distance_matrixi(j-1)+1,四方格对角值distance_matrix (i-1)(j-1)+2(如果是只计算编辑距离的话,这里是+1,因为我们需要Levenshtein比,所以这里是+2);
③ 最终结果为矩阵右下角的值,结果为4。也就是cafe中a替换为o,插入f和e,变为coffee;Levenshtein比为4/(4+6)=0.6。
本算法对于字符串相似度比较比较适合,而对于文章的相似度比较则较多使用向量空间模型VSM,例如TD-IDF算法。先进行分词再通过词频向量,利用向量余弦值计算相似度。
初学者可以直接学Python3吗? 推广视频课程
我是个喜欢尝鲜的人,所以机器上的JDK、GoLang都是最新的,反正PC也不是生产环境。最近重装机器,又正好看到Python 3.7的Alpha版本出来了,就下载了个最新的版本装上,结果悲剧了,pip安装TensorFlow死活不行。折腾小半天,还是乖乖地换回3.6.x,这是TensorFlow Python API所支持的最新版本。
Python 3.6.2
前些日子,跟两个兄弟聊天,突然奇想,打算做个MUD游戏来怀下旧。有个很不错的MUD的框架叫Evennia,是Python写的,而且是基于2.7的。我对机器的软件环境有一种近乎变态的要求,混乱的版本搞在一起当然不能接受,于是就用另一台笔记本安装了Python 2.7,用不同的电脑做不同的事。
大家都晓得,Python 2和3的差异很大,所以官方也还在同时维护2.7和3.x两套东西。这么多年过去了,Python社区做了很多2to3的兼容性工作,按理说不存在选择2还是3的问题了。但是有一些老顽固的人和老顽固的库还在坚守2.x,这就给初学者带来了困惑,到底该学哪一个。
对于初学者,我的建议当然是直接学Python 3,除非有明确的指征要求你必须用Python 2(比如我想做MUD的例子)。
Python 3和2在语法层面改进很大,所以源代码是不兼容的。Python 3是2008年发布的,至今10年了;Python 2的最后一个分支2.7是2010年中期发布的,此后就没有大的改动了。从性价比的角度,也应该选择学习Python 3,而不是花时间去鼓捣2.x。
从Python 3.3(2012年Release的)开始,所有对标准库的改进,都只在3.x版本中体现。这也表明了Python社区从2.x迁移到3.x的决心。Python官方网站上有一篇名叫《Should I use Python 2 or Python 3 in my development activity》的文章,有一句开宗明义的话:
Python 2.x is legacy, Python 3.x is the present and future of the language
作为初学者,是愿意跟一个前朝遗老玩呢,还是愿意跟进Python的现状及未来?
最让人担心的,其实是第三方库和框架,有的还在继续用Python 2.x。我翻了一下github上的一些项目,发现但凡还停留在2.x的,基本处于没人维护的状态。大多数广泛使用的库,都已经兼容Python 3了。Python官网上列出了一些,包括机器学习中最常用的数值计算库Numpy和SciPy,机器视觉常用的OpenCV 3, HTTP库Request,XML PARSER库lxml,WEB框架Django.....关于3和2的兼容性,pythonhosted上有篇文章《Six: Python 2 and 3 Compatibility Library》讲得非常详细,大家可以参考。
最新的Release::Python 3.6.4
可能也会有高手告诉新手,语法层面的差别不算事儿,Py2和Py3没有区别,编程思想数据结构算法才是核心吧啦吧啦,但是我觉得手锯和电锯还是有区别的。Python作为一门如日中天的动态语言,在不断进化,语法改进的背后,也就是“编程思想”的改进。PL作为一个艰深的计算机科学分支,语法演化的背后是有深刻的思想性的东西的,轻视语法及其语义是不对的。
我的一个朋友遵循最新的C# Spec写了一个软件,然后告诉我说:这代表了我2017年的编程水准(他从1988年开始编程)。我看了看,好多我没见过的东西。虽然前几年我也用C#写过一款赖以谋生的软件产品,但编程方式还比较古老一点,没有深入了解C#语言的最新发展,换言之,也没有了解C#的最新的编程思想。
新的一年里,如果想学一门新的手艺,就学Python 3吧。