① python计算每两个向量之间的距离并保持到矩阵中
在很多算法中都会涉及到求向量欧式距离,例如机器学习中的KNN算法,就需要对由训练集A和测试集B中的向量组成的所有有序对(Ai,Bi),求出Ai和Bi的欧式距离。这样的话就会带来一个二重的嵌套循环,在向量集很大时效率不高。
这里介绍如何将这一过程用矩阵运算实现。
假设有两个三维向量集,用矩阵表示:
A=[a11a12a21a22a31a32]
B=⎡⎣⎢⎢b11b12b13b21b22b23b31b32b33⎤⎦⎥⎥
要求A,B两个集合中的元素两两间欧氏距离。
先求出ABT:
ABT=⎡⎣⎢⎢⎢⎢⎢∑k=13ak1bk1∑k=13ak2bk1∑k=13ak1bk2∑k=13ak2bk2∑k=13ak1bk3∑k=13ak2bk3⎤⎦⎥⎥⎥⎥⎥
然后对A和BT分别求其中每个向量的模平方,并扩展为2*3矩阵:
Asq=⎡⎣⎢⎢⎢⎢⎢∑k=13(ak1)2∑k=13(ak2)2∑k=13(ak1)2∑k=13(ak2)2∑k=13(ak1)2∑k=13(ak2)2⎤⎦⎥⎥⎥⎥⎥
Bsq=⎡⎣⎢⎢⎢⎢⎢∑k=13(bk1)2∑k=13(bk1)2∑k=13(bk2)2∑k=13(bk2)2∑k=13(bk3)2∑k=13(bk3)2⎤⎦⎥⎥⎥⎥⎥
然后:
Asq+Bsq−2ABT=⎡⎣⎢⎢⎢⎢⎢∑k=13(ak1−bk1)2∑k=13(ak2−bk1)2∑k=13(ak1−bk2)2∑k=13(ak2−bk2)2∑k=13(ak1−bk3)2∑k=13(ak2−bk3)2⎤⎦⎥⎥⎥⎥⎥
将上面这个矩阵一开平方,就得到了A,B向量集两两间的欧式距离了。
下面是Python实现:
import numpy
def EuclideanDistances(A, B):
BT = B.transpose()
vecProd = A * BT
SqA = A.getA()**2
sumSqA = numpy.matrix(numpy.sum(SqA, axis=1))
sumSqAEx = numpy.tile(sumSqA.transpose(), (1, vecProd.shape[1]))
SqB = B.getA()**2
sumSqB = numpy.sum(SqB, axis=1)
sumSqBEx = numpy.tile(sumSqB, (vecProd.shape[0], 1))
SqED = sumSqBEx + sumSqAEx - 2*vecProd
ED = (SqED.getA())**0.5
return numpy.matrix(ED)
② 有大神能给写下用python怎么算欧式股票期权的隐含波动率么
用BS model计算欧式call option的implied volatility。
稍微修改一下也可以算put option。计算结果可以和期权计算器上的结果对比。
③ 怎样用python计算两个向量的欧式距离
L2距离就是二范数,用norm试一下。
比如两个1D向量分别为a,b,则欧式距离可以表示为:
norm(a-b), 相当于
sqrt(sum((a-b).^2))
④ python是什么样的编程语言
Python是什么?
Python是一种开放源代码的脚本编程语言,这种脚本语言特别强调开发速度和代码的清晰程度。它可以用来开发各种程序,从简单的脚本任务到复杂的、面向对象的应用程序都有大显身手的地方。Python还被当作一种入门程序员最适合掌握的优秀语言,因为它免费、面向对象、扩展性强同时执行严格的编码标准。
Python是免费的
Guido van Rossum于1990年开始开发Python,最初的目的无非是一个自娱的项目。作为Monty Python的飞行马戏团节目的爱好者,他给自己开发的这种编程语言起了现在这个古怪的名字,中文意思就是大蟒。Python最初设计为一种取代 Amoeba分布式操作系统ABC的脚本语言,但不久这种新型编程语言很快就发展成可以解决相当多问题的利器,现在更引入到了多种平台。
Guido目前还是Python软件基金会的主席。该组织按照GNU公共许可协议的要求拥有Python的知识产权和许可权。Python可以用在多种平台上,包括Windows、Macintosh和各种常见的UNIX系统。另外针对PalmOS 和微软的Pocket PC的相应版本也在开发中。
Python品质超群
虽然Python常用来创建简单的脚本,但它采用的编程技术可不简单,比如面向对象编码、套接字、线程和GUI等等。假如你是一位刚入流的程序员,这些特性显然对你太有帮助了,因为你可以很快熟悉有益的编程语法和编码实践,之后再学习其他语言,比如Java或者C++等引入的技术概念就容易多了。脚本可以单独执行,不过,你还可以通过类文件和各类对象类型以充分利用这种语言的强大功能。
Python区别于其他面向对象语言的关键有两点。首先,Python强调空格和编码结构,从而令开发者的代码具有良好的重用性。其次,执行脚本之前无须编译Python代码,这就是它为什么被当作脚本语言的原因。
Python易于扩展
Python语言有一个引人注目的优势,它可以针对语言无法完成功能的函数调用函数库。Python还具有有些相当有用的工具帮助开发出复杂的应用程序。其中最常用的就是Tkinker,这种工具可以实现跨平台的GUI开发。另一种wxPython工具则是对wxWindows跨平台C++框架的扩展。WxPython目前已经支持Windows和Linux平台。Python Imaging Library可以让Python创建、打开、编辑和修改图象,包括.gif、.jpeg和.png等。为了了解常用的Python扩展和应用,你不妨访问下The Vaults of Parnassus。
Python自身还可以嵌入到其他编程语言中。最常见的就是[url=http://www.jython.org/]Jython[url],这是一种用Java编写的Python解释器。这样你就可以同时利用两种语言的优点。你还可以在强大的Java应用程序框架中结合Python清晰的语法来创建出依赖于两种语言库的应用程序。
编码标准
严格的Python语法是初级程序员忽略这一强大编程语言的最主要原因。和大多数的其他面向Web脚本语言不同的是,Python的空白排版不依赖于括号或者分号来表示语句结束,换行和占位符用来描述代码的可视结果。这种编程方式乍看之下令人感到厌烦,但却对你另有莫大的好处,这就是代码的可靠性。Python这种结构化是建立在下面的理论之上:开发者的工作时间是机构财产中最有价值的财富。一旦你习惯了编写Python代码的规则。实际上你就习惯了一种内建的编码标准。这也正是大多数Python开发者所依赖的标准。
获取Python
你可以从http://www.python.org或者各类平台上的Python版本。ActiveState网站也发布用于 Windows、Linux和Solaris等平台的Python库。
最简单的Python代码
下面我们举例说明Python。假设你目前使用的是Windows系统,而且已经安装了Python,请首先启动IDLE,也就是Python的GUI。现在处于Python Shell中(如果你在UNIX类型的系统上就需要键入 python类型指示你的Python可执行文件)。接着在">>>"提示符下键入:
>>>print "Hello World"
这个大家耳熟能详的程序就在屏幕上显示出结果,你还可以如下所示给变量赋值:
>>>myvar = 42
>>>print myvar
在上例中会显示结果42。
如果你开发的脚本无须在Python Shell 中直接输入Python就更有用了。程序清单A就包含了一个Hello World脚本的示例,其中编写了if-else语句。
你可以在命令行上键入scriptname.py来执行自己的脚本(py是Python 脚本的标准文件扩展名)。你应该能看到正确的显示结果。清单A中,跟着if和else之后由占位符缩排的语句就是空白格式化的一部分。
这些很简单的示例演示了Python清晰的语法。为了了解更多有关Python编程的信息,你不妨查看下Python网站上的初学者指南。如果你不习惯于上网浏览,那么你还可以阅读O'Reilly 和New Riders 出版的有关图书。比如How to Think Like a Computer Scientist : Learning with Python和Python Essential Reference。
小结
不论你是一位初学编程语言以图增长自己知识技能的入门程序员还是为了谋取更大代码可靠性的Perl高手,你都会发现Python是一种相当灵活和强大的编程语言。它可以开发出各种各样的应用程序,从功能齐备的邮件列表软件到各种跨平台的GUI应用程序一应俱全。
上面用到的清单 A [re: xyb]
# List A
# (If you are on an UNIX type system you may have to modify the first line to point to
your Python executable.)
#!/usr/bin/pythonmyvar = "Hello World"if myvar == "Hello World": print myvarelse: print "myvar does not equal Hello World"
[精华] 另外,我也介绍一本书 [re: xyb]
(enthusiast)
02-09-02 11:21
Bruce Eckel的Thinking in Python,可以从这里下载。
Bruce Eckel已经出版的Thinking in Java和Thinking in C++可都是鼎鼎大名。他正在写的有Thinking in Python和Thinking in Pattern,不知道什么时候可以出版。
其他Bruce Eckel的着作下载目录:Bruce Eckel's Free Electronic Books
⑤ 121 11 个案例掌握 Python 数据可视化--星际探索
星空是无数人梦寐以求想了解的一个领域,远古的人们通过肉眼观察星空,并制定了太阴历,指导农业发展。随着现代科技发展,有了更先进的设备进行星空的探索。本实验获取了美国国家航空航天局(NASA)官网发布的地外行星数据,研究及可视化了地外行星各参数、寻找到了一颗类地行星并研究了天体参数的相关关系。
输入并执行魔法命令 %matplotlib inline, 设置全局字号,去除图例边框,去除右侧和顶部坐标轴。
本数据集来自 NASA,行星发现是 NASA 的重要工作之一,本数据集搜集了 NASA 官网发布的 4296 颗行星的数据,本数据集字段包括:
导入数据并查看前 5 行。
截至 2020 年 10 月 22 日 全球共发现 4296 颗行星,按年聚合并绘制年度行星发现数,并在左上角绘制 NASA 的官方 LOGO 。
从运行结果可以看出,2005 年以前全球行星发现数是非常少的,经计算总计 173 颗,2014 和 2016 是行星发现成果最多的年份,2016 年度发现行星 1505 颗。
对不同机构/项目/计划进行聚合并降序排列,绘制发现行星数目的前 20 。
2009 年至 2013 年,开普勒太空望远镜成为有史以来最成功的系外行星发现者。在一片天空中至少找到了 1030 颗系外行星以及超过 4600 颗疑似行星。当机械故障剥夺了该探测器对于恒星的精确定位功能后,地球上的工程师们于 2014 年对其进行了彻底改造,并以 K2 计划命名,后者将在更短的时间内搜寻宇宙的另一片区域。
对发现行星的方式进行聚合并降序排列,绘制各种方法发现行星的比例,由于排名靠后的几种方式发现行星数较少,因此不显示其标签。
行星在宇宙中并不会发光,因此无法直接观察,行星发现的方式多为间接方式。从输出结果可以看出,发现行星主要有以下 3 种方式,其原理如下:
针对不同的行星质量,绘制比其质量大(或者小)的行星比例,由于行星质量量纲分布跨度较大,因此采用对数坐标。
从输出结果可以看出,在已发现的行星中,96.25% 行星的质量大于地球。(图中横坐标小于 e 的红色面积非常小)
通过 sns.distplot 接口绘制全部行星的质量分布图。
从输出结果可以看出,所有行星质量分布呈双峰分布,第一个峰在 1.8 左右(此处用了对数单位,表示大约 6 个地球质量),第二个峰在 6.2 左右(大概 493 个地球质量)。
针对不同发现方式发现的行星,绘制各行星的公转周期和质量的关系。
从输出结果可以看出:径向速度(Radial Velocity)方法发现的行星在公转周期和质量上分布更宽,而凌日(Transit)似乎只能发现公转周期相对较短的行星,这是因为两种方法的原理差异造成的。对于公转周期很长的行星,其运行到恒星和观察者之间的时间也较长,因此凌日发现此类行星会相对较少。而径向速度与其说是在发现行星,不如说是在观察恒星,由于恒星自身发光,因此其观察机会更多,发现各类行星的可能性更大。
针对不同发现方式发现的行星,绘制各行星的距离和质量的关系。
从输出结果可以看出,凌日和径向速度对距离较为敏感,远距离的行星大多是通过凌日发现的,而近距离的行星大多数通过径向速度发现的。原因是:近距离的行星其引力对恒星造成的摆动更为明显,因此更容易观察;当距离较远时,引力作用变弱,摆动效应减弱,因此很难借助此方法观察到行星。同时,可以观察到当行星质量更大时,其距离分布相对较宽,这是因为虽然相对恒星的距离变长了,但是由于行星质量的增加,相对引力也同步增加,恒星摆动效应会变得明显。
将所有行星的质量和半径对数化处理,绘制其分布并拟合其分布。
由于:
因此,从原理上质量对数与半径对数应该是线性关系,且斜率为定值 3 ,截距的大小与密度相关。
从输出结果可以看出:行星质量和行星半径在对数变换下,具有较好的线性关系。输出 fix_xy 数值可知,其关系可以拟合出如下公式:
拟合出曲线对应的行星平均密度为:
同样的方式绘制恒星质量与半径的关系。
从输出结果可以看出,恒星与行星的规律不同,其质量与半径在对数下呈二次曲线关系,其关系符合以下公式:
同样的方式研究恒星表面重力加速度与半径的关系。
从输出结果可以看出,恒星表面对数重力加速度与其对数半径呈现较好的线性关系:
以上我们分别探索了各变量的分布和部分变量的相关关系,当数据较多时,可以通过 pd.plotting.scatter_matrix 接口,直接绘制各变量的分布和任意两个变量的散点图分布,对于数据的初步探索,该接口可以让我们迅速对数据全貌有较为清晰的认识。
通过行星的半径和质量,恒星的半径和质量,以及行星的公转周期等指标与地球的相似性,寻找诸多行星中最类似地球的行星。
从输出结果可以看出,在 0.6 附近的位置出现了一个最大的圆圈,那就是我们找到的类地行星 Kepler - 452 b ,让我们了解一下这颗行星:
数据显示,Kepler - 452 b 行星公转周期为 384.84 天,半径为 1.63 地球半径,质量为 3.29 地球质量;它的恒星为 Kepler - 452 半径为太阳的 1.11 倍,质量为 1.04 倍,恒星方面数据与太阳相似度极高。
以下内容来自网络。 开普勒452b(Kepler 452b) ,是美国国家航空航天局(NASA)发现的外行星, 直径是地球的 1.6 倍,地球相似指数( ESI )为 0.83,距离地球1400光年,位于为天鹅座。
2015 年 7 月 24 日 0:00,美国国家航空航天局 NASA 举办媒体电话会议宣称,他们在天鹅座发现了一颗与地球相似指数达到 0.98 的类地行星开普勒 - 452 b。这个类地行星距离地球 1400 光年,绕着一颗与太阳非常相似的恒星运行。开普勒 452 b 到恒星的距离,跟地球到太阳的距离相同。NASA 称,由于缺乏关键数据,现在不能说 Kepler - 452 b 究竟是不是“另外一个地球”,只能说它是“迄今最接近另外一个地球”的系外行星。
在银河系经纬度坐标下绘制所有行星,并标记地球和 Kepler - 452 b 行星的位置。
类地行星,是人类寄希望移民的第二故乡,但即使最近的 Kepler-452 b ,也与地球相聚 1400 光年。
以下通过行星的公转周期和质量两个特征将所有行星聚为两类,即通过训练获得两个簇心。
定义函数-计算距离
聚类距离采用欧式距离:
定义函数-训练簇心
训练簇心的原理是:根据上一次的簇心计算所有点与所有簇心的距离,任一点的分类以其距离最近的簇心确定。依此原理计算出所有点的分类后,对每个分类计算新的簇心。
定义函数预测分类
根据训练得到的簇心,预测输入新的数据特征的分类。
开始训练
随机生成一个簇心,并训练 15 次。
绘制聚类结果
以最后一次训练得到的簇心为基础,进行行星的分类,并以等高面的形式绘制各类的边界。
从运行结果可以看出,所有行星被分成了两类。并通过上三角和下三角标注了每个类别的簇心位置。
聚类前
以下输出了聚类前原始数据绘制的图像。
⑥ Python 计算三维空间某点距离原点的欧式距离
1、点击“开始”——“ArcGIS”——“ArcMap”,启动ArcMap程序,并添加两个点要素类到地图上。
⑦ python编写欧式二叉树的问题
所以我就遇到了一下几个问题:
1、该怎么把二叉树各个节点连起来?
2、怎么定义内部数据成员?
3、如何实例化左右孩子?
在网上也没找到比较简单比较通用的Python二叉树类实现,所以我花了点时间自己写一个。
[python] view plain 在CODE上查看代码片派生到我的代码片
class Tree:
def __init__(self, val = '#', left = None, right = None):
self.val = val
self.left = left
self.right = right
#前序构建二叉树
def FrontBuildTree(self):
temp = input('Please Input: ')
node = Tree(temp)
if(temp != '#'):
node.left = self.FrontBuildTree()
node.right = self.FrontBuildTree()
return node#因为没有引用也没有指针,所以就把新的节点给返回回去
#前序遍历二叉树
def VisitNode(self):
print(self.val)
if(self.val != '#'):
self.left.VisitNode()
self.right.VisitNode()
if __name__ == '__main__':
root = Tree()
root = root.FrontBuildTree()
root.VisitNode()