数据分析中的线性代数运算

数据分析中的线性代数运算_第1张图片

我们都知道,要想学好数据分析甚至是数据挖掘,线性代数基础是必不可少的。当然了,并不需要多么搞什么的线性代数知识,弄懂向量、矩阵、线性空间应该就够了。这里简单介绍它们在Python中的朴素实现与借助第三方库实现。

向量的朴素表示与运算

向量作为一个能表征对象属性特征的集合,对于事物的描述是非常有用的。我们用列表表示向量,编写函数进行向量的加减乘除运算。

1、加/减法运算

对向量中对应元素做加减法运算,返回一个向量。

加法:

ef vec_add(v,w):
   return([v_i+w_i for v_i,w_i in zip(v,w)])
#用zip()函数使每次列表相应元素做运算
v = [1,2,3]
w = [4,5,6]
s = vec_add(v,w)
print(s)
[5, 7, 9]

减法:

def vec_red(v,w):
   return([v_i-w_i for v_i,w_i in zip(v,w)])
v = [1,2,3]
w = [4,5,6]
s = vec_red(v,w)
print(s)
[-3, -3, -3]

2、向量与一个标量相乘

向量与标量相乘,即向量每个元素分别与这个标量相乘,返回一个向量。

def ch(v,w):
   return([v*w_i for w_i in w])
v = 1.5
w = [1,2,3]
print(ch(v,w))
[1.5, 3.0, 4.5]

3、向量点乘/点除

向量点乘/除表示两个等长向量元素分别进行乘除运算,返回一个向量。

def d_ch(v,w):
   return([v_i*w_i for v_i,w_i in zip(v,w)])
v = [1,2,3]
w = [4,5,6]
print(d_ch(v,w))
[4, 10, 18]

当然了,除法运算就要限定分母不为0,运算前需要做一个判断。

4、向量内积

def dot(v,w):
   return(sum(v_i*w_i for v_i,w_i in zip(v,w)))
v = [1,2,3]
w = [4,5,6]
print(dot(v,w))
32

可以用这个函数计算向量的每个元素平方和:

print(dot(v,v))
14

当然了,向量的其它运算还有均值、最值、差分运算等,这里就不多赘述了。

矩阵

矩阵是一个二维的数据集合,是一个特殊的二维数组(哈哈!C语言老师最喜欢这样教学生们区分矩阵与数组了)。上面我们用列表表示向量,这里我们用每个元素为列表的列表表示矩阵。这样,如果A是一个矩阵,那么A[i][j]就表示矩阵第i行,j列的元素,实际上它是列表的第i个元素的第j个元素,就与一般的C语言表示一样了,有木有感觉这样表示很巧妙。

例如:

A = [[1,2,3],[4,5,6]]
print(A[0][0],A[1][2])
print('A的维数为:',len(A),'行',len(A[0]),'列')
1 6

A的维数为: 2 行 3 列

基于这样的表示,矩阵就有len(A)行和len(A[0])列,这就是矩阵的维数。

下面根据矩阵大小生成矩阵

#定义单位矩阵元素函数

def eye(i,j):
   return(1 if i==j else 0)
def make_eye(m,n,eye):
   return([[eye(i,j) for j in range(n)] for i in range(m)])
m  = 5
n = 5

#函数作为参数,定制矩阵元素
A = make_eye(m,n,eye)
for i in range(m):
   s = ''
   for j in range(n):
      s = s+' '+str(A[i][j])
   print(s)

 1 0 0 0 0
 0 1 0 0 0
 0 0 1 0 0
 0 0 0 1 0
 0 0 0 0 1

如果让m = 5,n = 4,那么A = make_eye(m,n,eye),得到:

 1 0 0 0

 0 1 0 0

 0 0 1 0

 0 0 0 1

 0 0 0 0

下面构建一个用户~项目矩阵,connection里面(i,j)存放用户i与用户j的关系,构建关系0~1矩阵:

 connection= [(0,1),(0,2),(1,2),(1,3),(2,3),(3,4),(4,5),(5,6),(5,7),(6,8),(7,8),(8,9)]

如下:

def zero(m):
   return([[0 for i in range(m)] for j in range(m)])
