程序员必备数学知识(一)
一、数制转换
image.png
image.png
image.png
没有特别说明,数制就是十进制
image.png
image.png
image.png
image.png
image.png
证明:
image.png
image.png
image.png
image.png
image.png
image.png
image.png
注意:这种方法只适用于二进制和八进制之间的转换,以及二进制和十六进制之间的转换,不适用于八进制和十六进制之间的转换,八进制和十六进制之间的转换可以用二进制或十进制为中间跳板来转换。
image.png
image.png
应用
image.png
image.png
或者用位运算:
image.png
总结
image.png
image.png
image.png
二、逻辑与沟通
image.png
image.png
image.png
image.png
举例
转换成代码,当age=10时就会出错
image.png
image.png
image.png
与或非在编程语言中的表示
image.png
image.png
image.png
image.png
异或
image.png
image.png
能用else-if的时候就不要用多个if
image.png
三个反例
由小推导出大
image.png
image.png
image.png
image.png
image.png
三、规划投入、转化和产出
问题引入
image.png
麻将局的输赢情况
我们发现,在四人麻将系统中,虽然每个人都有赢有亏,但是整个系统的盈亏始终是0,并不会多出或者减少价值。
image.png
这与物理学中的能量守恒定律很像。
image.png
如果这么看,那么你这个系统里就增加了100元,其他人组成的系统降低了100元。
系统、兑换和指标
image.png
image.png
image.png
增加系统某项指标最有效的方法,还是通过外部力量。
计算外部力量作用在系统中的效率
image.png
image.png
大漂亮的转化效率
大聪明的转化效率
给出建议
image.png
image.png
如果大聪明将阈值从0.8调整成0.9,转化率会怎样变化呢?
通过埋点统计获取到的数据
大聪明的转化率是否提升,要再结合实际业务进行评判。
image.png
大漂亮修复bug可以视为系统外部力量对系统的注入。
通过埋点获取到的数据
大漂亮的优化,对于转化率的提升是有价值的。
image.png
image.png
大迷糊的模型优化也是有效地提升了转化率。
image.png
四、经典公式在生活中的运用
image.png
image.png
image.png
假设大漂亮是某宝增长部门的工程师
image.png
注意:满减红包的ROI通常不会小于1,因为用户不花够钱,是无法获得红包的。
image.png
这种工作的主要目标就是如何提高ROI。
image.png
与身边人距离的体现
image.png
image.png
大漂亮是职场小白
通过上表看出,通过培训提高自己的技能,比加班更能提高自己的收入。
大聪明是创业公司老板
通过上表看出,通过培训提高自己的技能空间已经很小了,加班更能提高自己的收入。
课后作业
image.png
大聪明为什么用70÷5呢?
image.png
这里
image.png
证明
image.png
使用洛必达法则
分子的一阶导数
分母的一阶导数
image.png
这种问题统称为翻倍问题:
image.png
image.png
五、求极值:如何找到复杂业务的最优解
image.png
image.png
image.png
image.png
image.png
image.png
用python代码定义一个函数来完成
image.png
太难了无法人工计算
image.png
让X0逼近Xmax求出Xmax
梯度下降的定义
若函数是个一元函数,那么梯度下降法和求导就非常相似了,区别只在于前者计算的是矢量,后者计算的是标量。
image.png
image.png
image.png
image.png
python代码实现
xtemp的值约等于2.42,也就是说最大补贴额在2.42元时,利润最大。
通过计算机画出曲线来验证
image.png
image.png
这种双峰函数就不是凸函数
像这种函数求极值的解决办法就是随机抽取多个点,分别使用梯度下降法计算极值,然后再去判断。
小结
六、向量及其导数
上一节的这个问题其实用for循环暴力求解也是一种方法
但是现实生活中求解的影响因素通常不止一个。
image.png
image.png
维度的概念
向量的概念
矩阵的概念
向量就是行数为1或者列数为1的特殊矩阵。
矩阵的转置
向量的点乘
矩阵的乘积
矩阵的乘法
矩阵的乘法对矩阵的行和列有严格的要求
注意:矩阵的乘法不遵循交换律。
同型矩阵可以计算哈达玛积
单位矩阵,用斜体大写字母I表示
矩阵和逆矩阵相乘得出单位矩阵
image.png
向量求导的定义
例题
image.png
那么
image.png
image.png
因此y关于向量的求导的结果,就是向量w。
image.png
image.png
作业
python代码:
import random
import numpy as np
#先通过随机数生成每个同学的三门课成绩
A= []
for i in range(50):
Atemp1 = []
for j in range(3):
Atemp1.append(random.randint(0,100))
A.append(Atemp1)
print(A)
输出结果:
image.png
通过公式计算每名同学的方差:
for i in range(50):
aver = np.mean(A[I])
var = 0
for j in range(3):
a = (A[i][j] - aver)**2
var+=a
var = var/3
print("第"+str(i+1)+"名同学的成绩方差为"+str(var)+"\n")
输出结果:
image.png
再用numpy自带的方法验算一遍:
for i in range(50):
print("第"+str(i+1)+"名同学的成绩方差为"+str(np.var(A[i]))+"\n")
输出结果:
验算结果完全一样
七、线性回归
image.png
假设大漂亮是增长营销策略工程师
大漂亮收集的折扣率和购买率的原始数据
我们能在这些数据中发现什么趋势和关系吗?
image.png
image.png
线性回归的目标是,把样本点尽可能多地串在一起,也就是求解出最合适的k和b。
image.png
image.png
回到大漂亮遇到的问题
解决她的问题的本质,就是求出k和b的值。
image.png
image.png
我们将
同时,y = kx+b这种一元一次方程也可以写成向量乘积的形式:
image.png
注意:这里的7个样本从原来单一样本的
image.png
image.png
使用代码来计算极值:
image.png
image.png
程序运行输出结果
使用excel散点拟合功能验算结果
image.png
假设购买率除了和折扣率x1,还和好评率x2有关:
image.png
xxxx.jpg
代码只要按照上面的方式调整一下就可以了。
输出结果为:
image.png
image.png
image.png
①
使用excel画出的回归线:
image.png
使用PHP的GD库画出的回归线:
image.png
因为PHP的GD库好画,所以就使用php实现了上面python的代码,全部代码如下:
<?php
require_once 'vendor/autoload.php';
use NumPHP\Core\NumArray;
use Phpml\Math\Matrix;
//输入数据
$x = new NumArray(
[
[ 1,1],
[ 2,1],
[ 3,1],
[ 4,1],
[ 5,1],
[ 6,1],
[ 7,1],
[ 8,1],
[ 9,1],
[ 10,1],
[ 11,1],
[ 12,1],
[ 13,1],
[ 14,1],
[ 15,1],
[ 16,1],
[ 17,1],
[ 18,1],
[ 19,1],
[ 20,1],
[ 21,1],
[ 22,1],
[ 23,1],
[ 24,1],
]);
$yhat = new NumArray(
[
[ 45],
[ 48],
[ 52],
[ 55],
[ 60],
[ 65],
[ 70],
[ 76],
[ 83],
[ 90],
[ 98],
[ 104],
[ 110],
[ 120],
[ 130],
[ 140],
[ 150],
[ 160],
[ 168],
[ 175],
[ 179],
[ 179],
[ 180],
[ 180],
]);
//定义求解k和b的函数
function main($x,$yhat){
$xtx = $x->getTranspose()->dot($x);
//求$xtx的逆矩阵
$xtxArray = $xtx->getData();
$matrix = new Matrix($xtxArray);
$inverse = $matrix->inverse();
$inverseArray = $inverse->toArray();
$xtx_1 = new NumArray($inverseArray);
$w = $xtx_1->dot($x->getTranspose())->dot($yhat);
return ['k1'=>$w->getData()[0][0], 'b'=>$w->getData()[1][0]];
}
//创建画布,画坐标系、和数据点
$img=imageCreateTrueColor(500, 400);
$white=imagecolorallocate($img, 255, 255, 255);
$black=imagecolorallocate($img, 5, 5, 5);
$blue=imagecolorallocate($img, 0, 0, 64);
imageFill($img, 0, 0, $white);
imageLine($img, 30, 380, 30, 20, $black);
imageLine($img, 10, 360, 480, 360, $black);
for($i = 0; $i <= 5; $i++){
imageString($img, 12, 8, 360-$i*50, strval($i*50), $black);
imageLine($img, 30, 360-$i*50, 480, 360-$i*50, $black);
}
for($i = 1; $i <24; $i++){
imageString($img, 12, 30+$i*20, 380, strval($i), $black);
imageLine($img, 30+$i*20, 360, 30+$i*20, 20, $black);
}
$xArray = $x->getData();
$yhatArray = $yhat->getData();
for($i=0;$i<24;$i++){
imageSetPixel($img, 30+20*$xArray[$i][0], 360-$yhatArray[$i][0], $blue);
imageSetPixel($img, 30+20*$xArray[$i][0]+1, 360-$yhatArray[$i][0], $blue);
imageSetPixel($img, 30+20*$xArray[$i][0]-1, 360-$yhatArray[$i][0], $blue);
imageSetPixel($img, 30+20*$xArray[$i][0], 360-$yhatArray[$i][0]+1, $blue);
imageSetPixel($img, 30+20*$xArray[$i][0], 360-$yhatArray[$i][0]-1, $blue);
imageSetPixel($img, 30+20*$xArray[$i][0]+1, 360-$yhatArray[$i][0]-1, $blue);
imageSetPixel($img, 30+20*$xArray[$i][0]-1, 360-$yhatArray[$i][0]+1, $blue);
imageSetPixel($img, 30+20*$xArray[$i][0]+1, 360-$yhatArray[$i][0]+1, $blue);
imageSetPixel($img, 30+20*$xArray[$i][0]-1, 360-$yhatArray[$i][0]-1, $blue);
}
//计算k和b
$result = main($x,$yhat);
//根据k和b画出拟合线段
imageLine($img, 30+1*20, intval(360-$result['k1']-$result['b']), 30+24*20, intval(360-24*$result['k1']-$result['b']), $blue);
//输出图片,销毁资源
header("Content-type:image/png");
imagePng($img);
imageDestroy($img);
②用梯度下降法求出k和b:
我们还是假设购买率为y,折扣率为x,那么y'就是真实值,用方差公式就是:
损失函数:
为了方便计算,我们将上述数学表达式求导后的常量2和m约分掉,所以将其变换为损失函数J,即:
把y = kx +b带入到式子中就是:
样本 xi 和y'i 都是已知的,所以就变成了求两个未知数k和b。
先计算g(k, b)对k求导:
再计算g(k, b)对b求导:
image.png
通过之前梯度下降法的原理,我们得出表达式:
现在y'(也就是yhat)就是大漂亮统计的购买率,x就是大漂亮统计的折扣率,虽然y' = kx + b,但是这里的y'和x都是多个值,所以我们要用向量表示:
于是得出:
根据刚才推到出的梯度算法公式,带入矩阵,其形态改为:
其中α就是学习率。
然后我们来编写程序,为了展示动态效果,本次还是使用了PHP+gd库的方式来编写:
td.gif
八、加乘法则:计算复杂事件的概率
概率的计算
概率的定义
C7DDA878-86FC-4C08-AEE3-49F599ABAAB2.jpeg
实现这个实验的代码
注意:这段代码实际上是计算1/4个圆和正方形的随机点分布,因为random.random()函数只会随机生成0到1之内的数字。
程序的运行结果
实验的运行结果和数学推算的结果十分接近。
E37B3C76-A0EC-4803-907A-8964EFDD6EA8.jpeg
加法原理
乘法原理
计算思路
使用程序模拟统计法
random.randint()函数会随机生成整数。
运行结果与数学计算结果非常接近
加乘法则在独立事件时使用
条件概率的定义
举例
代码仿真
程序运行结果
实际案例
image.png
image.png
上线前后的统计对比
总结
问题思考
九、极大似然估计(MLE)
本届需要了解
FFD53124-E227-47EB-BAC1-52740E14132A.jpeg
举个例子,通常来说,华中科技大学的男生比例更高,北京外国语学院的女生比例更高。
在其他信息不知情的情况下我们更愿意相信B
“估计”用大白话来讲就是猜
MLE的全称
极大似然估计的方法路径
似然的数学表达
极大的数学表达我们之前讲过
估计的数学表达
实际解题思路
第一步:似然
两个院校的男女比例及毕业概率
第二部:极大
第三步:估计
我们对刚才例子进行拓展
单样本拓展为多样本
image.png
(上面这个P(D|θ)的计算式子不太懂,如果这样计算,P(D|θ)不就是d1、d2、d3……dn同时发生的概率了吗?有没有小伙伴可以解答一下)。
似然函数拓展到对数似然函数
知识梳理
下面我们通过一个是实际应用来加深理解:
电商的运营总结出了优质品、合格品、残次品出现的概率
第一步:似然
第二步:极大
这个函数我们使用求导法令导数等于0即可求出θ的值,如果包含复杂的多项式,例如指数函数、正弦函数等,就需要梯度下降法来求解极值了。
下面是使用梯度下降法计算的代码
image.png
接上图
程序执行结果为:
执行将结果和求导法结果一样
image.png
第三步:估计
image.png
课后作业
假设商品质量分布如上图所示,再帮大迷糊估计以下θ的值。
解答:
P(D|θ) = P(优质品|θ)·P(优质品|θ)·P(合格品|θ) = =
=
那么 ln P(D|θ) = =
对其求导得出:4/θ - 2/(1-θ)
用求导法得出西塔为4/6。
再用梯度下降法计算,代码为:
import math
def grad(x):
return (4-6*x)/(x*(1-x))
def main():
a=0.01
maxloop=1000
theta=0.1
for i in range(maxloop):
g=grad(theta)
theta = theta + a*g
print("This is No."+str(i)+" loop,theta="+str(theta))
print(theta)
if __name__ == "__main__":
main()
运行结果为:
image.png
七、信息熵,如何计算事情的不确定性
如何用量化指标衡量事情的不确定性
换句话说,事情的不确定性越大,则信息量越大
越是废话,信息量越好,越是描述人们想不明白的事情,信息量越大
熵的计算公式
例题
例题代码1
例题代码2
代码运行结果
另一道例题
这次我们直接使用代码来计算:
将代码最后一行的概率数值换一下然后运行即可
image.png
概率有条件概率,熵也有条件熵
条件熵的计算公式
条件熵的例题
image.png
信息的增益可以减小熵的值
一般来说,有新的信息输入,都会减小事件的不确定性,最不济也就是收到了无用信息后不确定性没有变,所以条件熵只会小于等于熵。
image.png
我们将上表巴西队获胜和不胜的概率整理一下输入到我们计算熵的代码中,计算这个事件的熵。
image.png
结果约为0.8113
可见我们计算出来的条件熵0.72比熵0.8113要低。这种由于信息的引入造成不确定性的下降被称为信息增益。
信息增益和信息增益率的数学定义
刚才这个例题的信息增益以及信息增益率
基尼系数(非国民基尼系数)
分别计算巴西队比赛和阿根廷队比赛的基尼系数
我们发现阿根廷队比赛的基尼系数更高,说明它的不确定性更大,这和使用熵来计算的结果定性是一致的。
熵和信息增益的用途
举例:
大漂亮将相对更多的资源投入到B事情上
小结:
image.png
本节课所学的四个概念
四个概念的定义式
思考题:
image.png