机器学习的向量

向量(Vector)在机器学习中扮演着非常重要的角色。

向量的基础概念

认识标量

单纯的一个数字,只有大小没有方向,可以用实数表达,在数学领域称标量(Scalar)。

认识向量

向量是一个同时具有大小与方向的对象。

向量表示法

以箭头表示 :向量可以使用含箭头的线条表示,线条长度代表向量大小,箭头表示向量方向。

大小与方向均相同的向量,不过位置不同,在数学领域不同位置没有关系,这是相同的向量,又称等向量(Identical Vector)。

文字表示:在数学领域有时候可以用英文字母上方加上向右箭头代表向量,例如:向量\underset{a}{\rightarrow}

含起点与终点:有时候也可以用起点与终点的英文字母代表向量,英文字母上方须加上向右箭头:\underset{AB}{\rightarrow}

位置向量:坐标原点(0,0)的向量我们称之为位置向量。

\underset{AB}{\rightarrow}=(1,2)        或        \underset{AB}{\rightarrow}=(1 2)        或        \underset{AB}{\rightarrow}=\binom{1}{2}

机器学习常见的向量表示法:

机器学习常常需要处理n维空间的数学,使用含起点与终点的英文字母代表向量太复杂,为了简化常常只用一个英文字母表示向量,不过字母会用粗体和蓝色显示。

向量的分量:在二维空间的坐标轴概念中,x和y坐标就是此向量的分量。

n维空间向量:

机器学习的n维空间向量表示法如下:

{\color{Blue} a}=(a_1\: a_2\: ...\, a_n)

{\color{Blue} b}=(b_1\; b_2\; ...\; b_n)

{\color{Blue} c}=(c_1\; c_2\; ...\; c_n)

零向量:向量的每一个元素皆是0,称零向量(),可以用下列方式表示:

0=(0\, 0\, ... \, 0)或是\underset{0}{\rightarrow}

计算向量分量

计算\underset{AB}{\rightarrow}的分量,假设点A坐标是(x1,y1),点B坐标是(x2,y2),可以使用下列方法:

(x2y2)-(x1y1)

运算方式如下:

(4 4)-(3 2)=(1 2)

Python操作:

>>> import numpy as np
>>> a=np.array([3,2])
>>> b=np.array([4,4])
>>> b-a
array([1, 2])
>>>

相对位置的向量

A=(1 3)

B=(2 1)

C=(4 4)

对于A点而言,从A到B的向量是(2 1)-(1 3)=(1-2);

对于A点而言,从A到C的向量是(4 4)-(1 3)=(3-1)。

对于B点而言,从B到C的向量是(4 4)-(2 1)=(2 3)。

不同路径的向量运算

\underset{AB}{\rightarrow}+\underset{BC}{\rightarrow}=\underset{AC}{\rightarrow}

(1-2)+(2 3)=(3 1)

Python操作:

>>> import numpy as np
>>> ab=np.array([1,-2])
>>> bc=np.array([2,3])
>>> ab+bc
array([3, 1])
>>>

向量加法的规则

a=(a_1\;a_2\;\cdots \;a_n)

b=(b_1\;b_2\;\cdots \;b_n)

c=(c_1\;c_2\;\cdots \;c_n)

相同维度的向量可以相加

a+b=(a_1+b_1\;a_2+b_2 \; \cdots \;a_n+b_n)

不同维度的向量无法相加。

向量加法符合交换律概念

交换律(Commutative Property)是常用的数学名词,意义是改变顺序不改变结果。

a+b=b+a

向量加法符合结合律概念

结合律(Associative Laws)是常用的数学名词,意义是一个含有2个以上可以结合的数字的公式,数字的位置没有变,结果不会改变。

(a+b)+c=a+(b+c)

向量与零向量相加结果不会改变

有一个向量相加公式:a+z=a

则称z是零向量,此z又可以标记为0。 

