最近打算自学机器学习的算法原理以及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)