python阶跃函数,阶跃函数的性质
人工神经网络与回归模型的联系和区别
拟合
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了双河免费建站欢迎大家使用!
他们都是拟合,先说下拟合的定义:
形象的说,拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。因为这条曲线有无数种可能,从而有各种拟合方法。拟合的曲线一般可以用函数表示,根据这个函数的不同有不同的拟合名字。
1. 线性回归
回归分析常用于分析两个变量X和Y 之间的关系。 比如 X=房子大小 和 Y=房价 之间的关系, X=(公园人流量,公园门票票价) 与 Y=(公园收入) 之间的关系等等。
那么你的数据点在图上可以这么看
现在你想找到 房子大小和房价的关系, 也就是一个函数f(x) = y. 能够很好的表示 这两个变量之间的关系。
于是你需要大概评估一下这个 房子大小和房价大概是一个什么关系.
是线性的关系吗? 还是非线性的关系?
当然在这个问题里面, 线性的关系更符合这两者的关系。于是我们 选择一个合适的 线性模型, 最常用的是 f(x) = ax+b.
然后用这个线性的模型 去 匹配这些数据点。
1.1 怎么匹配?
有了数据点 和 你臆想出来的线性模型,怎么进行匹配,也就是怎么用这根线最好地描述些数据点的关系?
需要最好地描述点, 我们又需要一个关于“好”的定义。你也可以想出很多关于“好”的定义。下面有两个,
这两个定义都是 将模型与数据点之间的距离差 之和做为 衡量匹配好坏的标准。 误差越小, 匹配程度越大。
但是 总的来说, 我们想要找到的模型, 最后是想要使 f(x) 最大程度地 与y相似, 所以我们想要尽量地减少 f(x)与y之间的差值。 所以在这里 用第二个图的“好的定义” 来评估这根线的匹配程度是很合理的。于是我们有了误差公式!!!!!
这个公式,说的是,可以通过调整不同的a 和 b的值,就能使 误差不断变化,而当你找到这个公式的最小值时,你就能得到最好的a,b. 而这对(a,b)就是能最好描述你数据关系的模型参数。
1.1.1 沿导数下降法(Gradient Descent)
怎么找 cost(a,b)的最小? cost(a,b) 的图像其实像一个碗 一样,有一个最低点。 找这个最低点的办法就是,先随便找一个点(e.g. a=3, b = 2), 然后 沿着这个碗下降的方向找,最后就能找到碗的最低点。
cost(a,b) 的形状
怎么找(某一点)碗下降的方向?? 答案是,找那一点导数的反方向。拿参数a 举个例子, a与cost 关系如下图,
只要将任意一个a, 沿着使cost 导数的反方向 慢慢移动,那么 最终有一天a值就会到达使 cost 最小的那一点. 于是你可以不断地移动a,b, 向着最低点前进。
当然在进行移动的时候也需要考虑,每次移动的速度,也就是\Alpha的值,这个值也叫做(学习率). 学习率的增大可以加速参数逼近最优的情况, 但是如果在快要到达函数的底端的时候,需要减小学习率,以免出现cost 不断增大或者不停摆动的情况(如下图, J(a,b)就是cost(a,b) )。 所以说,当出现以上两种情况时候,我们应该果断选取一个较小的学习率, 以保证cost能减少到一个稳定的值(我们称为 收敛converge).
1.1.2 直接求解最小点方法
这时候,有的人会问,为什么要让a不停地往下跑呢? 而且还需要设定学习率, 多麻烦, 直接让找 导数为0点(最小极值), 不就可以了吗? 嗯。。。也可以...但是各有优缺,
具体方法和优劣分析可见Rachel-Zhang 的博客:
总结一下: 回归问题的解决方法是:
1. 假定一个模型 2. 定义什么叫做最好的匹配(构造误差函数) 3. 用这个模型去匹配已有的数据点(训练集)
需要进一步讨论的问题:
如果参数(a,b)更多了该怎么办?
如果最合适的匹配模型并不是线性的怎么办? --- 选用一个 非线性模型 比如 y = ax^2 + bx + c.
如果误差(cost)与a,b(模型参数)的关系不是像碗一样的, 而是凹凸不平的该怎么办? ------ 这时候你就得注意你得到的cost的最低点(局部的最低)可能因初始点的不同而不同。 而这些最低点你需要进行比较,以确定是不是全局的最低
2.分类(Logistic regression)
分类问题也是一类很常见的问题。 比如说,怎么判定一个人是高富帅还是吊丝? 假如我是中央电视台的记者,采访了N个人, 拿到了第一手资料。资料如下
我们想要根据一个人的口袋钱数量,来预测一个人是(富帅) 还是 (吊丝). 我们能不能用回归的方法做呢? 显然是可以的, 我们只要找到一个模型,然后再进行匹配就可以了。
但是因为分类问题的y值常常是一些离散的数字,(比如, 富帅为1, 吊丝为0), 所以我们已经不能用一个 简单的线性函数来拟合这些数据了。我们需要一个更逼真的模型。
于是我们引入了一个更适合处理分类问题的函数--- 一个 非线性函数, 阶跃函数。
这个函数的形状更像我们分类问题的数据分布,所以,用他来拟合分类问题的数据将 更适合!
所以我们有了一个新的模型,
通过调整a,b 的值,可以让模型不断改变以匹配数据点。 为了匹配数据点,我们又需要一个衡量匹配程度的函数,就像 回归问题一样的cost 函数. 于是同理我们可以得到cost
于是我们急切地想要把它用我们之前的gradient descent 的方法求解出使cost 最小的两个a,b值。 但是很遗憾的是, 这个cost函数关于a,b,是非凸(non-convex)的。 就像下面那张图那样坑坑洼洼。。。
所以你 没有办法通过以上两种方法(1.1.1和1.1.2)求出这个cost函数的 全局最小值。
所以你需要构造一个更好的cost函数, 在可以 衡量拟合程度的同时 又是 一个关于a,b 的凸函数(像回归问题的cost一样,和一个碗一样,只有一个极小值).
这怎么构造啊....
幸好我们还有各种伟大的数学家,他们夜以继日,终于赶制出了一个形状和碗一样(convex)的cost函数. (Maximum Likelihoods Estimation 更具体的介绍请看 )
现在我们又可以用我们熟悉的 导数方向下降法(gradient descent) 移动a, b的值,使cost 降低到最小。
最后,分类的问题就这样被解决了。
当然,更复杂的问题可能有:
现在是分成两类,如果数据需要分成三类或者更多该怎么办? ---- 假如有A,B,C三类, 把其中A类做为1,BC做为0,然后做Logistic regression, 得到模型a, 同理将B类做为1,AC作为0,得到模型b, 再同理得到模型c. 最后测试的时候, 对任意一个数据点x, 我们能够得到x分别属于A,B,C三类的概率值
最后比较大小,哪个大,这个x就属于哪一类
具体可看, (七)
3.总结(两个问题的区别)
这篇文章大概的意图是能想让大家了解, 机器学习中最基本的两类问题,线性回归和分类。 能让大家有个清晰的思想,对于这两类问题都有以下几个步骤,
如何选取一个 合理的模型(线性的,or 非线性的(e.g. 阶跃函数, 高斯函数)).
制造一个"美好"的 误差函数 (可以评估拟合程度,而且还是convex函数)
采取一切可能的技术(e.g. 导数下降法,解极值方程法) 求出最好的模型参数
谈谈回归和分类的区别:
其实 回归问题和分类问题的本质一样,都是针对一个输入做出一个输出预测,其区别在于 输出变量的类型。
分类问题是指,给定一个新的模式,根据训练集推断它所对应的类别(如:+1,-1),是一种定性输出,也叫离散变量预测;
回归问题是指,给定一个新的模式,根据训练集推断它所对应的输出值(实数)是多少,是一种定量输出,也叫连续变量预测。
举个例子:预测明天的气温是多少度,这是一个回归任务;预测明天是阴、晴还是雨,就是一个分类任务。
文章知识点与官方知识档案匹配
算法技能树首页概览
31211 人正在系统学习中
点击阅读全文
打开CSDN,阅读体验更佳
PyTorch-RNN循环神经网络实现分类-回归_Coding路人王的博客
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) 对循环神经网络的研究始于二十世纪80-90年代,...
分类与回归及网络搭建+神经网络简介(学习记录与分享)
1.神经网络是函数 有人可能会认为神经网络是池化层,全连接层,激活函数等等元素构成。但学长告诉我们,神经网络本质就是函数。 所以下次可以在不懂的朋友面前装一手,问他什么是神经网络啊,你可以告诉他,神经网络就是函数(doge) 2.介绍一...
BP神经网络用于分类和回归
matlab 编写的BP神经网络,用于分类和回归
【机器学习基础】分类任务 和 回归任务 的 区别与联系
分类任务 和 回归任务 的区别在于 需要预测的值的类型: 回归任务,是对 连续值 进行预测(比如 多少); 分类任务,是对 离散值 进行预测(比如 是不是,属不属于,或者 属于哪一类)。 打个比方, 预测 明天的气温是多少度,这是一个回归任务; 预测 明天会不会下雨,就是一个分类任务。
继续访问
多分类神经网络:Softmax回归_L_bloomer的博客_神经网络...
1.逻辑回归是一个单层神经网络,计算非常快速,在使用OvR和MvM这样需要同时建立多个模型的方 法时,运算速度不会成为太大的问题。但真实使用的神经网络往往是一个庞大的算法,建立一个模 型就会耗费很多时间,因此必须建立很多个模型来求解的...
神经网络-回归(Python)_li_rshan的博客
回归与神经网络简介 回归分析 回归分析(regression analysis)是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 回归分析的作用是: ①从一组数据出发确定某些变量之间的定量关系式 ②对变量间这些关系式进行统计检验。并从...
最新发布 深度学习——分类和回归问题联系与区别
深度学习——分类和回归问题联系与区别
继续访问
人工神经网络的分类包括,人工神经网络的分类有
从20世纪80年代末期,人工神经网络方法开始应用于遥感图像的自动分类。目前,在遥感图像的自动分类方面,应用和研究比较多的人工神经网络方法主要有以下几种:人脑计算机对接技术项目名称:小发猫 (1)BP(Back Propagation)神经网络,这是一种应用较广泛的前馈式网络,属于有监督分类算法,它将先验知识融于网络学习之中,加以最大限度地利用,适应性好,在类别数少的情况下能够得到相当高的精度,但是其网络的学习主要采用误差修正算法,识别对象种类多时,随着网络规模的扩大,需要的计算过程较长,收敛缓慢而不稳定,且
继续访问
(二)神经网络入门之Logistic回归(分类问题)_coderpai的博客
这篇教程是翻译Peter Roelants写的神经网络教程,作者已经授权翻译,这是原文。 该教程将介绍如何入门神经网络,一共包含五部分。你可以在以下链接找到完整内容。 Logistic回归(分类问题) 这部分教程将介绍一部分: ...
组合分类和回归的神经网络模型_Together_CZ的博客_回归网络...
我们可以将数据用作开发单独的回归和分类多层感知器(MLP)神经网络模型的基础。 注意:我们并未尝试为此数据集开发最佳模型; 相反,我们正在展示一种特定的技术:开发可以进行回归和分类预测的模型。
Tensorflow学习二:神经网络用于分类和回归的损失函数
引言: 对于二分类问题,一般会将预测结果经过一个非线性变换缩小到0到1之间,并设置一个阀值,比如0.5,小于0.5便是0,大于0.5便是1。但是这种做法对于多分类是不适用的。交叉熵: 通过神经网络解决多分类的方法是设置n个输出节点,n代表类别数。对于每一个样例,神经网络会得到一个n维数组做为输出结果。数组中的每一个维度代表对应的类别。理想情况下,如果一个样本属于k,那么这个类...
继续访问
人工神经网络模型与分类
1. 人工神经网络的分类 按性能分:连续型和离散型网络,或确定型和随机型网络。 按拓扑结构分:前向网络和反馈网络。 前向网络有自适应线性神经网络(AdaptiveLinear,简称Adaline)、单层感知器、多层感知器、BP等。 前向网络,网络中各个神经元接受前一级的输入,并输出到下一级,网络中没有反馈,可以用一个有向无环路图表示。这种网络实现信号从输入空间
继续访问
深度学习---卷积神经网络解决分类与回归问题_wowMJX的博客
(1)分类:经过一系列的卷积层和池化层之后,再经过全连接层得到样本属于每个类的得分(概率值),用softmax对其进行分类。 (2)回归:定位,用一个矩形框来框住要识别的物体。 ①回归:输入数据通过神经网络不断的拟合数据得到x,y,w,h,通...
机器学习 --- 1. 线性回归与分类, 解决与区别
机器学习可以解决很多问题,其中最为重要的两个是 回归与分类。 这两个问题怎么解决, 它们之间又有什么区别呢? 以下举几个简单的例子,以给大家一个概念 1. 线性回归 回归分析常用于分析两个变量X和Y 之间的关系。 比如 X=房子大小 和 Y=房价 之间的关系, X=(公园人流量,公园门票票价) 与 Y=(公园收入) 之间的关系等等。 那么你的数据点在图上可以这么看 现在你想找到 房
继续访问
线性模型小结:还分不清线性回归和线性分类模型?
线性模型0. 写在前面1. 线性模型2. 用于回归和分类回归问题分类问题3. 分类任务的几个问题3.1 如何解决非线性的分类问题3.2 如何解决多分类问题:三种解决 0. 写在前面 今天对线性模型做一个总结,围绕以下两个点理一理思路: 判别函数 - 决策函数; 线性模型 - 线性模型各类拓展 具体沿着以下几个问题展开: 1. 生成方法与判别方法 2. 判别函数与决策函数 3. 线性模型 4. 广义...
《Python神经网络》2——神经元
虽然计算机拥有相对大量的电子计算元件、巨大的存储空间,并且这些计算机的运行频率比肉蓬蓬、软绵绵的生物大脑要快得多,但是即使是像鸽子一样小的大脑,其能力也远远大于这些电子计算机。
传统的计算机按照严格的串行顺序,相当准确具体地处理数据。对于这些冰冷坚硬的计算机而言,不存在模糊性和不确定性。而另一方面,动物的大脑表面上看起来以慢得多的节奏运行,却似乎以并行方式处理信号,模糊性是其计算的一种特征。
虽然神经元有各种形式,但是所有的神经元都是将电信号从一端传输到另一端,沿着轴突,将电信号从树突传到树突。然后,这些信号从 一个神经元传递到另一个神经元。
我们需要多少神经元才能执行相对复杂的有趣任务呢?
一般来说,能力非常强的人类大脑有大约1000亿个神经元!一只果蝇有约10万个神经元,能够飞翔、觅食、躲避危险、寻找食物以及执行许多相当复杂的任务。 10万个神经元,这个数字恰好落在了现代计算机试图复制的范围内。 一只线虫仅仅具有302个神经元,与今天的数字计算资源相比,简直就是微乎其微!但是一直线虫能够完成一些相当有用的任务,而这些任务对于尺寸大得多的传统计算机程序而言却难以完成。
激活函数:
阶跃函数,S函数。
python单位阶跃函数
round()函数用错了啊,你应该写成:
lb = round(fx*2.205, 2)
这样。
round(x[, n])
Return the floating point value x rounded to n digits after the decimal point. If n is omitted, it defaults to zero. Delegates to x.__round__(n).
For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus n; if two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5) and round(-0.5) are 0, and round(1.5) is 2). The return value is an integer if called with one argument, otherwise of the same type as x.
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
python 的阶跃函数怎么写
def f(T):
def wrap(t):
if t 0 and t T / 2: return 1
elif t == T / 2: return 0
else:return -1
return wrap
if __name__ == '__main__':
d = f(2)
print d(2)
如何使用python做统计分析
Shape Parameters
形态参数
While a general continuous random variable can be shifted and scaled
with the loc and scale parameters, some distributions require additional
shape parameters. For instance, the gamma distribution, with density
γ(x,a)=λ(λx)a−1Γ(a)e−λx,
requires the shape parameter a. Observe that setting λ can be obtained by setting the scale keyword to 1/λ.
虽然一个一般的连续随机变量可以被位移和伸缩通过loc和scale参数,但一些分布还需要额外的形态参数。作为例子,看到这个伽马分布,这是它的密度函数
γ(x,a)=λ(λx)a−1Γ(a)e−λx,
要求一个形态参数a。注意到λ的设置可以通过设置scale关键字为1/λ进行。
Let’s check the number and name of the shape parameters of the gamma
distribution. (We know from the above that this should be 1.)
让我们检查伽马分布的形态参数的名字的数量。(我们知道从上面知道其应该为1)
from scipy.stats import gamma
gamma.numargs
1
gamma.shapes
'a'
Now we set the value of the shape variable to 1 to obtain the
exponential distribution, so that we compare easily whether we get the
results we expect.
现在我们设置形态变量的值为1以变成指数分布。所以我们可以容易的比较是否得到了我们所期望的结果。
gamma(1, scale=2.).stats(moments="mv")
(array(2.0), array(4.0))
Notice that we can also specify shape parameters as keywords:
注意我们也可以以关键字的方式指定形态参数:
gamma(a=1, scale=2.).stats(moments="mv")
(array(2.0), array(4.0))
Freezing a Distribution
冻结分布
Passing the loc and scale keywords time and again can become quite
bothersome. The concept of freezing a RV is used to solve such problems.
不断地传递loc与scale关键字最终会让人厌烦。而冻结RV的概念被用来解决这个问题。
rv = gamma(1, scale=2.)
By using rv we no longer have to include the scale or the shape
parameters anymore. Thus, distributions can be used in one of two ways,
either by passing all distribution parameters to each method call (such
as we did earlier) or by freezing the parameters for the instance of the
distribution. Let us check this:
通过使用rv我们不用再更多的包含scale与形态参数在任何情况下。显然,分布可以被多种方式使用,我们可以通过传递所有分布参数给对方法的每次调用(像我们之前做的那样)或者可以对一个分布对象冻结参数。让我们看看是怎么回事:
rv.mean(), rv.std()
(2.0, 2.0)
This is indeed what we should get.
这正是我们应该得到的。
Broadcasting
广播
The basic methods pdf and so on satisfy the usual numpy broadcasting
rules. For example, we can calculate the critical values for the upper
tail of the t distribution for different probabilites and degrees of
freedom.
像pdf这样的简单方法满足numpy的广播规则。作为例子,我们可以计算t分布的右尾分布的临界值对于不同的概率值以及自由度。
stats.t.isf([0.1, 0.05, 0.01], [[10], [11]])
array([[ 1.37218364, 1.81246112, 2.76376946],
[ 1.36343032, 1.79588482, 2.71807918]])
Here, the first row are the critical values for 10 degrees of freedom
and the second row for 11 degrees of freedom (d.o.f.). Thus, the
broadcasting rules give the same result of calling isf twice:
这里,第一行是以10自由度的临界值,而第二行是以11为自由度的临界值。所以,广播规则与下面调用了两次isf产生的结果相同。
stats.t.isf([0.1, 0.05, 0.01], 10)
array([ 1.37218364, 1.81246112, 2.76376946])
stats.t.isf([0.1, 0.05, 0.01], 11)
array([ 1.36343032, 1.79588482, 2.71807918])
If the array with probabilities, i.e, [0.1, 0.05, 0.01] and the array of
degrees of freedom i.e., [10, 11, 12], have the same array shape, then
element wise matching is used. As an example, we can obtain the 10% tail
for 10 d.o.f., the 5% tail for 11 d.o.f. and the 1% tail for 12 d.o.f.
by calling
但是如果概率数组,如[0.1,0.05,0.01]与自由度数组,如[10,11,12]具有相同的数组形态,则元素对应捕捉被作用,我们可以分别得到10%,5%,1%尾的临界值对于10,11,12的自由度。
stats.t.isf([0.1, 0.05, 0.01], [10, 11, 12])
array([ 1.37218364, 1.79588482, 2.68099799])
Specific Points for Discrete Distributions
离散分布的特殊之处
Discrete distribution have mostly the same basic methods as the
continuous distributions. However pdf is replaced the probability mass
function pmf, no estimation methods, such as fit, are available, and
scale is not a valid keyword parameter. The location parameter, keyword
loc can still be used to shift the distribution.
离散分布的简单方法大多数与连续分布很类似。当然像pdf被更换为密度函数pmf,没有估计方法,像fit是可用的。而scale不是一个合法的关键字参数。Location参数,关键字loc则仍然可以使用用于位移。
The computation of the cdf requires some extra attention. In the case of
continuous distribution the cumulative distribution function is in most
standard cases strictly monotonic increasing in the bounds (a,b) and
has therefore a unique inverse. The cdf of a discrete distribution,
however, is a step function, hence the inverse cdf, i.e., the percent
point function, requires a different definition:
ppf(q) = min{x : cdf(x) = q, x integer}
Cdf的计算要求一些额外的关注。在连续分布的情况下,累积分布函数在大多数标准情况下是严格递增的,所以有唯一的逆。而cdf在离散分布,无论如何,是阶跃函数,所以cdf的逆,分位点函数,要求一个不同的定义:
ppf(q) = min{x : cdf(x) = q, x integer}
For further info, see the docs here.
为了更多信息可以看这里。
We can look at the hypergeometric distribution as an example
from scipy.stats import hypergeom
[M, n, N] = [20, 7, 12]
我们可以看这个超几何分布的例子
from scipy.stats import hypergeom
[M, n, N] = [20, 7, 12]
If we use the cdf at some integer points and then evaluate the ppf at
those cdf values, we get the initial integers back, for example
如果我们使用在一些整数点使用cdf,它们的cdf值再作用ppf会回到开始的值。
x = np.arange(4)*2
x
array([0, 2, 4, 6])
prb = hypergeom.cdf(x, M, n, N)
prb
array([ 0.0001031991744066, 0.0521155830753351, 0.6083591331269301,
0.9897832817337386])
hypergeom.ppf(prb, M, n, N)
array([ 0., 2., 4., 6.])
If we use values that are not at the kinks of the cdf step function, we get the next higher integer back:
如果我们使用的值不是cdf的函数值,则我们得到一个更高的值。
hypergeom.ppf(prb + 1e-8, M, n, N)
array([ 1., 3., 5., 7.])
hypergeom.ppf(prb - 1e-8, M, n, N)
array([ 0., 2., 4., 6.])
10X单细胞(10X空间转录组)降维分析之UMAP
UMAP ,全称uniform manifold approximation and projection,统一流形逼近与投影,是基于黎曼几何和代数拓扑的理论框架结构构建的。在处理大数据集时,UMAP优势明显,运行速度更快,内存占用小。Etienne Becht等人2019年在Nature Biotechnology上发表一篇文章将其应用在生物学数据上并阐述了UMAP在处理单细胞数据方面的应用和优势。
如果你不知道tSNE是什么,它是如何工作的,也没有读过2008年的革命性的van der Maaten Hinton原稿,可以参考我的那文章 10X单细胞(10X空间转录组)降维分析之tSNE(算法基础知识) 。尽管tSNE对一般的单细胞基因组学和数据科学产生了巨大的影响,但人们普遍认为它有一些缺点,这些缺点很快将得到解决。( tSNE的缺点在上次分享的文章中也做过详细的介绍 )。
看看上面的图,我想说的是 t分布应该提供全局距离信息,因为它们将高维空间中相距较远的点推到低维空间中更远的点。
然而,这种良好的意愿被成本函数(KL-divergence)的选择所扼杀,我们将在后面看到其原因。
(1),可以显著降低计算时间高维图像由于求和或集成是一个代价高昂的计算过程。想想马尔可夫链蒙特卡罗(MCMC)它基本上是试图近似地计算在贝叶斯规则的分母上的积分(UMAP使用最近邻居的数量而不是perplexity)
(2)定义perplexity, UMAP则定义了没有log2函数的最近邻居k的个数,即:
UMAP使用稍微不同的高维概率对称
symmterization是必要的因为UMAP融合在一起的点与本地不同的指标(通过参数ρ),它可能发生图A和B节点之间的重量不等于B之间的权重和节点。为什么UMAP使用这种对称而不是tSNE使用的对称还不清楚。我将在下一篇文章(从头开始编写UMAP)中展示我对不同的对称化规则的实验,这并没有使我相信这是如此重要的一步,因为它对最终的低维嵌入式产生了很小的影响。
UMAP使用曲线族1 / (1+a*y^(2b))在低维中建模距离概率,不是完全的学生t分布,但非常非常相似,请注意再次没有应用标准化:
其中,对于默认UMAP超参数a≈1.93,b≈0.79(实际上,对于min_dist = 0.001)。在实践中,UMAP从非线性最小二乘拟合到带有min_dist超参数的分段函数中找到a和b:
为了更好地理解曲线族1 / (1+a*y^(2b))的行为,让我们画出不同a和b的曲线:
我们可以看到曲线族对参数b非常敏感,在大的参数b处,在小的参数y处,曲线族形成了一种高峰。这意味着在UMAP超参数min_dist之下,所有的数据点都是同样紧密相连的。由于Q(Y)函数的行为几乎像一个Heaviside阶跃函数,这意味着UMAP为所有在低维空间中相互靠近的点分配了几乎相同的低维坐标。min_dist正是导致在UMAP维数降低图中经常观察到的超密集集群的原因。
为了演示如何准确地找到a和b参数,让我们展示一个简单的分段函数(其中高峰部分是通过min_dist参数定义的),并使用函数族1 / (1+a y^(2b))通过优化来拟合它。curve_fit来自Scipy Python库。作为拟合的结果,我们得到了函数1 / (1+a y^(2b))的初值a和初值b。
由于我们需要知道交叉熵的梯度,以便以后实现梯度下降,让我们快速计算它。忽略只包含p(X)的常数项,我们可以将交叉熵重新写一下,并将其微分如下:
图拉普拉斯、谱聚类、拉普拉斯Eignemaps、扩散图、谱嵌入等,实际上是指将矩阵分解和邻接图方法结合起来解决降维问题的同一种有趣的方法。在这种方法中,我们首先构造一个图(或knn图),然后通过构造拉普拉斯矩阵用矩阵代数(邻接矩阵和度矩阵)将其形式化,最后分解拉普拉斯矩阵,即求解特征值分解问题。
我们可以使用scikit-learn Python库,并使用spectralembedded函数在演示数据集(即与癌症相关的成纤维细胞(CAFs) scRNAseq数据)上轻松地显示初始的低维坐标:
最后,UMAP使用随机梯度下降(SGD)代替常规梯度下降(GD),如tSNE / FItSNE,这既加快了计算速度,又减少了内存消耗。
现在让我们简要地讨论一下为什么他们说tSNE只保留数据的局部结构。可以从不同的角度来理解tSNE的局部性。首先,我们有σ参数Eq。(1)本地数据点集这样互相“感觉”。因为成对欧几里得距离衰减指数的概率,在小的σ值,它基本上是零遥远的点(大型X)和快速增长仅为最近的邻居(小X)。相比之下,在大的σ,遥远而近点的概率成为限制可比和σ→∞,概率就等于1为所有任何一对点之间的距离,即成为等距点。
有趣的是,如果我们扩大成对欧几里得距离的概率高维度成泰勒级数在σ→∞,我们会在第二近似幂律:
关于两两欧几里得距离的幂律类似于多维定标法(MDS)的成本函数,MDS是通过保存每对点之间的距离来保存全局距离,而不管它们是相距很远还是很近。一个可以解释这个大的σtSNE远程数据点之间的相互作用,所以是不完全正确的说tSNE只能处理当地的距离。然而,我们通常会受到perplexity有限值的限制,Laurens van der Maaten建议perplexity的取值范围在5到50之间,尽管在局部信息和全局信息之间可能会有一个很好的折衷,那就是使用平方根≈N^(1/2)来选择perplexity,其中N为样本量。相反的极限,σ→0,我们最终的极端“局部性”高维概率的行为类似于狄拉克δ函数的行为。
另一种理解tSNE“局部性”的方法是考虑KL-divergence函数。假设X是高维空间中点之间的距离Y是低维空间中点之间的距离
根据kl -散度的定义:
方程(9)的第一项对于X的大小都是趋近于0的,对于X的大小也是趋近于0的,因为指数趋近于1,而log(1)=0。对于大X,这一项仍然趋近于0因为指数前因子趋近于0的速度快于对数趋近于负无穷。因此,为了直观地理解kl散度,只考虑第二项就足够了:
这是一个看起来很奇怪的函数,让我们画出KL(X, Y)
这个函数的形状非常不对称。如果点在高维度X之间的距离很小,指数因子变成1和对数项行为日志(1 + Y ^ 2)这意味着如果Y是在低维空间的距离大,将会有一个大的惩罚,因此tSNE试图减少Y在小X为了减少罚款。相反,对于高维空间中的长距离X, Y基本上可以是0到∞之间的任何值,因为指数项趋于0,并且总是胜过对数项。因此,在高维空间中相距遥远的点,在低维空间中可能会相互靠近。因此,换句话说,tSNE并不能保证高维空间中相距较远的点在低维空间中会保持较远的距离。然而,它确实保证了在高维空间中相邻的点在低维空间中保持相邻。所以tSNE不是很擅长远距离投射至低维,所以它只保留本地数据结构提供了σ不去∞。
与tSNE不同,UMAP使用交叉熵(CE)作为成本函数,而不是KL-divergence
这导致了地方-全球结构保护平衡的巨大变化。在X的小值处,我们得到了与tSNE相同的极限,因为第二项由于前因子和对数函数比多项式函数慢的事实而消失:
因此,为了使惩罚规则最小化,Y坐标必须非常小,即Y→0。这与tSNE的行为完全一样。但是,在大X的相反极限,即X→∞时,第一项消失,第二项的前因子为1,得到:
这里,如果Y很小,我们会得到一个很大的惩罚,因为Y在对数的分母上,因此,我们鼓励Y很大,这样,对数下的比率就变成了1,我们得到零惩罚。因此,我们在X→∞处得到Y→∞,所以从高维空间到低维空间的整体距离保持不变,这正是我们想要的。为了说明这一点,让我们绘制UMAP CE成本函数:
在这里,我们可以看到图的“右”部分看起来与上面的kl散度曲面非常相似。这意味着在X低的时候,为了减少损失,我们仍然想要Y低。然而,当X很大时,Y的距离也要很大,因为如果它很小,CE (X, Y)的损失将是巨大的。记住,之前,对于KL (X, Y)曲面,在X很大的情况下,我们在高Y值和低Y值之间没有差别,这就是为什么CE (X, Y)代价函数能够保持全局距离和局部距离。
我们知道UMAP是速度比tSNE担忧)时大量的数据点,b)嵌入维数大于2或3,c)大量环境维度的数据集。在这里,让我们试着了解UMAP要优于tSNE来自于数学和算法实现。
tSNE和UMAP基本上都包含两个步骤:
然而,我注意到UMAP的第一步比tSNE快得多。这有两个原因:
接下来,UMAP实际上在第二步中也变得更快了。这种改善也有几个原因:
在这篇文章中,我们了解到尽管tSNE多年来一直服务于单细胞研究领域,但它有太多的缺点,如速度快、缺乏全球距离保存。UMAP总体上遵循了tSNE的哲学,但是引入了一些改进,例如另一个成本函数和缺少高维和低维概率的标准化。
除了运行速度快,内存占用小等特点,UMAP在处理细胞学数据时还有一个大的优势,就是可以反映细胞群体之间分化的连续性和组织性。下面将通过文献中的数据【2】来为大家详细讲解。
对同一组数据分别进行tSNE和UMAP降维,该数据为多达30万个从8种不同组织富集得到的T细胞和NK细胞的样本,并使用Phenograph聚类把细胞分为6大类,每种颜色代表一种细胞。从图中可以看出,UMAP和tSNE都可以较好地把不同类别的细胞分开。但tSNE倾向于把相同细胞群划分为更多的群,如图显示,黑色圈中CD8 T细胞,在tSNE结果中,群数更多,距离更远。
同样这组数据用组织来源对UMAP和t-SNE图上细胞的进行颜色区分,可以观察到一个有意思的现象。与UMAP相比,t-SNE更加倾向于根据它们的来源来分离总体细胞。而 UMAP则会兼顾细胞群的类别和来源来排列,如图中在CD4 T细胞和CD8 T细胞群内,细胞的排列与来源也会有一定的规律性,都是大致从脐带血(CB)和外周血单核细胞(PBMC),到肝脏(Liver)和脾脏(Spleen),最后到一端的扁桃或另一端的皮肤(Skin)、肠道(Gut)和肺(Lung)。
通过驻留记忆T细胞标志物CD69/CD103、记忆T细胞标志物CD45 RO和naïve T细胞标志物CCR7表达群的分布,可以观察到UMAP可以展示出T细胞连续的分化阶段。而tSNE结果中,这些群之间也是连续的,但是却没有非常明显的沿轴结构。同样的现象也在造血细胞系统中被观察到。由此可见, UMAP在大数据集的处理时可以展现细胞集群的连续性。
对三组数据(Samusik、Wong、Han_400k)分别进行数据随机降低至100-200,000之间不同的数量级,形成小数据集。纵轴为小数据集与原始数据集的相关性,代表降维方法在不同数据量上的可重复性。UMAP表现最好,数据集越大,优势越明显。
下图是UMAP和t-SNE对一套784维Fashion MNIST高维数据集降维到3维的效果的比较。
虽然这两种算法都表现出强大的局部聚类并将相似的类别分组在一起,但UMAP还将这些相似类别的分组彼此分开。另外,UMAP降维用了4分钟,而多核t-SNE用了27分钟。
UMAP的两个最常用的参数:n_neighbors 和 min_dist,它们可有效地用于控制最终结果中局部结构和全局结构之间的平衡。
最重要的参数是 n_neighbors ,近似最近邻居数。它有效地控制了UMAP局部结构与全局结构的平衡,数据较小时,UMAP会更加关注局部结构,数据较大时,UMAP会趋向于代表大图结构,丢掉一些细节。
第二个参数是 min_dist,点之间的最小距离。此参数控制UMAP聚集在一起的紧密程度,数据较小时,会更紧密。较大的值会更松散,而将重点放在保留广泛的拓扑结构上。
t-SNE和UMAP大部分的表现非常相似,但以下示例明显例外:宽而稀疏的cluster中有密集的cluster(如下图所示)。UMAP无法分离两个嵌套的群集,尤其是在维数较高时。
UMAP在初始图形构造中局部距离的使用可以解释该算法无法处理情况的原因。由于高维点之间的距离趋于非常相似(维数的诅咒),所以可能会因此将其混合在一起。
算法很难,所以懂的人才显得牛
天行健,君子以自强不息
文章题目:python阶跃函数,阶跃函数的性质
文章来源:http://myzitong.com/article/hsiogi.html