向量与反向量相加结果是零向量

反向量(Opposite Vector)是指大小相等,但是方向相反的向量。假设下列公式成立,则a与b互为反向量。

a+b=0

有时候也可以用-a当作a的反向量。

>>> import numpy as np
>>> a=np.array([3,2])
>>> -a
array([-3, -2])
>>>

向量与标题相乘

一个向量a与标量c相乘,相当于将c乘以每个向量元素,如下所示:

c*a=(ca_1\;ca_2\;\cdots \;ca_n)

>>> import numpy as np
>>> a=np.array([3,2])
>>> 3*a
array([9, 6])
>>>

向量除以标量

将向量乘以标量的倒数。

向量相加再乘以标量或是标量相加再乘以向量

(x+y)*a=xa+ya

x(a+b)=xa+xb

标题与向量相乘也符合结合律

(xy)a=x(ya)

向量乘以1

可以得到原来的向量。

a*1=a

向量乘以-1

可以得到原来向量的反向量。

a*(-1)=-a

>>> import numpy as np
>>> a=np.array([3,2])
>>> a*-1
array([-3, -2])
>>>

向量乘以0

可以得到零向量。

a*0=0

向量相减

如果向量相减,相当于加上反向量。

a-b=a+(-b)

>>> import numpy as np
>>> a=np.array([3,2])
>>> b=np.array([2,1])
>>> a-b
array([1, 1])
>>>

向量的长度

家的坐标:(0,0)

公园的坐标:(1,3)

商店的坐标:(2,1)

公司的坐标:(4,4)

从家到公园的距离=\sqrt{1^2+3^2}=\sqrt{10}

从商店到公园的距离=\sqrt{(4-2)^2+(4-1)^2}=\sqrt{2^2+3^2}=\sqrt{13}

假设有一个向量a,此向量长度的表示法如:\mid a\mid 或是\parallel a \parallel

使用numpy的linalg模块的norm()方法处理。

求家到公园的距离的实例:

>>> import numpy as np
>>> park=np.array([1,3])
>>> norm_park=np.linalg.norm(park)
>>> norm_park
3.1622776601683795
>>>

求商店到公司的距离的实例:

>>> import numpy as np
>>> store=np.array([2,1])
>>> office=np.array([4,4])
>>> store_office=office-store
>>> norm_store_office=np.linalg.norm(store_office)
>>> norm_store_office
3.605551275463989
>>>

向量方程式

所谓向量方程式是使用向量表示图形的一个方程式。

直线方程式

两个点可以构成一条线,对于向量而言,构成一条线需要向量方向与一个点。

A点和B点的坐标分别是(-1,2)和(1,4)。

\underset{AB}{\rightarrow}=k=\begin{pmatrix} 1-(-1)\\ 4-2 \end{pmatrix}=\begin{pmatrix} 2\\ 2 \end{pmatrix}

\underset{a}{\rightarrow}=\begin{pmatrix} -1\\ 2 \end{pmatrix}

b=a+pk        #p是常数

\begin{pmatrix} x\\ y \end{pmatrix}=\begin{pmatrix} -1\\ 2 \end{pmatrix}+p\begin{pmatrix} 2\\ 2 \end{pmatrix}

x=-1+2p

y=2+2p

x-y=-3

y=x+3

斜率是1,y截距是3。

Python实践连接两点的方程式

计算a和b的值。

from sympy import Symbol, solve

a = Symbol('a')
b = Symbol('b')
eq1 = -a + b -2
eq2 = a + b - 4
ans = solve((eq1, eq2))
print('a = {}'.format(ans[a]))
print('b = {}'.format(ans[b]))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
a = 1
b = 3

[Done] exited with code=0 in 3.895 seconds

使用向量建立回归直线的理由

省略

向量内积

协同工作的概念

省略

计算B所帮的忙

省略

向量内积的定义

向量内积的英文是inner product,数学表示方法:a\cdot b

