机器学习之线性代数

说明

  题目是优达学城机器学习入门线性代数作业。下面是我的实现。

  工具为jupyter notebook,不用该工具请自行导入相关依赖。

  完整内容已上传到github:https://github.com/ZingP/machine-learning/tree/master/linear_algebra

  本篇代码中引用的helper.py可到上面github上下载。

1 矩阵运算

1.1 创建一个4*4的单位矩阵

在创建矩阵之前注意选择seed:

# 任意选一个你喜欢的整数,这能帮你得到稳定的结果
seed = 9999

创建矩阵:

# 这个项目设计来帮你熟悉 python list 和线性代数
# 你不能调用任何NumPy以及相关的科学计算库来完成作业

# 本项目要求矩阵统一使用二维列表表示,如下:
A = [[1,2,3],
     [2,3,3],
     [1,2,5]]

B = [[1,2,3,5],
     [2,3,3,5],
     [1,2,5,1]]

# 向量也用二维列表表示
C = [[1],
     [2],
     [3]]

#TODO 创建一个 4*4 单位矩阵
I = [[1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,1]]

1.2 返回矩阵的行数和列数

def shape(M):
    """返回矩阵的行列"""
    return len(M), len(M[0])

1.3 每个元素四舍五入到特定的小数位

# 每个元素四舍五入到特定小数数位
# 直接修改参数矩阵,无返回值
def matxRound(M, decPts=4):
    num_row,num_clo = shape(M)
    for r in range(num_row):
        for c in range(num_clo):
            M[r][c] = round(M[r][c], decPts)

  

1.4 计算矩阵的转置

def transpose(M):
    # *M 分解出列表中的子元素(子列表)
    # zip()将子列表中对应的元素打包成元组,返回包含一个个元组的列表
    # 然后用列表推导式...真优雅啊
    return [list(col) for col in zip(*M)]

1.5 计算矩阵乘法

# 计算矩阵乘法 AB,如果无法相乘则raise ValueError

def matxMultiply(A, B):
    """矩阵乘法"""
    row_a, clo_a = shape(A)
    row_b, clo_b = shape(B)
    if clo_a == row_b:
        res = []
        for i in range(row_a):
            res.append([])
            for j in range(clo_b):
                ele_sum = 0
                for s in range(clo_a):
                    matx_ele = A[i][s] * B[s][j]
                    if matx_ele is list:
                        print(matx_ele)
                    ele_sum += matx_ele
                res[i].append(ele_sum)
        return res
    else:
        raise ValueError

 以上是我的实现,再看下充分利用列表递推式的实现方式:

def matxMultiply(A,B):
    _, c = shape(A)
    r, _ = shape(B)
    if c != r :
        raise ValueError

    Bt = transpose(B)
    result = [[sum((a*b) for a,b in zip(row,col)) for col in Bt] for row in A]
    return result

  

2 高斯消元法

2.1 构建增广矩阵

代码:

# 构造增广矩阵,假设A,b行数相同
def augmentMatrix(A, b):
    if len(A) != len(b):
        raise ValueError
    else:
        augment_mat = []
        for r in range(shape(A)[0]):
            augment_mat.append([])
            for c in range(shape(A)[1]):
                augment_mat[r].append(A[r][c])
            augment_mat[r].append(b[r][0])
        return augment_mat

 再来看看利用列表递推式和zip函数的实现方式:

def augmentMatrix(A, b):
    return [ra + rb for ra,rb in zip(A,b)]

2.2 初等行变换

(1)交换两行

# r1 <---> r2
# 直接修改参数矩阵,无返回值
def swapRows(M, r1, r2):
    if (0 <= r1 < len(M)) and (0 <= r2 < len(M)):
        M[r1], M[r2] = M[r2], M[r1]
    else:
        raise IndexError(‘list index out of range‘)

(2)某行乘以标量

#  r1 <--- r1 * scale
# scale为0是非法输入,要求 raise ValueError
# 直接修改参数矩阵,无返回值
def scaleRow(M, r, scale):
    if not scale:
        raise ValueError(‘the parameter scale can not be zero‘)
    else:
        M[r] = [scale*i for i in M[r]]

(3)某行乘以标量加到另一行

