最近打算补一下python中numpy和pandas的学习,用于处理数据,也边在看吴恩达老师的机器学习视频,然后边进行复盘,做一些习题实现所学到的算法。稍微开始学了pr,卡点剪辑原来是如此,真的以前看着确实很炫酷,真的其实不难,所以要坚持学下去呀。
下面是这两天的笔记(昨天稍微偷懒了一下子):
特征放缩:让梯度下降快点
均值标准化
学习率太小:收敛速度慢
学习率过大:也可能收敛慢,代价函数可能不会每次迭代都下降
特征和多项式回归
正规方程:一次性求得最优值,特征数量小于1w时会选择该算法,其他会偏向梯度下降
正规方程在矩阵不可逆的情况,原因:1.包含了多余的特征,两个特征线性相关;2.有很多特征(正则化),方程多变量少
分类
激活函数sigmoid
决策边界:假设函数的一个属性,取决于模型本身,给定参数就可以确定
数据分析:采用适当的统计分析方法对大量数据进行分析提取有用信息加以详细研究和概括总结的过程。
1.numpy:基础数值算法
2.scipy:科学计算
3.matplotlib:数据可视化
4.pandas:序列高级函数
1.numpy的核心:多维数组
2.ndarray数组(类型)
用np.ndarray类的对象表示n维数组
3.内存中的ndarray:1.元数据;2.实际数据。
4.numpy数组是同质数组,即数据类型必须相同
numpy数组下标从0开始
5.创建:np.array([])
np.arange(起始值(0),终止值,步长(1))
np.zeros(数组元素个数,dtype='类型')
np.ones(数组元素个数,dtype='类型')
6.ndarray对象属性的基本操作
数组的维度:np.ndarray.shape 数组名.shape
元素的类型:np.ndarray.dtype 转换元素类型:数组名.astype(要转化成的类型) 类型:数组名.dtype
数组元素的个数:np.ndarray.size 数组名.size 和len的区别:返回的是什么?len返回最外层行号
数组元素索引(下标,从0开始):数组对象[下标]
7.ndarray对象户型操作详情
numpy内部基本数据类型:bool_,int,unit(无符号整数型),float,complex64/128(复数型),str(字串型,32位unicode编码)
自定义复合类型:封装成元组放进列表之中
简写方式:bool(?) int8/16(i8/16) unit8(u8) complex64/128(c8/c16) str(U<字符数>) datetime64(M8[Y] M8[M])
字节序前缀,用于多字节整数和字符串:</> [=]分别表示小端/大端/硬件字节序
8.ndarray数组对象的维度操作
视图变维(数据共享):reshape()与ravel(),b改了a也会改变
复制变维(数据独立):flatten(),高维撑平,b与原始数据不会同时改变
上面两个必须使用一个新的变量进行接收!!!
直接进行改变,不需要返回值
就地变维:shape(),reszie()
9.ndarray数组切片操作
步长+:默认从首到尾
步长*-:默认从尾到首
数组对象[起始对象:终止位置:步长,....] 默认步长为1
10.ndarray数组的掩码操作,bool类型放入数组中,为true值
11.多维数组的组合与拆分
垂直v方向操作:组合(vstack) 拆分(vsplit(,n)) 拆成几个数组 传进去一个元组
水平h方向操作:组合(hstack) 拆分(hsplit) 传进去一个元组
深度方向操作(3维,盖上):组合(dstack) 拆分(dsplit)
# 扩展:通过axis指定组合的方向,0垂直,1水平,2深度
np.concatenat((a,b),axis=0) 组合!!!
通过给出的数组与要拆分的份数
np.aplit(c,2,axis=0) 拆分!!!
长度不等的数组组合(填充数组使其长度与a相同):
b = np.pad(要填充的数组,pad_width=(0,1),mode ='constant',constant_values=-1) 头部补0个,尾部补1个
简单的一维数组组合方案:
把两个数组摞在一起成两行:np.row_stack(()) 元组!!!
把两个数组组合在一起成两列:np.column_stack(()) 元组!!!
ndarray类其他属性:
shape(维度) dtype(元素类型) size(元素数量) ndim(维数) len(shape)
itemsize(元素字节数) nbutes(总字节数)=size*itemsize real(复数实部) imag(复数虚部)
T--数组的转置视图 flat-扁平迭代器
import numpy as np
ary = np.array([1,2,3,4,5,6])
print(ary,type(ary)) # <class 'numpy.ndarray'>
print(ary.shape) # 维度,元组形式
ary.shape = (2,3) # 维度改成2行3列,原始元素要够用
print(ary,ary.shape)
ary.shape = (6,)
# 数组的运算
print(ary)
print(ary * 3) # 每一个元素都乘以3,[ 3 6 9 12 15 18]
print(ary > 3) # 返回每一个元素判断后的bool值
print(ary + ary) # 对应元素之间的自加
ary1 = np.array([1,4,5,6,7,8])
print(ary1)
ary2 = np.arange(1,10,2) # 起始值,终止值,步长
print(ary2)
ary3 = np.zeros(10,dtype='int32')
print(ary3,type(ary3)) # [0 0 0 0 0 0 0 0 0 0] <class 'numpy.ndarray'>
ary4 = np.ones((2,3),dtype='int32')
print(ary4,type(ary4),ary4.shape)
# 5个1/5
print(np.ones(5) / 5) # [0.2 0.2 0.2 0.2 0.2]
# 扩展 np.zeros_like()维度像,元素都为0 np.ones_like()维度像,元素都为1
print(np.zeros_like(ary3))
print(np.ones_like(ary4))
# 属性测试
# 数组的维度基础操作
a = np.arange(1,9)
print(a,a.shape)
a.shape = (2,4)
print(a,a.shape)
# 元素的类型
# 转换元素类型:数组名.astype
print(a.dtype)
# 错误的修改方法 a.dtpe = 'float32'
b = a.astype(float) # a没变
print(b,b.dtype)
# 数组元素的个数,和len的区别
print(a,a.size)
print(b,b.size)
print(len(b)) # 返回最外层行号 2
# 数组元素索引 index操作
print(a[1])
print(b[1][1])
c = np.arange(1,19)
c.shape = (3,2,3) # 三维
print(c)
print(c[0])
print(c[1][1][1])
for i in range(c.shape[0]): # 拿到行号,索引迭代
for j in range(c.shape[1]):
for k in range(c.shape[2]):
print(c[i,j,k]) # 遍历每一个数
# 数据类型
data = [('zs',[80,65,45],15),
('ls',[45,78,99],16),
('ww',[78,55,88],14)]
# 第一种:设置dtype的方式,Unicode数字出现2次
a = np.array(data,dtype='U2,3int32,int32') # 类型定死
print(a)
print(a[1][1])
# 第二种:设置字段名,别名
a = np.array(data,dtype=[('name','str',2),('scores','int32',3),('age','int32',1)])
print(a)
print(a[2]['age']) # 标签寻址
# 第三种:names,formats,复合类型数据
aa = np.array(data,dtype={'names':['name','scores','age'],'formats':['U2','3int32','int32']})
print(aa)
print(aa[1]['name'])
# 测试数组中存储日期数据类型
dates = ['2011-02-25','2011','2011-02','2014-05-05','2022-01-02 20:10:00']
dates = np.array(dates)
# 类型转换
dates = dates.astype('M8[D]') # 转换成为年月日
dates = dates.astype('M8[s]') # 秒
print(dates,dates.dtype)
print(dates[2] - dates[1])
# 维度处理
a = np.arange(1,10)
print(a,a.shape)
# 视图变维
b = a.reshape(3,3) # 需要用一个变量进行接收
print(a,'--a')
a[0] = 999 # b也会改变
print(b,'--b',b.shape)
print(b.ravel()) # 撑平,变成了一维
# 复制变维,b数据改变c也不会改变
c = b .flatten() # 要有返回值接收
print(c,'--c')
b[0][0] = 78
print(c,'--c')
# 就地变维,直接进行改变,不用变量值接收
c.shape = (3,3)
print(c,'--c')
c.resize((9,))
print(c,'--c')
# 切片
# 一维
a = np.arange(1,10)
print(a)
print(a[:3])
print(a[::-1]) # 逆置
print(a[::]) # 相当于复制一个
print(a[:]) # 相当于复制一个
# 二维
a.resize(3,3)
print(a)
print(a[:2,:2]) # 二维数组,前面行,后面列
print(a[1:2,:])
# 基于bool数组的掩码
a = np.arange(1,10)
mask = [True,False,True,False,True,False,True,False,True]
print(a[mask]) # [1 3 5 7 9]
# 输出3的倍数
b = np.arange(100)
print(b[b % 3 == 0]) # 子集
# 基于索引的掩码
names = np.array(['Apple','huawei','xiaomo','oppo','vivo'])
rank = [1,0,3,4,2] # 排名
print(names[rank])
# 数组的组合与拆分
a = np.arange(1,7).reshape(2,3)
b = np.arange(7,13).reshape(2,3)
print(a,'--a')
print(b,'--b')
# 水平,记得传进去的是个元组类型!!!
c = np.hstack((a,b))
print(c,'--c')
a,b = np.hsplit(c,2)
print(a,'--a')
print(b,'--b')
# 垂直
d = np.vstack((a,b))
print(d,'--d')
a,b = np.vsplit(d,2)
print(a,'--a')
print(b,'--b')
# 深度
e = np.dstack((a,b))
print(e,'--e')
a,b = np.dsplit(e,2)
print(a,'--a')
print(b,'--b')
# 综合方法:
a = np.arange(1,7).reshape(2,3)
b = np.arange(7,13).reshape(2,3)
print(a,'--a')
print(b,'--b')
c = np.concatenate((a,b),axis = 0)
print(c,'--c')
a,b = np.split(c,2,axis=0)
print(a,'--a')
print(b,'--b')
# 一维数组的组合方案
a = np.arange(1,9)
b = np.arange(9,17)
print(a,'--a')
print(b,'--b')
print(np.row_stack((a,b))) # 两行
print(np.column_stack((a,b))) # 两列
# 属性测试
a = np.array([[1+1j,2+4j,3+7j],
[4+2j,5+5j,6+8j],
[7+3j,8+6j,9+9j]])
print(a.shape)
print(a.dtype)
print(a.itemsize)
print(a.size)
print(a.nbytes)
print(a.real)
print(a.imag)
print(a.T)
print([i for i in a.flat]) # 扁平化
matplotlib
import matplotlib.pyplot as mp
基本绘图(在二维平面坐标系中绘制连续的线)
图形对象(图形窗口)
1.绘图核心API
xarray:水平坐标序列
yarray:垂直坐标序列
mp.plot(xaary,yarray)
mp.show() # 显示
绘制水平线和垂直线:
mp.vlines(vval,ymin,ymax) # 垂直线
mp.hlines(vval,xmin,xmax) # 水平线
2.线型、坐标范围、刻度
颜色:color=' ' 颜色单词/英文首字母/#数字/(1,1,1)
透明度:alpha=
线型:linestyle=' '
线宽:linewidth=
坐标轴范围:xlim,ylim
x_limit _min:x轴的最小值 x_limit _max:x轴的最大值
y_limit _min:y轴的最小值 y_limit _max:y轴的最大值
设置坐标轴刻度:
x_val_list:x轴刻度值序列 x_text_listx轴刻度标签文本序列
mp.xticks(x_val_list,x_text_list) x轴
mp.yticks(,) y轴
特殊语法:latex排版语法字符串
r'$\pi$':pai
r'$-\frac{\pi}{2}$:2/pai
设置坐标轴:left/right/bottom/top
ax = mp.gca()
axis = ax.spines['坐标轴名'] # 获取其中某个坐标轴
#设置坐标轴的位置,参数type:一般是数值,移动坐标轴的参照类型,val:参照值
axis.set_position((type,val)) ('data',val) 移到哪个位置
#设置坐标轴的颜色 color:<str>
axis.set_color(color)
import matplotlib.pyplot as mp
import numpy as np
'''
# 基本绘图
a = np.array([1,2,3,4,5,6])
b = np.array([12,54,7,45,78,65])
mp.plot(a,b)
# 绘制水平线
mp.hlines([10,20,30],1,6) # 可以多条线
mp.vlines(2,10,40)
mp.show()
'''
# 线性拆分1000个点
x = np.linspace(-np.pi,np.pi,1000)
# print(x,x.shape)
y = np.sin(x) # 正弦函数
z = np.cos(x)/2 # 余弦函数
# 设置坐标轴的范围
# mp.xlim(0,np.pi)
# mp.ylim(0,1.2)
# 修改x轴的刻度文本
vals = [-np.pi,-np.pi / 2,0,np.pi / 2,np.pi]
texts = [r'$-\pi$',r'$-\frac{\pi}{2}$','0', r'$\frac{\pi}{2}$',r'$\pi$']
mp.xticks(vals,texts)
# 设置坐标轴
ax = mp.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
mp.yticks([-1.0,-0.5,0.5,1.0])
mp.plot(x,y,linestyle='--',linewidth=2,color='blue',alpha=0.8)
mp.plot(x,z,linestyle='-.',linewidth=2,color='yellow',alpha=0.5)
mp.show()