念作a dot b,向量内积的计算结果是标量。

几何角度向量内积的定义是两个向量的大小与它们夹角的余弦值的乘积,概念:\left \| a \right \|\left \| b \right \| cos\theta

向量a的长度:\left \| a \right \|

向量b投影到向量a的长度:\left \| b \right \| cos\theta

向量内积的公式:a\cdot b=\left \| a \right \|\left \| b \right \| cos\theta

交换律:a\cdot b=b\cdot a

分配律:a\cdot (b+c)=a\cdot b+a\cdot c

内积的代码定义是,对两个等长的向量,每组对应的元素求积,然后再求和。

a=(a_1\;a_2\;\cdots \;a_n)

b=(b_1\;b_2\;\cdots \;b_n)

向量乘积定义:a\cdot b=\sum_{i=1}^{n}a_ib_i=a_1b_1+a_2b_2+\cdots +a_nb_n

计算向量内积使用numpy模块的dot()方法:

>>> import numpy as np
>>> a=np.array([1,3])
>>> b=np.array([4,2])
>>> np.dot(a,b)
10
>>>

两条直接的夹角

cos\theta =\frac{a_1b_1+a_2b_2}{\left \| a \right \|\left \| b \right \|}

假设坐标平面有A、B、C、D四个点

A的坐标(1,1)

B的坐标(5,5)

C的坐标(1,5)

D的坐标(5,1)

计算和这两个向量的夹角。

import numpy as np
import math

a = np.array([1, 1])
b = np.array([5, 5])
c = np.array([1, 5])
d = np.array([5, 1])

ab = b - a                              # 向量ab
cd = d - c                              # 向量bc

norm_a = np.linalg.norm(ab)             # 计算向量大小
norm_b = np.linalg.norm(cd)             # 计算向量大小
                    
dot_ab = np.dot(ab, cd)                 # 计算向量内积

cos_angle = dot_ab / (norm_a * norm_b)  # 计算cos值
rad = math.acos(cos_angle)              # acos转成弧度
deg = math.degrees(rad)                 # 转成角度
print('角度是 = {}'.format(deg))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
角度是 = 90.0

[Done] exited with code=0 in 4.425 seconds

向量内积的性质

向量内积是正值,两向量的夹角小于90度。

向量内积是0,两向量的夹角等于90度。

向量内积是负值,两向量的夹角大于90度。

夹角常应用在3D游戏设计中,假设玩家观测点在超过90度的角度才看得到角色动画表情,就需要绘制;当角度小于90度时,玩家看不到角色动画表情,表示可以不用绘制。

余弦相似度

余弦相似度(cosine similarity)=cos\theta =\frac{a_1b_1+a_2b_2}{\left \| a \right \|\left \| b \right \|}

判断下列句子的相似度。

(1)机器与机械。

(2)学习机器码。

(3)机器人学习。

下表是每个单字出现的次数。

编号句子
1机器与机械21110000
2学习机器码11001110
3机器人学习11001101

可以建立下列向量:

a=(2 1 1 1 0 0 0 0)

b=(1 1 0 0 1 1 1 0)

c=(1 1 0 0 1 1 0 1)

代码如下:

import numpy as np

def cosine_similarity(va, vb):
    norm_a = np.linalg.norm(va)                 # 计算向量大小
    norm_b = np.linalg.norm(vb)                 # 计算向量大小
    dot_ab = np.dot(va, vb)                     # 计算向量内积
    return (dot_ab / (norm_a * norm_b))         # 回传相似度

a = np.array([2, 1, 1, 1, 0, 0, 0, 0])
b = np.array([1, 1, 0, 0, 1, 1, 1, 0])
c = np.array([1, 1, 0, 0, 1, 1, 0, 1])
print('a 和 b 相似度 = {0:5.3f}'.format(cosine_similarity(a, b)))
print('a 和 c 相似度 = {0:5.3f}'.format(cosine_similarity(a, c)))
print('b 和 c 相似度 = {0:5.3f}'.format(cosine_similarity(b, c)))