# r1 <--- r1 + r2*scale
# 直接修改参数矩阵,无返回值
def addScaledRow(M, r1, r2, scale):
    if not scale:
        raise ValueError
    if (0 <= r1 < len(M)) and (0 <= r2 < len(M)):
        M[r1] = [M[r1][i] + scale * M[r2][i] for i in range(len(M[r2]))]
    else:
        raise IndexError(‘list index out of range‘)

2.3 高斯消元法求解:Ax = b

(1)算法

步骤1 检查A,b是否行数相同
步骤2 构造增广矩阵Ab
步骤3 逐列转换Ab为化简行阶梯形矩阵 中文维基链接
对于Ab的每一列(最后一列除外)
    当前列为列c
    寻找列c中 对角线以及对角线以下所有元素(行 c~N)的绝对值的最大值
    如果绝对值最大值为0
        那么A为奇异矩阵,返回None (你可以在选做问题2.4中证明为什么这里A一定是奇异矩阵)
    否则
        使用第一个行变换,将绝对值最大值所在行交换到对角线元素所在行(行c)
        使用第二个行变换,将列c的对角线元素缩放为1
        多次使用第三个行变换,将列c的其他元素消为0

步骤4 返回Ab的最后一列
注: 我们并没有按照常规方法先把矩阵转化为行阶梯形矩阵,再转换为化简行阶梯形矩阵,而是一步到位。如果你熟悉常规方法的话,可以思考一下两者的等价性。

(2)推演可逆矩阵

通过这段代码生成矩阵:

from helper import *

A = generateMatrix(4,seed,singular=False)
b = np.ones(shape=(4,1)) # it doesn‘t matter
Ab = augmentMatrix(A.tolist(),b.tolist()) # please make sure you already correct implement augmentMatrix
printInMatrixFormat(Ab,padding=4,truncating=0)

得到矩阵:

然后进行初等行变换:

(3)推演奇异矩阵

通过代码生成矩阵:

A = generateMatrix(4,seed,singular=True)
b = np.ones(shape=(4,1)) # it doesn‘t matter
Ab = augmentMatrix(A.tolist(),b.tolist()) # please make sure you already correct implement augmentMatrix
printInMatrixFormat(Ab,padding=4,truncating=0)

得到矩阵:

然后进行初等行变换:

(4)高斯消去法的代码实现

我的low代码:

def gj_Solve(A, b, decPts=4, epsilon=1.0e-16):
    if len(A) != len(b):
        raise ValueError
    elif len(A) != len(A[0]):
        raise ValueError
    else:
        Ab = augmentMatrix(A, b)
        matxRound(Ab, decPts)
        num_row, num_clo = shape(Ab)
        for c in range(num_clo-1):
            current_max = 0.0
            current_row = c
            for r in range(c, num_row):
                if abs(Ab[r][c]) > current_max:
                    current_max = abs(Ab[r][c])
                    current_row = r
            if abs(current_max) < epsilon:
                return None
            else:
                swapRows(Ab, c, current_row)
                while abs((Ab[c][c]-1.0)) >= epsilon:
                    scaleRow(Ab, c, 1.0 / Ab[c][c])
                for j in range(c):
                    while abs(Ab[j][c]) >= epsilon:
                        addScaledRow(Ab, j, c, -Ab[j][c])
                for j in range(c + 1, num_row):
                    while abs(Ab[j][c]) >= epsilon:
                        addScaledRow(Ab, j, c, -Ab[j][c])
        res = []
        for row in range(num_row):
            res.append([Ab[row][-1]])
        return res

再看看参考答案的实现:

# 实现 Gaussain Jordan 方法求解 Ax = b

""" Gaussian Jordan 方法求解 Ax = b.
    参数
        A: 方阵
        b: 列向量
        decPts: 四舍五入位数,默认为4
        epsilon: 判读是否为0的阈值,默认 1.0e-16

    返回列向量 x 使得 Ax = b
    返回None,如果 A,b 高度不同
    返回None,如果 A 为奇异矩阵
"""

def gj_Solve(A,b,decPts=4,epsilon=1.0e-16):
    if len(A) != len(b):
        raise ValueError

    Ab = augmentMatrix(A,b)

    for c in range(len(A[0])):
        AbT = transpose(Ab)
        col = AbT[c]
        maxValue = max(col[c:],key=abs)
        if abs(maxValue) < epsilon:
            return None

        maxIndex = col[c:].index(maxValue)+c

        swapRows(Ab,c,maxIndex)
        scaleRow(Ab,c,1.0/Ab[c][c])

        for i in range(len(A)):
            if Ab[i][c] != 0 and i != c:
                addScaledRow(Ab,i,c,-Ab[i][c])

    matxRound(Ab)

    return [[value] for value in transpose(Ab)[-1]

3 线性回归

3.1 随机生成样本点

用代码生成随机样本点:

from helper import *
from matplotlib import pyplot as plt
%matplotlib inline

X,Y = generatePoints(seed,num=100)

## 可视化
plt.xlim((-5,5))
plt.xlabel(‘x‘,fontsize=18)
plt.ylabel(‘y‘,fontsize=18)
plt.scatter(X,Y,c=‘b‘)
plt.show()

得到样本点如图:

不断修改下面的m和b的值,拟合直线。这里我选去m=3.0, b=7.0

# 请选择最适合的直线 y = mx + b
m = 3.0
b = 7.0

# 不要修改这里!
plt.xlim((-5,5))
x_vals = plt.axes().get_xlim()
y_vals = [m*x+b for x in x_vals]
plt.plot(x_vals, y_vals, ‘-‘, color=‘r‘)

plt.xlabel(‘x‘,fontsize=18)
plt.ylabel(‘y‘,fontsize=18)
plt.scatter(X,Y,c=‘b‘)

plt.show()

得到直线如下图:

3.2 计算平均平方误差 (MSE)

我们要编程计算所选直线的平均平方误差(MSE), 即数据集中每个点到直线的Y方向距离的平方的平均数,表达式如下:

代码实现:

# 实现以下函数并输出所选直线的MSE

def calculateMSE(X,Y,m,b):
    if len(X) == len(Y) and len(X) != 0:
        n = len(X)
        square_li = [(Y[i]-m*X[i]-b)**2 for i in range(n)]
        return sum(square_li) / float(n)
    else:
        raise ValueError

print(calculateMSE(X,Y,m,b))

 得到的MSE是:1.7601561403444317。

3.3 的到最优参数

可以证明(此处不予证明)求解方程可以找到最优参数。其中向量Y,矩阵X和向量h分别为:

下面看下代码实现:

#实现线性回归
‘‘‘
参数:X, Y
返回:m,b
‘‘‘
def linearRegression(X, Y):
    X = [[x, 1] for x in X]
    Y = [[y] for y in Y]
    XT = transpose(X)
    A = matxMultiply(XT, X)
    b = matxMultiply(XT, Y)
    ret = gj_Solve(A, b)
    return ret[0][0], ret[1][0]

m,b = linearRegression(X,Y)
print(m,b)# 3.2379 7.1899

最后我们看看得到的回归结果是什么,并用代码画出来:

x1,x2 = -5,5
y1,y2 = x1*m+b, x2*m+b

plt.xlim((-5,5))
plt.xlabel(‘x‘,fontsize=18)
plt.ylabel(‘y‘,fontsize=18)
plt.scatter(X,Y,c=‘b‘)
plt.plot((x1,x2),(y1,y2),‘r‘)
plt.text(1,2,‘y = {m}x + {b}‘.format(m=m,b=b))
plt.show()

最后得到的直线是:

求得的回归结果对当前数据集的MSE是:

print(calculateMSE(X,Y,m,b))# 1.3549197783872027

本篇就到这里,觉得还行记得点赞哦~~~ 

时间: 2024-08-30 09:53:12

机器学习之线性代数的相关文章

机器学习基础-线性代数学习笔记

这些知识其实中国的学生上过高中的就都应该学过,但是我不敢说所有的学生都忘了,但是还能有几个还记得呢,这是为什么呢,因为填鸭式的教育方式存在问题,所以说学过和没学过区别不大,我现在有点悔恨当初没有好好学,可能你也在悔恨,但是过去的都过去了,人生还要继续,只能恶补了..... 我看的是网易云上的视频教程,http://study.163.com/course/courseMain.htm?courseId=1050010,讲的不错,建议想学机器学习的同学看一下. 线性代数是什么? 代数->数的抽象表

机器学习五步走 |

机器学习五步走 | 我爱机器学习 机器学习五步走 2014年07月24日 经常会有人问“我该如何在机器学习方面更进一步,我不知道我接下来要学什么了.” 一般我都会给出继续钻研教科书的答案. 每当这时候我都会收到一种大惑不解的表情.但是进步确实就是持续的练习,保持较强的求知欲,并尽你可能的完成具有挑战性的工作.其实这些你都懂的,是吧! 但是为什么偏偏是教科书呢?因为他是为数不多的几种可以让你真真让你获取坚实知识的媒介.是的,你可以选择选一门课,注册MOOC,参加一些讨论班.但是只有教材才是会让你持

理解矩阵【转】 作者:孟岩

编者按:想要机器学习,线性代数必要先行,至于为何,不如看看这篇文章,肯定会有所启发的.同时本站推荐MIT Strang的线性代数公开课:http://v.163.com/special/opencourse/daishu.html,同时推荐他的两本教材(号称北美最流行):<Introduction to Linear Algebra>, 4th Edition by Gilbert Strang, <Linear Algebra and Its Applications>, 4th

《学习OpenCV3》PDF中英文+代码分析

计算机视觉2477203708是在图像处理的基础上发展起来的新兴学科.OpenCV是一个开源的计算机视觉库,是英特尔公司资助的两大图像处理利器 之一.它为图像处理.模式识别.三维重建.物体跟踪.机器学习和线性代数提供了各种各样的算法.<学习OpenCV 3>由OpenCV发 起人所写,站在一线开发人员的角度用通俗易懂的语言解释了OpenCV的缘起和计算机视觉基础结构,演示了如何用OpenCV和现有的自 由代码为各种各样的机器进行编程,这些都有助于迅速入门并渐入佳境,兴趣盎然地深入探索计算机视觉

深度学习(deeplearing)(5月完成)共三部分 第一部分应用数学与机器学习(5.1-5.10)线性代数

第一章:线性代数: 学习一个新东西,首先要从概念开始,抓住其核心点 机器学习相关问题中,数据集多是以矩阵的形式存在,而模型的参数如W也是以矩阵或向量的形式存在,所以一个模型从数学的角度来说,就是矩阵间的运算,而运算中矩阵相乘的运算又是最常用的运算.本章后半部分讲解了在机器学习中会用到的一些矩阵运算的概念,如范数.行列式. 特征分解.奇异值分解等 一.基本单元:标量.向量.矩阵.张量 二.

七月算法--12月机器学习在线班-第三次课笔记—矩阵和线性代数

七月算法--12月机器学习在线班-第三次课笔记—矩阵和线性代数 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

机器学习--线性代数基础

关闭 yunqishequ1的博客 目录视图 摘要视图 订阅 管理博客 写新文章 评论送书 | 7月书讯:众多畅销书升级!      CSDN日报20170727--<想提高团队技术,来试试这个套路!>      评论送书 | 机器学习.Java虚拟机.微信开发 机器学习--线性代数基础 2017-07-28 14:05 6人阅读 评论(0) 收藏 编辑 删除  分类: 机器x 目录(?)[+] 原文地址 数学是计算机技术的基础,线性代数是机器学习和深度学习的基础,了解数据知识最好的方法我觉得

机器学习教程 一-不懂这些线性代数知识 别说你是搞机器学习的

原文:http://www.shareditor.com/blogshow/?blogId=1 数学是计算机技术的基础,线性代数是机器学习和深度学习的基础,了解数据知识最好的方法我觉得是理解概念,数学不只是上学时用来考试的,也是工作中必不可少的基础知识,实际上有很多有趣的数学门类在学校里学不到,有很多拓展类的数据能让我们发散思维,但掌握最基本的数学知识是前提,本文就以线性代数的各种词条来做一下预热,不懂的记得百度一下. 请尊重原创,转载请注明来源网站www.shareditor.com以及原始链

机器学习(三)线性代数

Linear Algebra 线性代数基础 (以下概念 大学期间线性代数课没有讲清楚,在这里梳理一下 向量空间.线性空间vector space:n维向量的全体所构成的集合叫做n维向量空间. 基,基底 basis: 向量空间V中任一向量都能由向量组a1,a2-.an线性表示,那么该向量组为V的一个基.若向量组中每个向量都两两正交(orthogonal),则被称为正交基,若每个向量的模都为1,则成为标准正交基(Orthonormal basis) 同构:维数相等的线性空间同构. 同构即为两线性空间