def make(A,fr):
   for i,j in fr:
      A[i][j] = 1
      A[j][i] = 1
   return(A)
connection = [(0,1),(0,2),(1,2),(1,3),(2,3),(3,4),(4,5),(5,6),(5,7),(6,8),(7,8),(8,9)]
m = 10
A = make(zero(m),connection)
for i in range(len(A)):
   s = ''
   for j in range(len(A[0])):
      s = s+' '+str(A[i][j])
   print(s)

构建的用户项目矩阵如下:

 0 1 1 0 0 0 0 0 0 0

 1 0 1 1 0 0 0 0 0 0

 1 1 0 1 0 0 0 0 0 0

 0 1 1 0 1 0 0 0 0 0

 0 0 0 1 0 1 0 0 0 0

 0 0 0 0 1 0 1 1 0 0

 0 0 0 0 0 1 0 0 1 0

 0 0 0 0 0 1 0 0 1 0

 0 0 0 0 0 0 1 1 0 1

 0 0 0 0 0 0 0 0 1 0

矩阵与矢量化运算——Numpy

下载安装包,命令行输入:

pip install numpy   即可

1、创建矩阵

>>> from numpy import *
>>> a = mat([[1,2,3],[4,5,6]])
>>> a
matrix([[1, 2,3],
[4,5,6])
>>> b = [1,2,3,4]
>>> b = mat(b)
>>> type(b)

注意:如果不是用的from numpy import *,而是import numpy as np

>>> b = [1,2,3,4]
>>> b = np.mat(b)
>>> type(b)

2、生成随机矩阵

>>> c = random.rand(3,5)
>>> c
array([[ 0.64604414, 0.45126794, 0.73007667, 0.15882401, 0.05607741],
[ 0.10858948, 0.82678284, 0.66219831, 0.8357802 , 0.67448717],
[ 0.74783459, 0.13746508, 0.99414465, 0.63919601, 0.80849361]])

生成3x4的全一矩阵

>>> d = ones([3,4])
>>> d
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])

3、矩阵的元素运算

>>> 5*d
array([[ 5., 5., 5., 5.],
[ 5., 5., 5., 5.],
[ 5., 5., 5., 5.]])

矩阵与矩阵的乘法还是要遵循线性代数的法则,第一个矩阵的列数与第二个矩阵的行数要相同,这里就不赘述了。

4、矩阵的切片

>>> c
array([[ 0.64604414, 0.45126794, 0.73007667, 0.15882401, 0.05607741],
[ 0.10858948, 0.82678284, 0.66219831, 0.8357802 , 0.67448717],
[ 0.74783459, 0.13746508, 0.99414465, 0.63919601, 0.80849361]])

取第一行

>>> c[0]

array([ 0.64604414, 0.45126794, 0.73007667, 0.15882401, 0.05607741])

取第一列,原理是先对矩阵进行转置,再取第一行,就是原矩阵的第一列了。

>>> c.T[0]

array([ 0.64604414, 0.10858948, 0.74783459])

5、矩阵的线性代数运算

>>> a

matrix([[1, 2],

[3, 4]])

(1)、行列式

>>> linalg.det(a)

-2.0000000000000004

(2)矩阵的逆

>>> linalg.inv(a)

matrix([[-2. , 1. ],

[ 1.5, -0.5]])

(3)、矩阵的转置

>>> a.T

matrix([[1, 3],

[2, 4]])

(4)、矩阵的秩

>>> linalg.matrix_rank(a)

2

(5)、可逆矩阵对应线性方程求解

>>> linalg.solve(a,B)

array([-1., 1.])

a对应稀疏矩阵,B对应右端项的非齐次方程的解,即为【-1,1】。

Numpy作为Python的快速数据处理包就简单介绍到这里,关于科学加、算还有另外一个强大的包Scipy,可以用来做数值计算与线性拟合方面应用,会在后面慢慢提到。

顺便推荐几个Python数据挖掘学习网站

刘江的博客:http://www.liujiangblog.com/

莫烦Python:https://morvanzhou.github.io/

催庆才的Python教程:https://cuiqingcai.com/

猜你可能喜欢

640?wx_fmt=jpeg

你可能感兴趣的:(数据分析中的线性代数运算)