运行结果如下:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
a 和 b 相似度 = 0.507
a 和 c 相似度 = 0.507
b 和 c 相似度 = 0.800

[Done] exited with code=0 in 3.242 seconds

皮尔逊相关系数

在统计学中,皮尔逊相关系数(Pearson Correlation Coefficient)常用在度量两个变量x和y之间的相关程度,此系数值范围是-1~1,基本概念如下:

(1)系数值为1:代表所有数据皆是在一条直线上,同时y值随x值增加而增加。系数值越接近1,代表x和y变量的正相关程度越高。

(2)系数值为-1:代表所有数据皆是在一条直线上,同时y值随x值增加而减少。系数值越接近-1,代表x和y变量的负相关程度越高。

(3)系数值为0:代表两个变量间没有线性关系,也就是y值的变化与x值完全不相关。系数越接近0,代表x与y变量的完全不相关程度越高。

下列是相关性系数常见的定义。

相关性
0.6~1.0-1.0~(-0.6)
0.3~0.6-0.6~(-0.3)
0.1~0.3-0.3~(-0.1)
-0.09-0.09~(-0.0)

皮尔逊相关系数定义

皮尔逊相关系数是两个变量之间共变异数和标准偏差的商,一般常用r当作皮尔逊系数的变量,公式如下:

r=\frac{\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^{n}((x_i-\bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i-\bar{y})^2}}

网络购物问卷调查案例解说

一家网络购物公司在2019年12月做了一个问卷调查,询问消费者对于整个购物的满意度,同时在2021年1月再针对前一年调查对象,询问了在2020年再度购买商品的次数。所获得的数据如下:

问卷编号满意度再度购买次数
1812
2915
31016
4718
586
6911
753
8712
9911
10816

下列是计算上述数据的表格。

(1)计算满意度-平均满意度(经计算平均满意度是0):(x_i-\bar{x})

(2)计算再度购买次数-平均再度购买次数(经计算平均再度购买次数是12):(y_i-\bar{y})

问卷编号满意度-平均满意度再度购买次数-平均再度购买次数
100
213
324
4-16
50-6
61-1
7-3-9
8-10
91-1
1004

将数据代入皮尔逊系数公司,可以得到下列数据表格。

问卷编号(x_i-\bar{x})(y_i-\bar{y})(x_i-\bar{x})^2(y_i-\bar{y})^2
1000
2319
38416
4-6136
50036
6-111
727981
8010
9-111
100016
总计3018196

将上述值代入皮尔逊系数公司,可以得到下列结果。

r=\frac{30}{\sqrt{18}\sqrt{196}}=0.505​​​​​​​

从上述执行结果可以看到,消费满意度与再度购买是正相关,不过相关强度是中等。

用Python程序验证上述结果。

import numpy as np

x = np.array([8, 9, 10, 7, 8, 9, 5, 7, 9, 8])
y = np.array([12, 15, 16, 18, 6, 11, 3, 12, 11, 16])             
x_mean = np.mean(x)
y_mean = np.mean(y)

xi_x = [v - x_mean  for v in x]
yi_y = [v - y_mean  for v in y]

data1 = [0]*10
data2 = [0]*10
data3 = [0]*10
for i in range(len(x)):
    data1[i] = xi_x[i] * yi_y[i]
    data2[i] = xi_x[i]**2
    data3[i] = yi_y[i]**2

v1 = np.sum(data1)
v2 = np.sum(data2)
v3 = np.sum(data3)
r = v1 / ((v2**0.5)*(v3**0.5))
print('coefficient = {}'.format(r))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
coefficient = 0.5050762722761054

[Done] exited with code=0 in 2.014 seconds

绘制消费满意度与再度购买次数的散点图。

