A. 在程序设计中,程序员对函数的独立性、原子性,通用性和可复用性
选B,函数设计应该遵循高内聚低耦合,多的使用外部变量只会增加耦合和依赖
B. 有人说程序员在数学方面只会加减剩除就可以了是吗
应该不是吧,程序员分很多种的,需要根据代码,算法解决不同问题。而且程序员的数学要求应该是比较高的。学电子工程类的大物都得很好。
C. 编程与数学
离散数学是在大学开设的,其实初中生也能看得懂,主要是因为它的描述过于严谨,所以看起来有点神圣。但只要明白其本质,也没有什么难的,不过是比较烦。
你不用专门地从头研究数学。如果你学过一点编程,那么建议你学习数据结构,从中你可以了解到学习哪些数学知识能帮你更好地前进;而且在学习过数据结构之后,你的编程水平将大大提高。
掌握一门语言的语法并不需要太多的数学知识。只有在遇到具体问题时,要用到数学上的相关理论,数学才发挥作用,此时完全可以通过查资料来解决。当然,有数学基础自然可以事半功倍。不过通过应用时的临时学习将使你对该理论有更深该的认识也形成了你的实践积累。
当你的编程水平到达一定的高度的时候,你已经明白自己的不足了,这时你可以根据自己的需要进行系统的学习。
最后给你一条武林秘决(今天你可能无法领悟,到你功力倍进的时候,你就会心领神会了)
程序=算法+数据结构
D. 程序员需要数学很厉害吗
程序员不需要数学特别优秀,但需要有一定的数学基础。
程序员(英文Programmer)是从事程序开发、程序维护的基层工作人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚。
数学是人类对事物的抽象结构与模式进行严格描述的一种通用手段,可以应用于现实世界的任何问题,所有的数学对象本质上都是人为定义的。从这个意义上,数学属于形式科学,而不是自然科学。不同的数学家和哲学家对数学的确切范围和定义有一系列的看法。
程序员岗位职责:
1、对项目经理负责,负责软件项目的详细设计、编码和内部测试的组织实施,对小型软件项目兼任系统分析工作,完成分配项目的实施和技术支持工作。
2、协助项目经理和相关人员同客户进行沟通,保持良好的客户关系。
3、参与需求调研、项目可行性分析、技术可行性分析和需求分析。
4、熟悉并熟练掌握交付软件部开发的软件项目的相关软件技术。
E. 程序员必备的一些数学基础知识
作为一个标准的程序员,应该有一些基本的数学素养,尤其现在很多人在学习人工智能相关知识,想抓住一波人工智能的机会。很多程序员可能连这样一些基础的数学问题都回答不上来。
作为一个傲娇的程序员,应该要掌握这些数学基础知识,才更有可能码出一个伟大的产品。
向量 向量(vector)是由一组实数组成的有序数组,同时具有大小和方向。一个n维向量a是由n个有序实数组成,表示为 a = [a1, a2, · · · , an]
矩阵
线性映射 矩阵通常表示一个n维线性空间v到m维线性空间w的一个映射f: v -> w
注:为了书写方便, X.T ,表示向量X的转置。 这里: X(x1,x2,...,xn).T,y(y1,y2,...ym).T ,都是列向量。分别表示v,w两个线性空间中的两个向量。A(m,n)是一个 m*n 的矩阵,描述了从v到w的一个线性映射。
转置 将矩阵行列互换。
加法 如果A和B 都为m × n的矩阵,则A和B 的加也是m × n的矩阵,其每个元素是A和B相应元素相加。 [A + B]ij = aij + bij .
乘法 如A是k × m矩阵和B 是m × n矩阵,则乘积AB 是一个k × n的矩阵。
对角矩阵 对角矩阵是一个主对角线之外的元素皆为0的矩阵。对角线上的元素可以为0或其他值。一个n × n的对角矩阵A满足: [A]ij = 0 if i ̸= j ∀i, j ∈ {1, · · · , n}
特征值与特征矢量 如果一个标量λ和一个非零向量v满足 Av = λv, 则λ和v分别称为矩阵A的特征值和特征向量。
矩阵分解 一个矩阵通常可以用一些比较“简单”的矩阵来表示,称为矩阵分解。
奇异值分解 一个m×n的矩阵A的奇异值分解
其中U 和V 分别为m × m和n×n 的正交矩阵,Σ为m × n的对角矩阵,其对角 线上的元素称为奇异值(singular value)。
特征分解 一个n × n的方块矩阵A的特征分解(Eigendecomposition)定义为
其中Q为n × n的方块矩阵,其每一列都为A的特征向量,^为对角阵,其每一 个对角元素为A的特征值。 如果A为对称矩阵,则A可以被分解为
其中Q为正交阵。
导数 对于定义域和值域都是实数域的函数 f : R → R ,若f(x)在点x0 的某个邻域∆x内,极限
存在,则称函数f(x)在点x0 处可导, f'(x0) 称为其导数,或导函数。 若函数f(x)在其定义域包含的某区间内每一个点都可导,那么也可以说函数f(x)在这个区间内可导。连续函数不一定可导,可导函数一定连续。例如函数|x|为连续函数,但在点x = 0处不可导。
加法法则
y = f(x),z = g(x) 则
乘法法则
链式法则 求复合函数导数的一个法则,是在微积分中计算导数的一种常用方法。若 x ∈ R,y = g(x) ∈ R,z = f(y) ∈ R ,则
Logistic函数是一种常用的S形函数,是比利时数学家 Pierre François Verhulst在 1844-1845 年研究种群数量的增长模型时提出命名的,最初作为一种生 态学模型。 Logistic函数定义为:
当参数为 (k = 1, x0 = 0, L = 1) 时,logistic函数称为标准logistic函数,记 为 σ(x) 。
标准logistic函数在机器学习中使用得非常广泛,经常用来将一个实数空间的数映射到(0, 1)区间。标准 logistic 函数的导数为:
softmax函数是将多个标量映射为一个概率分布。对于 K 个标量 x1, · · · , xK , softmax 函数定义为
这样,我们可以将 K 个变量 x1, · · · , xK 转换为一个分布: z1, · · · , zK ,满足
当softmax 函数的输入为K 维向量x时,
其中,1K = [1, · · · , 1]K×1 是K 维的全1向量。其导数为
离散优化和连续优化 :根据输入变量x的值域是否为实数域,数学优化问题可以分为离散优化问题和连续优化问题。
无约束优化和约束优化 :在连续优化问题中,根据是否有变量的约束条件,可以将优化问题分为无约束优化问题和约束优化问题。 ### 优化算法
全局最优和局部最优
海赛矩阵
《运筹学里面有讲》,前面一篇文章计算梯度步长的时候也用到了: 梯度下降算法
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度下降法
梯度下降法(Gradient Descent Method),也叫最速下降法(Steepest Descend Method),经常用来求解无约束优化的极小值问题。
梯度下降法的过程如图所示。曲线是等高线(水平集),即函数f为不同常数的集合构成的曲线。红色的箭头指向该点梯度的反方向(梯度方向与通过该点的等高线垂直)。沿着梯度下降方向,将最终到达函数f 值的局部最优解。
梯度上升法
如果我们要求解一个最大值问题,就需要向梯度正方向迭代进行搜索,逐渐接近函数的局部极大值点,这个过程则被称为梯度上升法。
概率论主要研究大量随机现象中的数量规律,其应用十分广泛,几乎遍及各个领域。
离散随机变量
如果随机变量X 所可能取的值为有限可列举的,有n个有限取值 {x1, · · · , xn}, 则称X 为离散随机变量。要了解X 的统计规律,就必须知道它取每种可能值xi 的概率,即
称为离散型随机变量X 的概率分布或分布,并且满足
常见的离散随机概率分布有:
伯努利分布
二项分布
连续随机变量
与离散随机变量不同,一些随机变量X 的取值是不可列举的,由全部实数 或者由一部分区间组成,比如
则称X 为连续随机变量。
概率密度函数
连续随机变量X 的概率分布一般用概率密度函数 p(x) 来描述。 p(x) 为可积函数,并满足:
均匀分布 若a, b为有限数,[a, b]上的均匀分布的概率密度函数定义为
正态分布 又名高斯分布,是自然界最常见的一种分布,并且具有很多良好的性质,在很多领域都有非常重要的影响力,其概率密度函数为
其中, σ > 0,µ 和 σ 均为常数。若随机变量X 服从一个参数为 µ 和 σ 的概率分布,简记为
累积分布函数
对于一个随机变量X,其累积分布函数是随机变量X 的取值小于等于x的概率。
以连续随机变量X 为例,累积分布函数定义为:
其中p(x)为概率密度函数,标准正态分布的累计分布函数:
随机向量
随机向量是指一组随机变量构成的向量。如果 X1, X2, · · · , Xn 为n个随机变量, 那么称 [X1, X2, · · · , Xn] 为一个 n 维随机向量。一维随机向量称为随机变量。随机向量也分为离散随机向量和连续随机向量。 条件概率分布 对于离散随机向量 (X, Y) ,已知X = x的条件下,随机变量 Y = y 的条件概率为:
对于二维连续随机向量(X, Y ),已知X = x的条件下,随机变量Y = y 的条件概率密度函数为
期望 对于离散变量X,其概率分布为 p(x1), · · · , p(xn) ,X 的期望(expectation)或均值定义为
对于连续随机变量X,概率密度函数为p(x),其期望定义为
方差 随机变量X 的方差(variance)用来定义它的概率分布的离散程度,定义为
标准差 随机变量 X 的方差也称为它的二阶矩。X 的根方差或标准差。
协方差 两个连续随机变量X 和Y 的协方差(covariance)用来衡量两个随机变量的分布之间的总体变化性,定义为
协方差经常也用来衡量两个随机变量之间的线性相关性。如果两个随机变量的协方差为0,那么称这两个随机变量是线性不相关。两个随机变量之间没有线性相关性,并非表示它们之间独立的,可能存在某种非线性的函数关系。反之,如果X 与Y 是统计独立的,那么它们之间的协方差一定为0。
随机过程(stochastic process)是一组随机变量Xt 的集合,其中t属于一个索引(index)集合T 。索引集合T 可以定义在时间域或者空间域,但一般为时间域,以实数或正数表示。当t为实数时,随机过程为连续随机过程;当t为整数时,为离散随机过程。日常生活中的很多例子包括股票的波动、语音信号、身高的变化等都可以看作是随机过程。常见的和时间相关的随机过程模型包括贝努力过程、随机游走、马尔可夫过程等。
马尔可夫过程 指一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件概率分布仅依赖于当前状态。
其中X0:t 表示变量集合X0, X1, · · · , Xt,x0:t 为在状态空间中的状态序列。
马尔可夫链 离散时间的马尔可夫过程也称为马尔可夫链(Markov chain)。如果一个马尔可夫链的条件概率
马尔可夫的使用可以看前面一篇写的有意思的文章: 女朋友的心思你能猜得到吗?——马尔可夫链告诉你 随机过程还有高斯过程,比较复杂,这里就不详细说明了。
信息论(information theory)是数学、物理、统计、计算机科学等多个学科的交叉领域。信息论是由 Claude Shannon最早提出的,主要研究信息的量化、存储和通信等方法。在机器学习相关领域,信息论也有着大量的应用。比如特征抽取、统计推断、自然语言处理等。
在信息论中,熵用来衡量一个随机事件的不确定性。假设对一个随机变量X(取值集合为C概率分布为 p(x), x ∈ C )进行编码,自信息I(x)是变量X = x时的信息量或编码长度,定义为 I(x) = − log(p(x)), 那么随机变量X 的平均编码长度,即熵定义为
其中当p(x) = 0时,我们定义0log0 = 0 熵是一个随机变量的平均编码长度,即自信息的数学期望。熵越高,则随机变量的信息越多;熵越低,则信息越少。如果变量X 当且仅当在x时 p(x) = 1 ,则熵为0。也就是说,对于一个确定的信息,其熵为0,信息量也为0。如果其概率分布为一个均匀分布,则熵最大。假设一个随机变量X 有三种可能值x1, x2, x3,不同概率分布对应的熵如下:
联合熵和条件熵 对于两个离散随机变量X 和Y ,假设X 取值集合为X;Y 取值集合为Y,其联合概率分布满足为 p(x, y) ,则X 和Y 的联合熵(Joint Entropy)为
X 和Y 的条件熵为
互信息 互信息(mutual information)是衡量已知一个变量时,另一个变量不确定性的减少程度。两个离散随机变量X 和Y 的互信息定义为
交叉熵和散度 交叉熵 对应分布为p(x)的随机变量,熵H(p)表示其最优编码长度。交叉熵是按照概率分布q 的最优编码对真实分布为p的信息进行编码的长度,定义为
在给定p的情况下,如果q 和p越接近,交叉熵越小;如果q 和p越远,交叉熵就越大。
F. 数学对于一个程序员来说重要吗
程序员主要是编程的,数学可以提高程序员编程时采用数学模型的方法,使编程水平更加高。一个好的程序员一定有很好的数学功夫,所以数学对程序员非常重要。
G. 数据库系统中为什么具有数据独立性
数据库系统有较高的独立性是因为有了数据库,应用程序对数据的访问是要通过DBMS进行的,程序不能直接操作数据本身。
数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质 、处理对象和管理系统的集合体。
(7)程序员数学独立性扩展阅读:
数据库系统一般由4个部分组成:
(1)数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合。数据库中的数据按一定的数学模型组织、描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种用户共享。
(2)硬件:构成计算机系统的各种物理设备,包括存储所需的外部设备。硬件的配置应满足整个数据库系统的需要。
(3)软件:包括操作系统、数据库管理系统及应用程序。数据库管理系统(database management system,DBMS)是数据库系统的核心软件,是在操作系统的支持下工作,解决如何科学地组织和存储数据,如何高效获取和维护数据的系统软件。其主要功能包括:数据定义功能、数据操纵功能、数据库的运行管理和数据库的建立与维护。
(4)人员:主要有4类。第一类为系统分析员和数据库设计人员:系统分析员负责应用系统的需求分析和规范说明,他们和用户及数据库管理员一起确定系统的硬件配置,并参与数据库系统的概要设计。数据库设计人员负责数据库中数据的确定、数据库各级模式的设计。第二类为应用程序员,负责编写使用数据库的应用程序。这些应用程序可对数据进行检索、建立、删除或修改。第三类为最终用户,他们利用系统的接口或查询语言访问数据库。
H. 程序员的数学要求高不高
一般的程序员都有四年的在专业领域的学习,需要一个在程序领域的学士学位获得者,不论是数学方面的还是工程方面的都是可以的。大约有20%的人在这一领域的计算机科学和工程学拥有更高的学位。还有很小一部分程序员是自学的,尽管一些专业性的学校或者综合大学可以提供,但是也需要一些别的途径来提供相关的人才。尽管学历是比较重要的,但是公司经常把重点放在应聘者的工作经验上,很多刚从大学毕业的大学生虽然有引人注目的学位证书,但是他们找不到工作是因为他们缺乏经验。一个程序员虽然有正规的学历,但是如果一个人拥有程序设计的深厚知识背景或者丰富的工作经验的话,那么他的机会要比有学历的应届毕业生大得多。所以要尽量抓住有用的工作和实习机会,这样的话在毕业后你就会发现,多实习让你有更多的经验,在找工作的时候就有更多的机会。
对于职业程序员,另外一个重要的方面就是,程序员需要不断提升自己的业务技术,你的技术必须一直保持在一个较高的水平,并且要不断发展,程序员也要寻找贸易的机会,要参加研讨会,在周刊上发表文章和接受职业教育,这些使程序员在自己的领域中分级或者不断并排前进。
程序员的要求
无论如何,作为程序员,以下几个内容必须掌握
C语言,数据结构,算法,编译原理(不强求,至少知道词法分析和语法分析),OS的一些基本原理(进程调度,内存调度等等),计算机体系结构,软件工程
其他的要求至少英语四级(不然MSDN没法看),写过程序,数学不要太差
如果你掌握了这些内容,说明你至少和科班出身站在了同一起跑线上了。下面再根据你自己愿意从事专业发展。发展大致可以按平台划分
1、WINDOWS平台
2、LINUX/UNIX平台
3、嵌入式平台
WINDOW平台机会最多,待遇也最低,LINUX/UNIX次子,嵌入式待遇最好。但是学习机会刚好相反,WIN平台很好学,LINUX/UNIX一般用于大型机,而你自己估计平时也不会用这些东西,至于嵌入式,如果公司不给你机会学习,那你根本就没法进入这个行业。
当如,如果你在三个平台之一能做到精通,那么待遇都会很高。不过我敢说,就算CSDN,真正能透彻了解WINDOWS运行机制,能把API运用的纯熟的人都不会太多。
如果你做网络,网络也可以分很多。你是准备做布线,管理,架构还是研发?如果研发,又可以分写一般通讯程序,路由等网络设备研发(已经偏硬)等。
那么建议你至少熟悉以下内容
多平台的进程调度多线程和线程同步(TCP/IP协议在不同平台通讯很正常)
TCP/IP协议的了解
熟悉C/C++(跨平台C开发,包括VC,GCC等等)
等等
I. 作为一名合格的程序员,请问需要掌握哪些数学知识,学到什么样的水平
程序员的知识是多方面的, 数学方面至少高等数学大专以上文化程度,概率统计,数字逻辑运算方面的知识,主要就是做哪一方面的程序设计,有些学过的可能长期也不用,搞科学研究的、游戏、智能软件开发、安全方面的要求就高一些,没有一定数学基础有些算法书就读不懂,搞社会一般应用的要求相对较低一些,这些只是常识,程序员关键一点把一门课及相关知识精通,可以把用户提出的问题很快的自己能够理解,转换成计算机处理方式,成为软件或网站,而且和用户的需求基本一致。当然有些人的数学水平并不高,设计出的软件人人爱用,水平很高,程序员的知识包括数学方面的知识也在不断充实更新中。
J. 当一个程序员需要多好的数学
任何面向工作的功利的学习行为都可以视为一种投资,必须考虑成本和收益的tradeoff;总体来看,个人认为计算机系本科不教的数学对于绝大多数程序员来说都是没有必要熟练掌握的数学。
数学不包括算法。算法一直是属于计算机科学领域的。数据结构算法能力是程序员的核心能力之一,而且永不过时。
当程序员做开发工作,有些方向不太需要数学,有些方向需要特定类型的数学(比如游戏开发、图形学会用到大量数值工具等);解决特定问题需要学习特定类型的数学;专门做特定领域的计算机科学研究需要用到大量特定领域的数学;既然如此,那就在碰到相应问题的需求去学习对应的知识就好了,没有必要非要计较到底哪个重要(前提是你应当知道你这个方向需要什么样的知识),也没有必要仅仅是为了提高“数学基础”而盲目不加选择的去学习所有种类的数学。