写在最前面:机器学习的本质是数学,是数学在数据上的应用,python的Numpy函数库对于线性代数的处理有着很好的效果
构建一个5x5的随机数组
a = random.rand(5,5)
print(type(a))
print(a)
<class 'numpy.ndarray'>
[[0.25523539 0.18672544 0.13211871 0.02976256 0.27596135]
[0.02602847 0.94473667 0.19747157 0.7082606 0.02579286]
[0.60821924 0.15340741 0.14053278 0.64514422 0.55603114]
[0.33629013 0.78294866 0.74654038 0.54908445 0.92103958]
[0.76463527 0.78219568 0.04659293 0.33617911 0.00824435]]
此时大家可以看到,我们创建了一个数组。
然后我们把数组转化为矩阵
randomMat = mat(a)
print(type(randomMat))
print(randomMat)
<class 'numpy.matrixlib.defmatrix.matrix'>
[[0.44161805 0.83401376 0.61029327 0.05150283 0.92170338]
[0.90328784 0.05417499 0.2890834 0.73348374 0.41682442]
[0.93416784 0.41967522 0.96965584 0.1187087 0.58684984]
[0.01172604 0.25642675 0.10434218 0.33808193 0.43006809]
[0.75970918 0.0382442 0.45915119 0.68941119 0.16452291]]
由于这是分步运行的,产生的数组是个随机数组,所以每次数据都会不一样
Numpy函数库存在两种不同的数据类型,矩阵matrix和数组array。那么matrix和array有什么区别呢?其实matrix是包含在array里的,简单来说,你要是不知道什么时候用哪个,一律用array就肯定没问题。
Numpy matrix必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D,2D,3D····ND)。 matrix是Array的一个小的分支,包含于Array。所以matrix 拥有array的所有特性。
在numpy中matrix的主要优势是:相对简单的乘法运算符号。例如,a和b是两个matrices,那么a*b,就是矩阵积。而不用np.dot()。
下面来看一个栗子:
x = np.mat([[3,5],[2,6]])
print(x)
y = np.mat([[1,7],[6,4]])
print(y)
print(type(x))
print(x*y)
[[3 5]
[2 6]]
[[1 7]
[6 4]]
<class 'numpy.matrixlib.defmatrix.matrix'>
[[33 41]
[38 38]]
这里我们直接定义了两个矩阵,此时可以看到,matrix可以直接使用*得到矩阵相乘的积。
我们再定义两个数组,如果直接相乘,结果并不是我们想要的
xx = np.array([[3,5],[2,6]])
print(xx)
yy = np.array([[1,7],[6,4]])
print(yy)
print(type(xx))
print(xx*yy)
print(np.dot(xx,yy))
[[3 5]
[2 6]]
[[1 7]
[6 4]]
<class 'numpy.ndarray'>
[[ 3 35]
[12 24]]
[[33 41]
[38 38]]
上图倒数第二个结果并不是两个数组相乘的正确结果,只是数组每个位置上数字的乘积,而正确输出数组乘积的应该是:
print(np.dot(xx,yy))
好,我们回到Numpy函数库的介绍
矩阵的逆:
randomMat = mat(random.rand(5,5))
print(type(randomMat))
print(randomMat,randomMat.I)
<class 'numpy.matrixlib.defmatrix.matrix'>
[[0.68775072 0.55116675 0.93077221 0.12091721 0.5814328 ]
[0.43057471 0.61668641 0.29150797 0.06954227 0.46725422]
[0.2599995 0.21906031 0.26223958 0.39303605 0.28256826]
[0.29460098 0.66910716 0.70821986 0.22080112 0.90003657]
[0.76028929 0.33743323 0.973075 0.93021911 0.72884654]] [[ -2.45164987 5.25417727 -11.0615229 -1.72802693 5.00977322]
[ 3.71563501 -3.39165379 14.96032473 -0.0394158 -6.54110922]
[ 3.78836154 -4.76392273 8.20658304 0.45518946 -3.71178508]
[ 0.69855233 -2.03752061 7.38608525 -0.13065884 -1.95321868]
[ -5.11216288 5.05011211 -15.77074349 1.37986308 6.62289943]]
存储结果:
xrandomMat = randomMat.I
矩阵乘矩阵的逆,得到的应该是一个5x5的单位矩阵
[[ 1.00000000e+00 2.87815981e-16 -1.74683844e-16 9.11509282e-17
5.05857032e-17]
[-4.82206268e-16 1.00000000e+00 -1.16372757e-16 2.96491689e-16
-6.02937360e-18]
[ 5.27045023e-17 -7.69342830e-17 1.00000000e+00 2.34971904e-16
6.95768890e-17]
[-5.92025864e-16 3.21822869e-16 -1.09667017e-16 1.00000000e+00
1.37530212e-16]
[-3.05819205e-16 1.29351787e-16 1.00859225e-16 3.60001040e-16
1.00000000e+00]]
但是我们发现除了对角线的5个数字,其余的元素并不完全是0,这是由于计算机处理的一点误差,我们用我们计算出来的单位矩阵减去创建的一个5x5的单位矩阵,得到误差矩阵
[[ 0.00000000e+00 -5.45624584e-17 -5.73678895e-17 -5.46094235e-17
2.68868638e-17]
[-1.00797709e-18 -1.11022302e-16 -9.62047088e-17 -4.14814528e-17
1.21962924e-17]
[ 2.73368064e-17 1.48584446e-16 -1.11022302e-16 -9.67898328e-17
4.10587699e-17]
[ 2.38316603e-17 -1.57699794e-16 -6.87584900e-17 2.22044605e-16
3.90459055e-17]
[ 6.75350523e-18 4.67157107e-17 8.11073271e-17 3.44711839e-17
0.00000000e+00]]
矩阵的转置:
randomMat = mat(random.rand(5,5))
xrandomMat = randomMat.T
print(randomMat,xrandomMat)
[[0.39412548 0.10714949 0.01291286 0.29695853 0.61813766]
[0.38583395 0.72695652 0.80252661 0.68591293 0.9086151 ]
[0.14943146 0.59734579 0.76504651 0.51369465 0.22559721]
[0.15521877 0.1703934 0.33845128 0.4338031 0.54092755]
[0.71906317 0.53943771 0.20445043 0.85749641 0.53176807]] [[0.39412548 0.38583395 0.14943146 0.15521877 0.71906317]
[0.10714949 0.72695652 0.59734579 0.1703934 0.53943771]
[0.01291286 0.80252661 0.76504651 0.33845128 0.20445043]
[0.29695853 0.68591293 0.51369465 0.4338031 0.85749641]
[0.61813766 0.9086151 0.22559721 0.54092755 0.53176807]]