机器学习笔记(一):python 模块 numpy
程序员文章站
2023-12-27 18:15:33
...
今天开始系统的学习机器学习了, 写下这个笔记,作为自我监督,也希望能帮到同在学习的人。
要学机器学习,少不了数学和计算,先从学习和使用python 开始吧。
python关系数学计算的numpy就是我首先学习的,之前接触过matlab,所以会觉得numpy非常的相似。
1。numpy读取txt文件 genfromtxt(’ 文件地址 ’ , delimiter=’分隔符 ’ , dtype=数据类型)
第一个参数可以是相对地址,或者绝对地址。 分隔符一般就是‘,‘ 或者‘ ‘ 具体根据文件中的存储规则来,第三个参数指的是文件中存储的数据读取到python后的数据类型。
程序:
文件中的内容
hello I'm chenxiaoze
where are you
代码:
import numpy as np
A = np.genfromtxt('/Users/Chenxz/Desktop/2.txt',delimiter=' ',dtype='str')
print(A)
得到的是一个数组:
[['hello' "I'm" 'chenxiaoze']
['where' 'are' 'you']]
这个方法在对大量规则存储的文件有奇效,目前接触到的读取文件的方法只有这一种,以后接触到了会陆续补充。
2。矩阵
矩阵可以说是线性代数中巨大的一块了,也是机器学习中异常丰富的存在。
构造一个矩阵:(矩阵的成员需要时同一类型)
import numpy
A = numpy.array([1,2,3]) #一维矩阵(向量)
B = numpy.array([[1,2,3],[4,5,6],[7,8,9]]) #二维矩阵
构造一些特殊的矩阵:
import numpy as np
#全0矩阵
A = np.zeros((1,3)) #[[ 0. 0. 0.]] 全0矩阵
print('A中元素的类型是:',A.dtype,A.dtype.name) #float64默认类型
#全1矩阵
B = np.ones(3) #[ 1. 1. 1.] 全1矩阵 一个参数默认1行
B = np.ones((2,2)) #[[ 1. 1.]
# [ 1. 1.]]
#随机矩阵
C = np.random.random((2,2)) #随机矩阵 随机构造0-1内的2行2列矩阵
D = np.arange(10) #产生0-9整数[0 1 2 3 4 5 6 7 8 9]
import math
E = np.linspace(0,2*math.pi,10) #在0-2pi之间平均找10个数 不包括2pi 即>=0 <2pi
print(E)
矩阵取值
A[0]
B[2] #表示整个第3行 7.8.9
B[1,2] #第二行第3个 6
print(B[[1,1],[2,2]]) #输出 B[1,2] 和 B[1,2]
#下面是用true取值
Arr = numpy.array([1,2,3,2,2])
A = Arr == 2 # 得到: [False True False True True]
print(A)
print(Arr[[False,True,False,True,True]]) # 竟然也可以这样取值
print(Arr[A]) #所以这样也行
print(Arr[Arr]) #[2 3 2 3 3] 厉害了吧
矩阵的一些属性值
print(B.mean(),B.max(),B.min()) # 矩阵中 平均值 ,最大值 ,最小值
print(A.ndim) #查看维数 1
print(B.ndim) #2
print('B的行数烈数: ',B.shape) #求矩阵的行数列数,返回的是tuple类型 B: (3, 3)
print('B中总的元素个数:',B.size) #9
print('A中元素的类型是:',A.dtype) #int64
矩阵运算:
import numpy as np
A = np.array([[1,1],[2,2]])
B = np.array([[3,3],[4,4]])
print(A.ravel()) #[1 1 2 2]二维=>一维 把矩阵=>向量
print(A*B) #同位置的元素相乘 [[3 3],[8 8]]
print('方法1:',A.dot(B),'方法2:',np.dot(A,B)) #矩阵的乘法 , 左行右列,两种方法都行 [[ 7 7],[14 14]]
print(np.exp(A)) #对A中每个元素x都 e^x 然后返回值
print(np.sqrt(A)) #对A中每个元素x都 开方
矩阵拆分
#矩阵拼接 (水平拼接 ,垂直拼接)
'''
A= 1 1 B = 3 3
2 2 4 4
'''
C = np.hstack((A,B)) #[[1, 1, 3, 3],
# [2, 2, 4, 4]])
D = np.vstack((A,B)) # [[1, 1],
# [2, 2],
# [3, 3],
# [4, 4]]
#矩阵拆分 (水平拆分 ,垂直拆分)
np.hsplit(C,2) #把C在水平方向拆成2份 hsplit(C,3)报错,因为C的行数不是3的倍数
'''
[array([[1, 1],
[2, 2]]), array([[3, 3],
[4, 4]])]
'''
np.vsplit(C,2) # [array([[1, 1, 3, 3]]), array([[2, 2, 4, 4]])]
np.hsplit(C,(1,2)) #水平方向上(第一列,第二列后面切一刀)
'''
[array([[1],
[2]]), array([[1],
[2]]), array([[3, 3],
[4, 4]])]
'''
矩阵复制
#矩阵复制
#1. A就是B ,B就是A,相当于别名 (诸葛亮和孔明)
A= np.array([[1,1],[2,2]])
B = A;
A[1,1] = 100
#A变 B也会变
print(B) #[[ 1 1]
# [ 2 100]]
print(A is B,id(A),id(B)) #True 4621128128 4621128128 两者完全相同
#2. A,B 不同,但是指向的地方一样 (诸葛亮和关羽,都是为了刘家天下)
A= np.array([[1,1],[2,2]])
B = A.view()
A[1,1] = 100
#A变 B也会变 刘备死了,诸葛亮和关羽虽然不是一个人但是都不开心
print(B) #[[ 1 1]
# [ 2 100]]
print(A is B,id(A),id(B)) # False 4620750160 4621128128
#3 A,B完全不同
A= np.array([[1,1],[2,2]])
B = A.copy()
A[1,1] = 100
#A变 B不变
print(B) #[[ 1 1]
# [ 2 2]]
print(A is B,id(A),id(B)) # False 4621128128 4621147072
矩阵的一些操作:
A.T #转置A
#矩阵元素类型转换 可以连续转换
A.astype(int).astype(float) #bool = > int => float
import numpy as np
A = numpy.array([5,1,2,3]) #一维矩阵(向量)
B = numpy.array([[4,5,6],[1,2,3],[7,8,9]]) #二维矩阵
B.sum() # 全部求和
B.sum(0) # [12, 15, 18] 每一列求和
B.sum(1) # array([15, 6, 24]) 每一行求和
A.reshape(1,4) #array([[5, 1, 2, 3]]) 重新设置行列,但是size不能改变,即总元素不变
B.argmax() #和下面的一样
np.argmax(B) # 8 找到最大那个值的下标,因为二维返回的也是一个数字,所以不方便
B = numpy.array([[4,15,6],[1,2,13],[7,8,9]])
# [ 4, 15, 6],
# [ 1, 2, 13],
# [ 7, 8, 9]
B.argmax(0) # [2, 0, 1] 每一列的最大值的坐标 (2,0) (0,1) (1,2)
print(B[B.argmax(0),np.arange(0,B.shape[1])]) #[ 7 15 13]
np.argmax(B,1) # [1, 2, 2】 每一行的最大值 (0,1) (1,2) (2,2)
print(B[np.arange(0,B.shape[1]),B.argmax(1)]) #[15 13 9]
矩阵扩展
矩阵排序:
import numpy as np
B = numpy.array([[4,5,6],[1,2,3],[7,8,9]]) #二维矩阵
#每一列排序后的下标
C = numpy.argsort(B,0) #[1, 1, 1],
#[0, 0, 0],
#[2, 2, 2] 对应的是数字的下标
#每一行排序后的下标
D = numpy.argsort(B,1) #[0, 1, 2],
#[0, 1, 2],
#[0, 1, 2]]