
正文
Python向量函数表示的简单介绍
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Python怎么创建一个1-100的向量,感觉语法是真的烦。
我感觉Python向量函数表示你是没有理解向量的定义Python向量函数表示,跟python语法没关系,向量是表示一组带有方向的数,而计算机无法表示方向,只有用数组的叠加来表示维度。而向量就是代表某个维度上的一组数,所以它就是一行数组或者一列数组,后面就好理解了。python不能像其他语言直接定义数组,只有用列表代替。或者你可以用第三方库numpy 来实现数组定义和科学计算
相关问答
Q1: mydf是什么python
my_df是一个二维的结构Python向量函数表示,如下图所示Python向量函数表示:
stack函数会把列索引转成行索引,即把列索引换成二级的行索引,即所有列压缩到一列。请注意,这个的空值会跳过,下图中的数据结构只有7个元素,7行1列。
a['b','two']
a['d','two']
#上面两个索引是可以的,下面的是会报错KeyError
a['d','one']
unstack函数会把行索引转成列索引,即把行索引换成二级的列索引,即所有行压缩到一行。注Python向量函数表示:实际上,Python似乎不分行向量或列向量,如果对一个Series对象进行转置,则还是其本身。根据shape函数的返回可知,这是一个8行1列的数据结构。
stack函数会把二级的行索引转成列索引,恢复其二维结构。
我们看到,用过stack函数后可以用unstack函数来恢复其原貌。反过来如何呢Python向量函数表示?
会报错:AttributeError: 'Series' object has no attribute 'stack'
我们发现,stack和unstack两个函数的组合,如下所示,只有前两个是可以的没有问题的。这是因为一个二维数据经过stack或unstack后,变成Python向量函数表示了一个Series结构,而Series有unstack没有stack。
my_df.stack().unstack()
my_df.unstack().unstack()
#my_df.stack().stack()
#my_df.unstack().stack()
a=my_df.stack()
print(type(a))
print(dir(a))
如下图所示,用过了unstack后,怎么恢复原状呢?转置一下即可。
Q2: 代价函数(python实现)
首先我们要知道ℎ𝜃(𝑥(𝑖))等于什么,它的意思是θ^T乘以X,X是一个向量,如果用等式表达的话就是 θ0𝑥0 + θ1𝑥1 + θ2𝑥2+...+θ𝑛𝑥𝑛 ,当然θ也是一个向量,而且是一维的,python里面有一个库叫numpy,专门做矩阵运算的,我们使用就可以了,我们先初始化X,y,还有θ吧
先随机初始化,这些东西应该不需要讲,randint是随机整数,rand是小数,然后low参数代表你的随机数上界,size就是维度,初始化完成后就开始运算。
求和公式里面的运算
( (h(θ) = X theta^T) - y )^2*
我想这些应该不难,就是(X * theta.T - y),平方的话用np的power()函数。
inner = np.power((X * theta.T - y),2),第二个参数就是平方数
然后我们就可以计算求和公式外面的了,这个m代表着X矩阵的行数,对应的就是X的
向量个数,
np.sum(inner,axis=None)
最后再除以两倍的x向量个数即可,就是1 / len(X) * 2为什么是两倍呢,因为它求了偏导数,所以就是2了,好了,把它们整理一下写成函数吧
Q3: 2020-05-22 第十三章 支持向量机模型(python)
SVM 是 Support Vector Machine 的简称,它的中文名为支持向量机,属于一种有监督的机器学习算法,可用于离散因变量的分类和连续因变量的预测。通常情况下,该算法相对于其他单一的分类算法(如 Logistic 回归、决策树、朴素贝叶斯、 KNN 等)会有更好的预测准确率,主要是因为它可以将低维线性不可分的空间转换为高维的线性可分空间。
“分割带”代表了模型划分样本点的能力或可信度,“分割带”越宽,说明模型能够将样本点划分得越清晰,进而保证模型泛化能力越强,分类的可信度越高;反之,“分割带”越窄,说明模型的准确率越容易受到异常点的影响,进而理解为模型的预测能力越弱,分类的可信度越低。
线性可分的 所对应的函数间隔满足 的条件,故 就等于 。所以,可以将目标函数 等价为如下的表达式:
假设存在一个需要最小化的目标函数 ,并且该目标函数同时受到 的约束。如需得到最优化的解,则需要利用拉格朗日对偶性将原始的最优化问题转换为对偶问题,即:
分割面的求解
分割面的表达式
对于非线性SVM模型而言,需要经过两个步骤,一个是将原始空间中的样本点映射到高维的新空间中,另一个是在新空间中寻找一个用于识别各类别样本点线性“超平面”。
假设原始空间中的样本点为 ,将样本通过某种转换 映射到高维空间中,则非线性SVM模型的目标函数可以表示为:
其中,内积 可以利用核函数替换,即 。对于上式而言,同样需要计算最优的拉格朗日乘积 ,进而可以得到线性“超平面” 与 的值:
假设原始空间中的两个样本点为 ,在其扩展到高维空间后,它们的内积 如果等于样本点 在原始空间中某个函数的输出,那么该函数就称为核函数。
线性核函数的表达式为 ,故对应的分割“超平面”为:
多项式核函数的表达式为 ,故对应的分割“超平面”为:
高斯核函数的表达式为 ,故对应的分割“超平面”为:
Sigmoid 核函数的表达式为 ,故对应的分割“超平面”为:
在实际应用中, SVM 模型对核函数的选择是非常敏感的,所以需要通过先验的领域知识或者交叉验证的方法选出合理的核函数。大多数情况下,选择高斯核函数是一种相对偷懒而有效的方法,因为高斯核是一种指数函数,它的泰勒展开式可以是无穷维的,即相当于把原始样本点映射到高维空间中。
output_13_0.png
Q4: 如何用Python实现支持向量机
终于到SVM的实现部分了。那么神奇和有效的东西还得回归到实现才可以展示其强大的功力。SVM有效而且存在很高效的训练算法,这也是工业界非常青睐SVM的原因。
前面讲到,SVM的学习问题可以转化为下面的对偶问题:
需要满足的KKT条件:
也就是说找到一组αi可以满足上面的这些条件的就是该目标的一个最优解。所以我们的优化目标是找到一组最优的αi*。一旦求出这些αi*,就很容易计算出权重向量w*和b,并得到分隔超平面了。
这是个凸二次规划问题,它具有全局最优解,一般可以通过现有的工具来优化。但当训练样本非常多的时候,这些优化算法往往非常耗时低效,以致无法使用。从SVM提出到现在,也出现了很多优化训练的方法。其中,非常出名的一个是1982年由Microsoft Research的John C. Platt在论文《Sequential Minimal Optimization: A Fast Algorithm for TrainingSupport Vector Machines》中提出的Sequential Minimal Optimization序列最小化优化算法,简称SMO算法。SMO算法的思想很简单,它将大优化的问题分解成多个小优化的问题。这些小问题往往比较容易求解,并且对他们进行顺序求解的结果与将他们作为整体来求解的结果完全一致。在结果完全一致的同时,SMO的求解时间短很多。在深入SMO算法之前,我们先来了解下坐标下降这个算法,SMO其实基于这种简单的思想的。
8.1、坐标下降(上升)法
假设要求解下面的优化问题:
在这里,我们需要求解m个变量αi,一般来说是通过梯度下降(这里是求最大值,所以应该叫上升)等算法每一次迭代对所有m个变量αi也就是α向量进行一次性优化。通过误差每次迭代调整α向量中每个元素的值。而坐标上升法(坐标上升与坐标下降可以看做是一对,坐标上升是用来求解max最优化问题,坐标下降用于求min最优化问题)的思想是每次迭代只调整一个变量αi的值,其他变量的值在这次迭代中固定不变。
最里面语句的意思是固定除αi之外的所有αj(i不等于j),这时W可看作只是关于αi的函数,那么直接对αi求导优化即可。这里我们进行最大化求导的顺序i是从1到m,可以通过更改优化顺序来使W能够更快地增加并收敛。如果W在内循环中能够很快地达到最优,那么坐标上升法会是一个很高效的求极值方法。
用个二维的例子来说明下坐标下降法:我们需要寻找f(x,y)=x2+xy+y2的最小值处的(x*, y*),也就是下图的F*点的地方。
假设我们初始的点是A(图是函数投影到xoy平面的等高线图,颜色越深值越小),我们需要达到F*的地方。那最快的方法就是图中黄色线的路径,一次性就到达了,其实这个是牛顿优化法,但如果是高维的话,这个方法就不太高效了(因为需要求解矩阵的逆,这个不在这里讨论)。我们也可以按照红色所指示的路径来走。从A开始,先固定x,沿着y轴往让f(x, y)值减小的方向走到B点,然后固定y,沿着x轴往让f(x, y)值减小的方向走到C点,不断循环,直到到达F*。反正每次只要我们都往让f(x, y)值小的地方走就行了,这样脚踏实地,一步步走,每一步都使f(x, y)慢慢变小,总有一天,皇天不负有心人的。到达F*也是时间问题。到这里你可能会说,这红色线比黄色线贫富差距也太严重了吧。因为这里是二维的简单的情况嘛。如果是高维的情况,而且目标函数很复杂的话,再加上样本集很多,那么在梯度下降中,目标函数对所有αi求梯度或者在牛顿法中对矩阵求逆,都是很耗时的。这时候,如果W只对单个αi优化很快的时候,坐标下降法可能会更加高效。
8.2、SMO算法
SMO算法的思想和坐标下降法的思想差不多。唯一不同的是,SMO是一次迭代优化两个α而不是一个。为什么要优化两个呢?
我们回到这个优化问题。我们可以看到这个优化问题存在着一个约束,也就是
假设我们首先固定除α1以外的所有参数,然后在α1上求极值。但需要注意的是,因为如果固定α1以外的所有参数,由上面这个约束条件可以知道,α1将不再是变量(可以由其他值推出),因为问题中规定了:
因此,我们需要一次选取两个参数做优化,比如αi和αj,此时αi可以由αj和其他参数表示出来。这样回代入W中,W就只是关于αj的函数了,这时候就可以只对αj进行优化了。在这里就是对αj进行求导,令导数为0就可以解出这个时候最优的αj了。然后也可以得到αi。这就是一次的迭代过程,一次迭代只调整两个拉格朗日乘子αi和αj。SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效(对一个参数的优化可以通过解析求解,而不是迭代。虽然对一个参数的一次最小优化不可能保证其结果就是所优化的拉格朗日乘子的最终结果,但会使目标函数向极小值迈进一步,这样对所有的乘子做最小优化,直到所有满足KKT条件时,目标函数达到最小)。
总结下来是:
重复下面过程直到收敛{
(1)选择两个拉格朗日乘子αi和αj;
(2)固定其他拉格朗日乘子αk(k不等于i和j),只对αi和αj优化w(α);
(3)根据优化后的αi和αj,更新截距b的值;
}
Q5: python中ge=num_x0010_是什么意思
将ge定义为数组。
num就是函数numpy的缩写,numpy提供一个具有向量算术运算和复杂广播能力的多维数组对象,用于对数组数据进行快速运算的标准数学函数。
numpy可以进行非常有用的线性代数,傅里叶变换和随机数操作。
关于Python向量函数表示和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






