笔记:机器学习入门专栏笔记对应jupyternotebook以及封装的各种算法个人笔记,如有错误,感谢指出!-机器学习文档类资源-CSDN文库
二,Jupyter Notebook,numpy, matplotlib的使用
下载anaconda,建立环境
一,jupyternotebook使用
在特定文件夹下打开Jupyter notebook:
定位到特定文件夹,在路径上输入cmd,打开指令窗口再输入jupyternotebook
使用jupyter notebook的快捷指令
Shift+enter运行并选中下一个cell
Markdown格式:Basic writing and formatting syntax - GitHub Docs
Jupyter notebook的一些魔法命令:
%run调用目录下的.py等文件,或者可以直接import模块
%timeit 测试代码性能
%time 循环时不想多次执行命令,使用这个,因为多次执行命令可能会有问题,比如每次执行差别都很大等。
二,numpy使用
import numpy as np #经常使用numpy可以方便些
np.__version__ #查看版本号
L = [i for i inrange(10)]
L[5] = "MachineLearning"
## [0, 1, 2, 3, 4, 'Machine Learning', 6, 7, 8, 9]
python的list可以不止一种数据类型,但这也造成python执行效率慢很多,因为每次执行前都要检查每一个元素的类型
import array
arr = array.array('i',[i for i in range(10)])
array提高了效率,但是list只能是一种数据类型,并且array没有将数据当作向量或者矩阵,不支持基本运算。
nparr= np.array([i for i in range(10)]) #numpy的array也只能存储一种类型
nparr.dtype #可以查看是哪种类型
numpy.zeros (numpy.ones同理):
numpy.full产生指定数值的矩阵:
np.full((3, 5), 666)
np.full(fill_value=666,shape=(3, 5))
arrange
range(X,X,X)#步长不能是浮点数
numpy.arrange(X,X,X)#和python不同的是,步长可以是浮点数
X =np.arange(15).reshape((3, 5))
linspace
np.linspace(0,20, 10) #截取十个点,包括0和20
randint 随机整数
np.random.randint(0,10) # [0, 10)之间的随机数
np.random.randint(0,10, size=10) #随机向量
np.random.randint(0,10, size=(3,5)) #随机矩阵
seed
#计算机的随机数是伪随机数,先定一个种子,这样生成的随机数就不变了
np.random.seed(666)
np.random.randint(0,10, size=(3,5))
random #随机浮点数
np.random.random() #默认范围0-1
np.random.random((3,5)) #0-1之间均匀分布的随机浮点数
normal #正态分布的随机数
np.random.normal() #默认均值为0,方差为1正态分布
np.random.normal(10,100) #均值为10,方差100
np.random.normal(0,1, (3, 5)) #生成(3,5)大小的随机数矩阵
x =np.random.normal(0, 1, 1000000) #取一百个标准正态分布的点
help:
help(np.random.normal)
numpy.array基本操作
x.ndim #查看数组的维数
x.shape #返回一个元组
x.size #返回元素的个数
x[0] #一维数组索引
X[0,0] #访问多维数组元素
x[1::2] #一维数组切片,最后一个数是步长
X[::-1,::-1] #多维数组切片,用逗号隔开维度 #实现矩阵反转
X[:2][:3] #结果不一样,在numpy中使用","做多维索引,相当于取了俩次切片
X[:, 0] #只取矩阵第一列
矩阵的子矩阵
#numpy采取引用子矩阵的方式提高程序的运行效率
subX =X[:2, :3] #切下子矩阵
subX[0,0] = 100 #改变子矩阵的一个元素,初始矩阵也会改变
#当改变了子矩阵的某一个元素,同时也改变了初始矩阵的元素
subX =X[:2, :3].copy() #创建一个与原矩阵无关的子矩阵
reshape
x.reshape(2, 5) #x开始是个十个元素的一维向量,reshape成2✖5的矩阵
#reshape方法没有改变x自身!
A =x.reshape(2, 5) #可以将reshape结果赋值给A
B =x.reshape(1, 10)
B.ndim=2
x.ndim=1
##B:array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) 和x不一样,B是二维,因为有俩个方括号
x.reshape(10,-1) #改变向量方向,-1的作用是不管每一行有几个元素,计算机自己算
矩阵的合并
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
np.concatenate([x, y])
##array([1, 2, 3, 3, 2, 1])
#可以理解为A是有俩个元素,每个元素又有三个元素的一维数组,合并就变成有四个元素,每个元素有三个元素的数组
np.concatenate([A,A], axis=1) #axis是轴,默认是0,就是沿着第一个维度,行维度拼接,结果同上;axis=1则表示在第二个维度上拼接,也就是在列这一维度上拼接
np.vstack([A, z])#垂直方向堆叠
np.hstack([A,B]) #水平方向堆叠
矩阵的分割
x = np.arange(10)
x1,x2, x3 = np.split(x, [3, 7]) #[]里的是分割点,在3和7之前分割
A =np.arange(16).reshape((4, 4))
A1, A2= np.split(A, [2]) #默认是基于行这个0维维度分割 这里[]指的是分成俩部分
A1, A2= np.split(A, [2], axis=1) #列上分割
upper, lower =np.vsplit(A, [2]) #垂直方向分割成俩部分
left, right =np.hsplit(A, [2])
有啥用?提取特征向量
data =np.arange(16).reshape((4, 4))
X, y = np.hsplit(data,[-1])
矩阵的运算
n = 10
L = [i for i inrange(n)]
2 * L *结果是俩个L重复排列
#使用python基础语法可以这样实现,但是运行速度非常非常慢,因为加入了for循环
import numpy as np
L = np.arange(n)
A =np.array(2*e for e in L) #使用生成表达式,运行速率更快
A = 2* L #并且支持这样的数学表达实现元素乘以2
university functionsof numpy(numpy的广播功能)
X = np.arange(1,16).reshape((3, 5))
X+1 #对应X所有元素全部加一
np.abs(X) #求绝对值
np.sin(X) #求正弦 同cos、tan、arctan
np.exp(X)
np.power(3,X) #取3的X次方
np.log(X) #ln函数
np.log2(X) #log以2为底的对数
同理,俩个形状相同的矩阵的加减乘除都是对应元素的运算
A.dot(B) #对应的线性代数里的矩阵乘法
A.T #求矩阵A的转置
向量和矩阵的加法或乘法,相当于把向量加到矩阵的每一行相应的向量做加法或乘法
np.tile(v,(2, 1)) #堆叠的方式,在行上堆叠俩次个,列上堆叠一个
使用dot()函数计算向量与矩阵相乘,numpy会自动判断向量是行向量还是列向量
矩阵的逆
np.linalg.inv(A) #linalg是线性代数模块 inv()求逆矩阵,矩阵必须是方阵
矩阵的伪逆
求不是方阵的矩阵的“逆矩阵”,求得的结果也满足矩阵相乘是单位矩阵
pinvX = np.linalg.pinv(X) #X是2✖8的矩阵,pinvX是8✖2的矩阵
numpy的聚合操作
#numpy中的sum函数比Python自带的sum函数运行的效率是快近一百倍的
import numpy as np
#向量的聚合运算
L =np.random.random(100)
np.sum(L)
np.min(L)
np.max(L)
big_array.min() #面向对象的调用方式
#矩阵的聚合运算
X =np.arange(16).reshape(4,-1)
big_array =np.random.rand(1000000)
np.sum(X) #所有元素的和
np.sum(X,axis=0) #矩阵行所有向量相加,即每一列的和 axis表示沿着某个轴运算
np.prod(X) #所有元素的乘积 product
np.mean(X) #求平均值
np.median(X) #求中位数
np.percentile(big_array,q=50) #统计学中的百分位概念 求这组数中50%的元素小于 等于函数生成的值
np.var(big_array) #求方差
np.std(big_array) #求标准差
Numpy的arg运算(索引)
import numpy as np
x = np.random.normal(0,1, 1000000)
np.argmin(x) #找到数组中最小值的索引值(最小值的位置)
x = np.arange(16)
np.random.shuffle(x) #对x进行乱序处理
np.sort(x) #返回一个排好序的向量,但没有改变x本身
x.sort() #使用面向对象的操作可以直接把x进行排序,改变了x本身
X =np.random.randint(10, size=(4,4))
np.sort(X,axis=0) #默认把每一列的元素进行了排序(沿着行的方向进行排序)
np.argsort(X) #对矩阵使用索引,返回的矩阵是从小到大数值的索引值
np.partition(x,3) #快速排序 第二个参数是标定点,把3前和3后的数进行排序
np.argpartition(x,3) #返回的还是索引值
numpy中的比较和FancyIndexing
#创建一个列表,之后再利用数组引用这个列表就可以得到对应的索引
import numpy as np
x = np.arange(16)
ind =[3, 5, 7] #创建列表
x[ind] #获得索引
ind =np.array([[0, 2], [1, 3]]) #索引还可以是多维数组
x[ind]
X = x.reshape(4, -1)
col =[True, False, True, True] #也可以用布尔数组进行提取
X[0,col] #输出的就是第0行上,对应true的元素
#输入x<=3等这样的比较运算符输出的是布尔数组或矩阵
np.count_nonzero(x <= 3) #数出来输出的有几个非零(false)
np.any(x== 0) #检查传入的数组中是否有任意的x==0的
np.all(x> 0) #所有元素都大于0才返回true
#对于二维矩阵同样适用
np.sum((x> 3) & (x < 10)) #类似位运算符 #输出的是x>0且x<10元素的个数
np.sum((x% 2 == 0) | (x > 10)) #或
np.sum(~(x== 0)) #非
数据处理中一般都会使用pandas对数据进行预处理,再将处理后的数据结果送给numpy,再把数据给机器学习
三,matplotlib使用
matplotlib基础:
importmatplotlib as mpl #一般用不到整个库
importmatplotlib.pyplot as plt #一般只用到一个子模块就可以满足大部分需求
import numpy as np
x =np.linspace(0, 10, 100) #(起始点,终止点,点个数)
y = np.sin(x)
plt.plot(x,y) #显示不出图像,只是执行命令
plt.show() #绘制一条曲线
#下面绘制俩条曲线sin和cos
siny =y.copy() #直接把上边的y复制
cosy = np.cos(x)
plt.plot(x, siny)
plt.plot(x, cosy)
plt.show() #渲染这俩条曲线
#plt.plot(x, cosy, color="red", linestyle="--") #改变线形和颜色
关于linestyle参数:https://matplotlib.org/devdocs/gallery/lines_bars_and_markers/line_styles_reference.html
关于color参数:https://matplotlib.org/2.0.2/api/colors_api.html
plt.xlim(-5, 15)
plt.ylim(0,1) #分别调节坐标轴的范围
plt.axis([-1,11, -2, 2]) #同时调节x轴,y轴的范围
plt.plot(x,siny, label="sin(x)") #绘制的同时注明曲线的名称
plt.plot(x, cosy,color="red", linestyle="--", label="cos(x)")
plt.xlabel("xaxis")
plt.ylabel("yvalue") #绘制横纵坐标的名称
plt.title("Welcometo matplotlib world!") #给图片起标题
plt.legend() #绘制图像,加上图注
绘制散点图:
plt.scatter(x, siny)
plt.scatter(x,cosy, color="red") #绘制散点图
plt.show()
x = np.random.normal(0,1, 10000)
y =np.random.normal(0, 1, 10000) #正态分布
plt.scatter(x,y, alpha=0.05) #alpha是调节不透明度 0完全透明
plt.show()
读取数据和简单的数据探索:
import numpy as np
import matplotlib asmpl
importmatplotlib.pyplot as plt
fromsklearn import datasets #使用其中的一个模块 一定要注意环境
iris =datasets.load_iris() #datasets里其实包含了许多的数据,其中包含鸢尾花数据
#datasets,load然后点击tab即可
iris.keys() #查看数据集中的特征特征名称
iris.data #查看数据集
iris.target #表示鸢尾花的种类
X =iris.data[:,:2] #绘制二维数据 只取前俩列
plt.scatter(X[:,0],X[:,1]) #分别取第一列和第二列为横纵数轴
plt.show()
y =iris.target #取鸢尾花种类的数组 是个长度为150的向量
plt.scatter(X[y==0,0],X[y==0,1], color="red", marker="o") #取y==0的鸢尾花
plt.scatter(X[y==1,0],X[y==1,1], color="blue", marker="+") #行和列不变
plt.scatter(X[y==2,0],X[y==2,1], color="green", marker="x")
plt.show() #最终标明三种鸢尾花
#这里只是选择了俩个维度绘制,结果有俩种鸢尾花混叠在一起不好区分
关于marker参数:http://matplotlib.org/1.4.2/api/markers_api.html
当我们选取另外俩中鸢尾花的特征进行绘制后结果会不一样,可能更容易区分
X =iris.data[:,2:] #取后俩列特征数据
plt.scatter(X[y==0,0],X[y==0,1], color="red", marker="o")
plt.scatter(X[y==1,0],X[y==1,1], color="blue", marker="+")
plt.scatter(X[y==2,0],X[y==2,1], color="green", marker="x")
plt.show()
#结果就很容易区分了