欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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

最编程 2024-05-03 20:54:36
...


我们都知道,要想学好数据分析甚至是数据挖掘,线性代数基础是必不可少的。当然了,并不需要多么搞什么的线性代数知识,弄懂向量、矩阵、线性空间应该就够了。这里简单介绍它们在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.53.04.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))
[41018]

当然了,除法运算就要限定分母不为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([[12,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.]]
)

上一篇: PHP 高级编程模式框架与测试(中文高清 PDF 版)

下一篇: JAVA 基础 (38) 理解 JAVA 的四大特性(封装、继承、多态、抽象)