import numpy as np
import matplotlib.pyplot as plt

x = np.array([8, 9, 10, 7, 8, 9, 5, 7, 9, 8])
y = np.array([12, 15, 16, 18, 6, 11, 3, 12, 11, 16])             
x_mean = np.mean(x)
y_mean = np.mean(y)
xpt1 = np.linspace(0, 12, 12)      
ypt1 = [y_mean for xp in xpt1]          # 平均购买次数
ypt2 = np.linspace(0, 20, 20)
xpt2 = [x_mean for yp in ypt2]          # 平均满意度

plt.scatter(x, y)                       # 满意度 vs 购买次数
plt.plot(xpt1, ypt1, 'g')               # 平均购买次数
plt.plot(xpt2, ypt2, 'g')               # 平均满意度
plt.grid()
plt.show()

运行结果:

上述只有9个点,是因为数据(9,11)重叠。如果是高度相关,应该是满意度高再度购买次数也高,满意度低再度购买次数也低,这表示数据应该集中在绿色交叉线的右上方和左下方。

向量内积计算系数

没看懂,省略

向量外积

向量外积又称叉积(Cross Product)或是矢量积(Vector Product),这是三维空间中对于两个向量的二维运算。所以要执行向量a和b的外积运算,首先要假设a与b是在同一平面上。两个向量a与b执行外积,所以使用的符号是X,表示 方法如:a\times b

向量外积常应用在数学、物理与机器学习。

(1)向量外积结果不是标量而是向量。

(2)对于a与b,向量外积是垂直于2个向量的向量,又称法线向量。

(3)上述法线向量的大小是向量a与b所组成的平行四边形的面积。

法线向量

a与b的向量外积是垂直于2个向量的向量。

假设a与b向量内容如下:

a=\begin{pmatrix} a_1\\ a_2\\ a_3 \end{pmatrix}                b=\begin{pmatrix} b_1\\ b_2\\ b_3 \end{pmatrix}

向量a与b的外积计算公式如下:

a\times b=a=\begin{pmatrix} a_2b_3-a_3b_2\\ a_3b_1-a_1b_3\\ a_1b_2-a_2b_1 \end{pmatrix}

numpy模块有cross()方法可以执行此向量外积计算。

>>> import numpy as np
>>> a=np.array([0,1,2])
>>> b=np.array([2,0,2])
>>> np.cross(a,b)
array([ 2,  4, -2])
>>>

计算面积

法线向量大小等于两个向量组成的平行四边形的面积。

\left \| a\times b \right \| =\left \| a \right \|\left \| b \right \|sin\theta

计算两个向量组成的三角形面积,步骤如下:

(1)计算两个向量长度;

(2)计算两个向量的夹角;

(3)套用上述公式,计算平行四边形面积;

(4)将步骤(3)结果除以2,即可得到两个向量成成的三角形面积。

import numpy as np
import math

a = np.array([4, 2])
b = np.array([1, 3])

norm_a = np.linalg.norm(a)              # 计算向量大小
norm_b = np.linalg.norm(b)              # 计算向量大小
                    
dot_ab = np.dot(a, b)                   # 计算向量内积

cos_angle = dot_ab / (norm_a * norm_b)  # 计算cos值
rad = math.acos(cos_angle)              # acos转成弧度

area = norm_a * norm_b * math.sin(rad) / 2
print('area = {0:5.2f}'.format(area))

运行结果如下:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
area =  5.00

[Done] exited with code=0 in 2.393 seconds

使用向量外积概念计算两向量所组成的三角形的面积。

import numpy as np

a = np.array([4, 2])
b = np.array([1, 3])

ab_cross = np.cross(a, b)               # 计算向量外积
area = np.linalg.norm(ab_cross) / 2     # 向量长度除以2
                    
print('area = {0:5.2f}'.format(area))

运行结果如下:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
area =  5.00

[Done] exited with code=0 in 2.142 seconds

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值