美文网首页web服务器
数据科学(线性代数)

数据科学(线性代数)

作者: GHope | 来源:发表于2018-11-20 23:17 被阅读39次

向量

向量指可以加总(以生成新的向量),可以乘以标量(即数字),也可以生成新的向量的对象。

向量是有限维空间的点,比如身高、体重、年龄数据可以表示为三维向量(height, weight, age),考试成绩可以表示为四维向量 (exam1, exam2, exam3, exam4)

height_weight_age = [70, 170, 40] 
grades = [95, 80, 75, 62]

向量加法

两个向量v和w长度相同,和等于一个新向量,新向量第一个元素等于v[0] + w[0], 第二个元素等于v[1] + w[1] (向量长度不同,不能相加)
向量[1, 2] + [2, 1] = [1 + 2, 2 + 1] = [3, 3]

def vector_add(v, w):
    """adds two vectors componentwise"""
    return [v_i + w_i for v_i, w_i in zip(v,w)]

zip方法:返回一个将多个可迭代对象组合成一个元组序列的迭代器
向量减法

def vector_subtract(v, w):
    """subtracts two vectors componentwise"""
    return [v_i - w_i for v_i, w_i in zip(v,w)]

多向量累加

# 方法1 
def vector_sum(vectors):
    result = vectors[0]
    for vector in vectors[1:]:
        result = vector_add(result, vector)
    return result


# 方法2 
from functools import partial, reduce 
def vector_sum(vectors):
    return reduce(vector_add, vectors)

向量乘以标量 = 向量每个元素乘标量

def scalar_multiply(c, v):
    return [c * v_i for v_i in v]

一堆向量(长度相同)的均值

def vector_mean(vectors):
    n = len(vectors)
    return scalar_multiply(1/n, vector_sum(vectors))

向量点乘
两个向量点乘表示对应元素的分量乘积之和

def dot(v, w):
    """v_1 * w_1 + ... + v_n * w_n"""
    return sum(v_i * w_i for v_i, w_i in zip(v, w))

向量平方和

def sum_of_squares(v):
    return dot(v, v)

计算向量的大小(或长度)

import re, math, random # regexes, math functions, random numbers
def magnitude(v):
    return math.sqrt(sum_of_squares(v))

两个向量量的距离

def squared_distance(v, w):
    return sum_of_squares(vector_subtract(v, w))
def distance(v, w):
    return math.sqrt(squared_distance(v, w))

矩阵

如果A是一个矩阵,那么A[i][j]就表示第i行第j列的元素

# 2行3列 
A = [[1, 2, 3],
     [4, 5, 6]]

# 3行2列 
B = [[1, 2],
     [3, 4],
     [5, 6]]

矩阵A有len(A)行和len(A[0])列,叫形状(shape)

def shape(A):
    num_rows = len(A)
    num_cols = len(A[0]) if A else 0
    return num_rows, num_cols

如一个矩阵有n行k列,则表示为n x k 矩阵。可以把这个矩阵每一行都当作长度为k的向量,每一列当作长度为n的向量

def get_row(A, i):
    return A[i]
def get_column(A, j):
    return [A_i[j] for A_i in A]

根据形状和生成元素的函数创建矩阵

def make_matrix(num_rows, num_cols, entry_fn):
    return [[entry_fn(i, j) for j in range(num_cols)] for i in range(num_rows)]

生成对角线元素1,其他元素为0函数

def is_diagonal(i, j):
    return 1 if i == j else 0

矩阵用途:

  • 每个向量看作矩阵的一行,用矩阵表示一个包含多维向量的数据集
  • 表示二维关系,之前将关系表示为数据对(i, j),还可以通过矩阵来表示。 如果节点i和节点j有关系,用矩阵A[i][j]为1来表示
friendships = [[0, 1, 1, 0, 0, 0, 0, 0, 0, 0], # user 0
               [1, 0, 1, 1, 0, 0, 0, 0, 0, 0], # user 1
               [1, 1, 0, 1, 0, 0, 0, 0, 0, 0], # user 2
               [0, 1, 1, 0, 1, 0, 0, 0, 0, 0], # user 3
               [0, 0, 0, 1, 0, 1, 0, 0, 0, 0], # user 4
               [0, 0, 0, 0, 1, 0, 1, 1, 0, 0], # user 5
               [0, 0, 0, 0, 0, 1, 0, 0, 1, 0], # user 6
               [0, 0, 0, 0, 0, 1, 0, 0, 1, 0], # user 7
               [0, 0, 0, 0, 0, 0, 1, 1, 0, 1], # user 8
               [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]] # user 9

缺点:关系少的时候,内存利用效率低
优点:确认节点是否连接很快

friendships[0][2] == 1 
friendships[0][8] == 1

查找一个节点的所有连接

friends_of_five = [i for i, is_friend in enumerate(friendships[5]) if is_friend]

相关文章

网友评论

本文标题:数据科学(线性代数)

本文链接:https://www.haomeiwen.com/subject/mrgofqtx.html