笔记:机器学习入门专栏笔记对应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()

#结果就很容易区分了

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: