机器学习算法原理与编程实践-郑捷著 读书笔记—第一章part1

最近打算自学机器学习的算法原理以及Python的编程实践,找到了郑捷所著的《机器学习算法原理与编程实践》一书,感觉原理推导与代码实践安排比较合理,因此决定跟着课本内容进行实践。

由于学习内容较多且知识点比较分散,现准备做一个读书笔记,主要记录下代码实践过程(课本代码采用Python2.7,但现在python3.0已成主流,故对部分代码稍作修改,以适应电脑安装的anaconda Python3.7环境)和算法关键实现原理,以备之后复习翻阅

对象、矩阵与矢量化编程的代码实例(numpy运算和Linalg线性代数库的熟悉)

——代码编辑平台:Anaconda3自带的Spyder编辑器

——Python版本:Python 3.7.7

# -*- coding: utf-8 -*-
"""
Created on Mon Aug  3 22:19:38 2020

@author: Wu Hongyi
"""

'''
第一章:机器学习的基础
'''

## part0
# python利用numpy库实现矢量化编程
import numpy as np

mylist = [1, 2, 3, 4, 5]
a = 10
mymatrix = np.mat(mylist)
print(a*mymatrix)

## part1
# 1.矩阵的初始化
import numpy as np   #导入numpy包
# 创建一个3*5的全0矩阵和全1矩阵
myZero = np.zeros([3, 5])     # 3*5的全0矩阵
print(myZero)
myOnes = np.ones([3, 5])       # 3*5的全1矩阵
print(myOnes)

# 2.生成随机矩阵
myRand = np.random.rand(3, 4)  # 3行4列的0~1之间的随机数矩阵
print(myRand)

# 3.单位阵
myEye = np.eye(3)     # 3*3的单位阵
print(myEye)

## part2:矩阵的元素运算
from numpy import *    # 导入numpy包
# 1.矩阵元素相加和相减(可运算前提:矩阵的行数和列数必须相同)’
myOnes1 = ones([3, 3])  # 3*3的全1矩阵
myEye1 = eye(3)         # 3*3的单位阵
print(myOnes1 + myEye1) # 矩阵相加
print(myOnes1 - myEye1) # 矩阵相减

# 2.矩阵数乘(一个数乘以一个矩阵)
myMatrix = mat([[1, 2, 3], [4, 5, 6], [7, 8, 9]])   # 定义3*3二维矩阵
a = 10
print( a*myMatrix)

# 3.矩阵所有元素求和
myMatrix = mat([[1, 2, 3], [4, 5, 6], [7, 8, 9]])   # 定义3*3二维矩阵
print(sum(myMatrix))     # 对3*3矩阵元素求和

# 4.矩阵各元素的积(点乘) A[i,j] .* B[i,j]
# 矩阵的点乘同维对应元素的相乘。当矩阵的维度不同时,会根据一定的广播规则将维数
# 扩充到一致的形式
matrix1 = mat([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix2 = 1.5 * ones([3, 3])
print(multiply(matrix1, matrix2))

# 5.矩阵各元素的n次幂
# n=2
mylist = mat([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(power(mylist, 2))

# 6.矩阵乘法:矩阵乘矩阵 A[i, j] * B[j, i]
matrix3 = mat([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix4 = mat([[1], [2], [3]])
print(matrix3 * matrix4)

# 7.矩阵的转置
matrix0 = mat([[1, 2], [3, 4]])
print(matrix0.T)       # 矩阵的转置(方法1)
print(matrix0)         # 注意,以上步骤并不改变原矩阵
print(matrix0.transpose())    # 矩阵的转置(方法2)
print(matrix0)
# 注意:以上2种方法都不改变原矩阵的值

# 矩阵的其他操作:行列数、切片、复制、比较
mymatrix = mat([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
[m, n] = shape(mymatrix)      # 获取矩阵的行列数
print("矩阵的行列数:{},{}".format(m, n))

myscl1 = mymatrix[0]       # 按行切片
print("按行切片:", end = ' ')
print(myscl1)

myscl2 = mymatrix.T[0]     # 按列切片
print("按列切片:", myscl2 )

mycopymat = mymatrix.copy()  # 矩阵的复制
print("复制矩阵:\n", mycopymat)

# 比较(各对应位置元素之间进行比较,返回True/False矩阵)
print("矩阵元素的比较:\n", mymatrix < mymatrix.T)


## part3:Linalg线性代数库
# 在矩阵基本运算的基础上,numpy的linalg库可以满足大多数的线性代数运算

# 矩阵的行列式
# n阶方阵的行列式运算
A = mat([[1, 2, 4, 5, 7], [9, 12, 11, 8, 2], [6, 4, 3, 2, 1], [9, 1, 3, 4, 5], [0, 2, 3, 4, 1]])
print("det(A):", linalg.det(A))    # 方阵的行列式

# 矩阵的逆
invA = linalg.inv(A)      # 矩阵的逆
print("invA:", invA)

# 矩阵的对称
AT = A.T     # 矩阵的对称
print(A * AT)

# 矩阵的秩
print(linalg.matrix_rank(A))   # 矩阵A的秩

# 可逆矩阵求解 A*x=b` -> x=?
b = mat([1, 0, 1, 0, 1])
S = linalg.solve(A, b.T)
print(S)

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页