diff --git a/Python/matplotlab/pyplot_attr.md b/Python/matplotlab/pyplot_attr.md deleted file mode 100644 index 959cf746..00000000 --- a/Python/matplotlab/pyplot_attr.md +++ /dev/null @@ -1,279 +0,0 @@ -# 面向对象的绘图方式 - - -## 配置参数 - -* axex: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示 -* figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置 -* font: 字体集(font family)、字体大小和样式设置 -* grid: 设置网格颜色和线性 -* legend: 设置图例和其中的文本的显示 -* line: 设置线条(颜色、线型、宽度等)和标记 -* patch: 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。 -* savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色。 -* verbose: 设置matplotlib在执行期间信息输出,如silent、helpful、debug和debug-annoying。 -* xticks和yticks: 为x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。 - - -## 线条风格 - -线条风格linestyle或ls | 描述 -----|--- -‘-‘ |实线 -‘:’ |虚线 -‘–’ |破折线 -‘None’,’ ‘,’’ |什么都不画 -‘-.’ |点划线 - -## 线条标记 - -标记maker | 描述 -----|---- -‘o’ |圆圈 -‘.’ |点 -‘D’ |菱形 -‘s’ |正方形 -‘h’ |六边形1 -‘*’ |星号 -‘H’ |六边形2 -‘d’ |小菱形 -‘_’ | 水平线 -‘v’ |一角朝下的三角形 -‘8’ |八边形 -‘<’ | 一角朝左的三角形 -‘p’ |五边形 -‘>’ |一角朝右的三角形 -‘,’ |像素 -‘^’ | 一角朝上的三角形 -‘+’ | 加号 -‘\ ‘ |竖线 -‘None’,’’,’ ‘ |无 -‘x’ | X - - -## 颜色 - -别名 | 颜色 ----|--- -b | 蓝色 -g |绿色 -r |红色 -y |黄色 -c |青色 -k |黑色 -m |洋红色 -w |白色 - - -## 绘图步骤 - -```py -#使用numpy产生数据 -x=np.arange(-5,5,0.1) -y=x*3 - -#创建窗口、子图 -#方法1:先创建窗口,再创建子图。(一定绘制) -fig = plt.figure(num=1, figsize=(15, 8),dpi=80) #开启一个窗口,同时设置大小,分辨率 -ax1 = fig.add_subplot(2,1,1) #通过fig添加子图,参数:行数,列数,第几个。 -ax2 = fig.add_subplot(2,1,2) #通过fig添加子图,参数:行数,列数,第几个。 -print(fig,ax1,ax2) -#方法2:一次性创建窗口和多个子图。(空白不绘制) -fig,axarr = plt.subplots(4,1) #开一个新窗口,并添加4个子图,返回子图数组 -ax1 = axarr[0] #通过子图数组获取一个子图 -print(fig,ax1) -#方法3:一次性创建窗口和一个子图。(空白不绘制) -ax1 = plt.subplot(1,1,1,facecolor='white') #开一个新窗口,创建1个子图。facecolor设置背景颜色 -print(ax1) -#获取对窗口的引用,适用于上面三种方法 -# fig = plt.gcf() #获得当前figure -# fig=ax1.figure #获得指定子图所属窗口 - -# fig.subplots_adjust(left=0) #设置窗口左内边距为0,即左边留白为0。 - -#设置子图的基本元素 -ax1.set_title('python-drawing') #设置图体,plt.title -ax1.set_xlabel('x-name') #设置x轴名称,plt.xlabel -ax1.set_ylabel('y-name') #设置y轴名称,plt.ylabel -plt.axis([-6,6,-10,10]) #设置横纵坐标轴范围,这个在子图中被分解为下面两个函数 -ax1.set_xlim(-5,5) #设置横轴范围,会覆盖上面的横坐标,plt.xlim -ax1.set_ylim(-10,10) #设置纵轴范围,会覆盖上面的纵坐标,plt.ylim - -xmajorLocator = MultipleLocator(2) #定义横向主刻度标签的刻度差为2的倍数。就是隔几个刻度才显示一个标签文本 -ymajorLocator = MultipleLocator(3) #定义纵向主刻度标签的刻度差为3的倍数。就是隔几个刻度才显示一个标签文本 - -ax1.xaxis.set_major_locator(xmajorLocator) #x轴 应用定义的横向主刻度格式。如果不应用将采用默认刻度格式 -ax1.yaxis.set_major_locator(ymajorLocator) #y轴 应用定义的纵向主刻度格式。如果不应用将采用默认刻度格式 - -ax1.xaxis.grid(True, which='major') #x坐标轴的网格使用定义的主刻度格式 -ax1.yaxis.grid(True, which='major') #x坐标轴的网格使用定义的主刻度格式 - -ax1.set_xticks([]) #去除坐标轴刻度 -ax1.set_xticks((-5,-3,-1,1,3,5)) #设置坐标轴刻度 -ax1.set_xticklabels(labels=['x1','x2','x3','x4','x5'],rotation=-30,fontsize='small') #设置刻度的显示文本,rotation旋转角度,fontsize字体大小 - -plot1=ax1.plot(x,y,marker='o',color='g',label='legend1') #点图:marker图标 -plot2=ax1.plot(x,y,linestyle='--',alpha=0.5,color='r',label='legend2') #线图:linestyle线性,alpha透明度,color颜色,label图例文本 - -ax1.legend(loc='upper left') #显示图例,plt.legend() -ax1.text(2.8, 7, r'y=3*x') #指定位置显示文字,plt.text() -ax1.annotate('important point', xy=(2, 6), xytext=(3, 1.5), #添加标注,参数:注释文本、指向点、文字位置、箭头属性 - arrowprops=dict(facecolor='black', shrink=0.05), - ) -#显示网格。which参数的值为major(只绘制大刻度)、minor(只绘制小刻度)、both,默认值为major。axis为'x','y','both' -ax1.grid(b=True,which='major',axis='both',alpha= 0.5,color='skyblue',linestyle='--',linewidth=2) - -axes1 = plt.axes([.2, .3, .1, .1], facecolor='y') #在当前窗口添加一个子图,rect=[左, 下, 宽, 高],是使用的绝对布局,不和以存在窗口挤占空间 -axes1.plot(x,y) #在子图上画图 -plt.savefig('aa.jpg',dpi=400,bbox_inches='tight') #savefig保存图片,dpi分辨率,bbox_inches子图周边白色空间的大小 -plt.show() #打开窗口,对于方法1创建在窗口一定绘制,对于方法2方法3创建的窗口,若坐标系全部空白,则不绘制 - -``` - -## plot属性 - -```py -属性 值类型 -alpha 浮点值 -animated [True / False] -antialiased or aa [True / False] -clip_box matplotlib.transform.Bbox 实例 -clip_on [True / False] -clip_path Path 实例, Transform,以及Patch实例 -color or c 任何 matplotlib 颜色 -contains 命中测试函数 -dash_capstyle ['butt' / 'round' / 'projecting'] -dash_joinstyle ['miter' / 'round' / 'bevel'] -dashes 以点为单位的连接/断开墨水序列 -data (np.array xdata, np.array ydata) -figure matplotlib.figure.Figure 实例 -label 任何字符串 -linestyle or ls [ '-' / '--' / '-.' / ':' / 'steps' / ...] -linewidth or lw 以点为单位的浮点值 -lod [True / False] -marker [ '+' / ',' / '.' / '1' / '2' / '3' / '4' ] -markeredgecolor or mec 任何 matplotlib 颜色 -markeredgewidth or mew 以点为单位的浮点值 -markerfacecolor or mfc 任何 matplotlib 颜色 -markersize or ms 浮点值 -markevery [ None / 整数值 / (startind, stride) ] -picker 用于交互式线条选择 -pickradius 线条的拾取选择半径 -solid_capstyle ['butt' / 'round' / 'projecting'] -solid_joinstyle ['miter' / 'round' / 'bevel'] -transform matplotlib.transforms.Transform 实例 -visible [True / False] -xdata np.array -ydata np.array -zorder 任何数值 -``` - -## 多图绘制 - -```py -#一个窗口,多个图,多条数据 -sub1=plt.subplot(211,facecolor=(0.1843,0.3098,0.3098)) #将窗口分成2行1列,在第1个作图,并设置背景色 -sub2=plt.subplot(212) #将窗口分成2行1列,在第2个作图 -sub1.plot(x,y) #绘制子图 -sub2.plot(x,y) #绘制子图 - -axes1 = plt.axes([.2, .3, .1, .1], facecolor='y') #添加一个子坐标系,rect=[左, 下, 宽, 高] -plt.plot(x,y) #绘制子坐标系, -axes2 = plt.axes([0.7, .2, .1, .1], facecolor='y') #添加一个子坐标系,rect=[左, 下, 宽, 高] -plt.plot(x,y) -plt.show() -``` -## 极坐标 - -```py -fig = plt.figure(2) #新开一个窗口 -ax1 = fig.add_subplot(1,2,1,polar=True) #启动一个极坐标子图 -theta=np.arange(0,2*np.pi,0.02) #角度数列值 -ax1.plot(theta,2*np.ones_like(theta),lw=2) #画图,参数:角度,半径,lw线宽 -ax1.plot(theta,theta/6,linestyle='--',lw=2) #画图,参数:角度,半径,linestyle样式,lw线宽 - -ax2 = fig.add_subplot(1,2,2,polar=True) #启动一个极坐标子图 -ax2.plot(theta,np.cos(5*theta),linestyle='--',lw=2) -ax2.plot(theta,2*np.cos(4*theta),lw=2) - -ax2.set_rgrids(np.arange(0.2,2,0.2),angle=45) #距离网格轴,轴线刻度和显示位置 -ax2.set_thetagrids([0,45,90]) #角度网格轴,范围0-360度 - -plt.show() -``` - -## 柱状图 - -```py -plt.figure(3) -x_index = np.arange(5) #柱的索引 -x_data = ('A', 'B', 'C', 'D', 'E') -y1_data = (20, 35, 30, 35, 27) -y2_data = (25, 32, 34, 20, 25) -bar_width = 0.35 #定义一个数字代表每个独立柱的宽度 - -rects1 = plt.bar(x_index, y1_data, width=bar_width,alpha=0.4, color='b',label='legend1') #参数:左偏移、高度、柱宽、透明度、颜色、图例 -rects2 = plt.bar(x_index + bar_width, y2_data, width=bar_width,alpha=0.5,color='r',label='legend2') #参数:左偏移、高度、柱宽、透明度、颜色、图例 -#关于左偏移,不用关心每根柱的中心不中心,因为只要把刻度线设置在柱的中间就可以了 -plt.xticks(x_index + bar_width/2, x_data) #x轴刻度线 -plt.legend() #显示图例 -plt.tight_layout() #自动控制图像外部边缘,此方法不能够很好的控制图像间的间隔 -plt.show() -``` - -## 直方图 - -```py -fig,(ax0,ax1) = plt.subplots(nrows=2,figsize=(9,6)) #在窗口上添加2个子图 -sigma = 1 #标准差 -mean = 0 #均值 -x=mean+sigma*np.random.randn(10000) #正态分布随机数 -ax0.hist(x,bins=40,normed=False,histtype='bar',facecolor='yellowgreen',alpha=0.75) #normed是否归一化,histtype直方图类型,facecolor颜色,alpha透明度 -ax1.hist(x,bins=20,normed=1,histtype='bar',facecolor='pink',alpha=0.75,cumulative=True,rwidth=0.8) #bins柱子的个数,cumulative是否计算累加分布,rwidth柱子宽度 -plt.show() #所有窗口运行 -``` - -## 散点图 - -```py -fig = plt.figure(4) #添加一个窗口 -ax =fig.add_subplot(1,1,1) #在窗口上添加一个子图 -x=np.random.random(100) #产生随机数组 -y=np.random.random(100) #产生随机数组 -ax.scatter(x,y,s=x*1000,c='y',marker=(5,1),alpha=0.5,lw=2,facecolors='none') #x横坐标,y纵坐标,s图像大小,c颜色,marker图片,lw图像边框宽度 -plt.show() #所有窗口运行 -``` - -## 三维图 - -```py -fig = plt.figure(5) -ax=fig.add_subplot(1,1,1,projection='3d') #绘制三维图 - -x,y=np.mgrid[-2:2:20j,-2:2:20j] #获取x轴数据,y轴数据 -z=x*np.exp(-x**2-y**2) #获取z轴数据 - -ax.plot_surface(x,y,z,rstride=2,cstride=1,cmap=plt.cm.coolwarm,alpha=0.8) #绘制三维图表面 -ax.set_xlabel('x-name') #x轴名称 -ax.set_ylabel('y-name') #y轴名称 -ax.set_zlabel('z-name') #z轴名称 - -plt.show() -``` - -## 集合图形 - -```py -fig = plt.figure(6) #创建一个窗口 -ax=fig.add_subplot(1,1,1) #添加一个子图 -rect1 = plt.Rectangle((0.1,0.2),0.2,0.3,color='r') #创建一个矩形,参数:(x,y),width,height -circ1 = plt.Circle((0.7,0.2),0.15,color='r',alpha=0.3) #创建一个椭圆,参数:中心点,半径,默认这个圆形会跟随窗口大小进行长宽压缩 -pgon1 = plt.Polygon([[0.45,0.45],[0.65,0.6],[0.2,0.6]]) #创建一个多边形,参数:每个顶点坐标 - -ax.add_patch(rect1) #将形状添加到子图上 -ax.add_patch(circ1) #将形状添加到子图上 -ax.add_patch(pgon1) #将形状添加到子图上 - -fig.canvas.draw() #子图绘制 -plt.show() -``` \ No newline at end of file diff --git a/Python/matplotlab/pyplot_function.md b/Python/matplotlab/学习教程/01pyplot方法列表.md similarity index 100% rename from Python/matplotlab/pyplot_function.md rename to Python/matplotlab/学习教程/01pyplot方法列表.md diff --git a/Python/matplotlab/学习教程/02面向对象绘图实例.md b/Python/matplotlab/学习教程/02面向对象绘图实例.md new file mode 100644 index 00000000..a70196fe --- /dev/null +++ b/Python/matplotlab/学习教程/02面向对象绘图实例.md @@ -0,0 +1,359 @@ +# 面向对象的绘图方式 + +> 在这里的实例中,面向对象的方法与命令行的方式进行了混用,不提倡。首先运用好交互式命令行的方式进行绘图。 + +## 配置参数 + +* axex: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示 +* figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置 +* font: 字体集(font family)、字体大小和样式设置 +* grid: 设置网格颜色和线性 +* legend: 设置图例和其中的文本的显示 +* line: 设置线条(颜色、线型、宽度等)和标记 +* patch: 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。 +* savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色。 +* verbose: 设置matplotlib在执行期间信息输出,如silent、helpful、debug和debug-annoying。 +* xticks和yticks: 为x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。 + + +## 线条风格 + +线条风格linestyle或ls | 描述 +----|--- +‘-‘ |实线 +‘:’ |虚线 +‘–’ |破折线 +‘None’,’ ‘,’’ |什么都不画 +‘-.’ |点划线 + +## 线条标记 + +标记maker | 描述 +----|---- +‘o’ |圆圈 +‘.’ |点 +‘D’ |菱形 +‘s’ |正方形 +‘h’ |六边形1 +‘*’ |星号 +‘H’ |六边形2 +‘d’ |小菱形 +‘_’ | 水平线 +‘v’ |一角朝下的三角形 +‘8’ |八边形 +‘<’ | 一角朝左的三角形 +‘p’ |五边形 +‘>’ |一角朝右的三角形 +‘,’ |像素 +‘^’ | 一角朝上的三角形 +‘+’ | 加号 +‘\ ‘ |竖线 +‘None’,’’,’ ‘ |无 +‘x’ | X + + +## 颜色 + +别名 | 颜色 +---|--- +b | 蓝色 +g |绿色 +r |红色 +y |黄色 +c |青色 +k |黑色 +m |洋红色 +w |白色 + + +## 绘图步骤 + +```py +#使用numpy产生数据 +x=np.arange(-5,5,0.1) +y=x*3 + +#创建窗口、子图 +#方法1:先创建窗口,再创建子图。(一定绘制) +fig = plt.figure(num=1, figsize=(15, 8),dpi=80) +#开启一个窗口,同时设置大小,分辨率 +ax1 = fig.add_subplot(2,1,1) +#通过fig添加子图,参数:行数,列数,第几个。 +ax2 = fig.add_subplot(2,1,2) +#通过fig添加子图,参数:行数,列数,第几个。 +print(fig,ax1,ax2) +#方法2:一次性创建窗口和多个子图。(空白不绘制) +fig,axarr = plt.subplots(4,1) +#开一个新窗口,并添加4个子图,返回子图数组 +ax1 = axarr[0] +#通过子图数组获取一个子图 +print(fig,ax1) +#方法3:一次性创建窗口和一个子图。(空白不绘制) +ax1 = plt.subplot(1,1,1,facecolor='white') + +#开一个新窗口,创建1个子图。facecolor设置背景颜色 +print(ax1) +#获取对窗口的引用,适用于上面三种方法 +# fig = plt.gcf() #获得当前figure +# fig=ax1.figure #获得指定子图所属窗口 + +# fig.subplots_adjust(left=0) +#设置窗口左内边距为0,即左边留白为0。 + +#设置子图的基本元素 +ax1.set_title('python-drawing') +#设置图体,plt.title +ax1.set_xlabel('x-name') +#设置x轴名称,plt.xlabel +ax1.set_ylabel('y-name') +#设置y轴名称,plt.ylabel +plt.axis([-6,6,-10,10]) +#设置横纵坐标轴范围,这个在子图中被分解为下面两个函数 +ax1.set_xlim(-5,5) +#设置横轴范围,会覆盖上面的横坐标,plt.xlim +ax1.set_ylim(-10,10) +#设置纵轴范围,会覆盖上面的纵坐标,plt.ylim + +xmajorLocator = MultipleLocator(2) +#定义横向主刻度标签的刻度差为2的倍数。就是隔几个刻度才显示一个标签文本 +ymajorLocator = MultipleLocator(3) +#定义纵向主刻度标签的刻度差为3的倍数。就是隔几个刻度才显示一个标签文本 + +ax1.xaxis.set_major_locator(xmajorLocator) +#x轴 应用定义的横向主刻度格式。如果不应用将采用默认刻度格式 +ax1.yaxis.set_major_locator(ymajorLocator) +#y轴 应用定义的纵向主刻度格式。如果不应用将采用默认刻度格式 + +ax1.xaxis.grid(True, which='major') +#x坐标轴的网格使用定义的主刻度格式 +ax1.yaxis.grid(True, which='major') +#x坐标轴的网格使用定义的主刻度格式 + +ax1.set_xticks([]) +#去除坐标轴刻度 +ax1.set_xticks((-5,-3,-1,1,3,5)) +#设置坐标轴刻度 +ax1.set_xticklabels(labels=['x1','x2','x3','x4','x5'],rotation=-30,fontsize='small') +#设置刻度的显示文本,rotation旋转角度,fontsize字体大小 + +plot1=ax1.plot(x,y,marker='o',color='g',label='legend1') +#点图:marker图标 +plot2=ax1.plot(x,y,linestyle='--',alpha=0.5,color='r',label='legend2') +#线图:linestyle线性,alpha透明度,color颜色,label图例文本 + +ax1.legend(loc='upper left') +#显示图例,plt.legend() +ax1.text(2.8, 7, r'y=3*x') +#指定位置显示文字,plt.text() +ax1.annotate('important point', xy=(2, 6), xytext=(3, 1.5), arrowprops=dict(facecolor='black', shrink=0.05),) +#添加标注,参数:注释文本、指向点、文字位置、箭头属性 +#显示网格。which参数的值为major(只绘制大刻度)、minor(只绘制小刻度)、both,默认值为major。axis为'x','y','both' +ax1.grid(b=True,which='major',axis='both',alpha= 0.5,color='skyblue',linestyle='--',linewidth=2) + +axes1 = plt.axes([.2, .3, .1, .1], facecolor='y') +#在当前窗口添加一个子图,rect=[左, 下, 宽, 高],是使用的绝对布局,不和以存在窗口挤占空间 +axes1.plot(x,y) +#在子图上画图 +plt.savefig('aa.jpg',dpi=400,bbox_inches='tight') +#savefig保存图片,dpi分辨率,bbox_inches子图周边白色空间的大小 +plt.show() +#打开窗口,对于方法1创建在窗口一定绘制,对于方法2方法3创建的窗口,若坐标系全部空白,则不绘制 + +``` + +## plot属性 + +```py +属性 值类型 +alpha 浮点值 +animated [True / False] +antialiased or aa [True / False] +clip_box matplotlib.transform.Bbox 实例 +clip_on [True / False] +clip_path Path 实例, Transform,以及Patch实例 +color or c 任何 matplotlib 颜色 +contains 命中测试函数 +dash_capstyle ['butt' / 'round' / 'projecting'] +dash_joinstyle ['miter' / 'round' / 'bevel'] +dashes 以点为单位的连接/断开墨水序列 +data (np.array xdata, np.array ydata) +figure matplotlib.figure.Figure 实例 +label 任何字符串 +linestyle or ls [ '-' / '--' / '-.' / ':' / 'steps' / ...] +linewidth or lw 以点为单位的浮点值 +lod [True / False] +marker [ '+' / ',' / '.' / '1' / '2' / '3' / '4' ] +markeredgecolor or mec 任何 matplotlib 颜色 +markeredgewidth or mew 以点为单位的浮点值 +markerfacecolor or mfc 任何 matplotlib 颜色 +markersize or ms 浮点值 +markevery [ None / 整数值 / (startind, stride) ] +picker 用于交互式线条选择 +pickradius 线条的拾取选择半径 +solid_capstyle ['butt' / 'round' / 'projecting'] +solid_joinstyle ['miter' / 'round' / 'bevel'] +transform matplotlib.transforms.Transform 实例 +visible [True / False] +xdata np.array +ydata np.array +zorder 任何数值 +``` + +## 多图绘制 + +```py +#一个窗口,多个图,多条数据 +sub1=plt.subplot(211,facecolor=(0.1843,0.3098,0.3098)) +#将窗口分成2行1列,在第1个作图,并设置背景色 +sub2=plt.subplot(212) +#将窗口分成2行1列,在第2个作图 +sub1.plot(x,y) +#绘制子图 +sub2.plot(x,y) +#绘制子图 + +axes1 = plt.axes([.2, .3, .1, .1], facecolor='y') +#添加一个子坐标系,rect=[左, 下, 宽, 高] +plt.plot(x,y) +#绘制子坐标系, +axes2 = plt.axes([0.7, .2, .1, .1], facecolor='y') +#添加一个子坐标系,rect=[左, 下, 宽, 高] +plt.plot(x,y) +plt.show() +``` +## 极坐标 + +```py +fig = plt.figure(2) +#新开一个窗口 +ax1 = fig.add_subplot(1,2,1,polar=True) +#启动一个极坐标子图 +theta=np.arange(0,2*np.pi,0.02) +#角度数列值 +ax1.plot(theta,2*np.ones_like(theta),lw=2) +#画图,参数:角度,半径,lw线宽 +ax1.plot(theta,theta/6,linestyle='--',lw=2) +#画图,参数:角度,半径,linestyle样式,lw线宽 + +ax2 = fig.add_subplot(1,2,2,polar=True) +#启动一个极坐标子图 +ax2.plot(theta,np.cos(5*theta),linestyle='--',lw=2) +ax2.plot(theta,2*np.cos(4*theta),lw=2) + +ax2.set_rgrids(np.arange(0.2,2,0.2),angle=45) #距离网格轴,轴线刻度和显示位置 +ax2.set_thetagrids([0,45,90]) #角度网格轴,范围0-360度 + +plt.show() +``` + +## 柱状图 + +```py +plt.figure(3) +x_index = np.arange(5) +#柱的索引 +x_data = ('A', 'B', 'C', 'D', 'E') +y1_data = (20, 35, 30, 35, 27) +y2_data = (25, 32, 34, 20, 25) +bar_width = 0.35 +#定义一个数字代表每个独立柱的宽度 + +rects1 = plt.bar(x_index, y1_data, width=bar_width,alpha=0.4, color='b',label='legend1') +#参数:左偏移、高度、柱宽、透明度、颜色、图例 +rects2 = plt.bar(x_index + bar_width, y2_data, width=bar_width,alpha=0.5,color='r',label='legend2') +#参数:左偏移、高度、柱宽、透明度、颜色、图例 +#关于左偏移,不用关心每根柱的中心不中心,因为只要把刻度线设置在柱的中间就可以了 +plt.xticks(x_index + bar_width/2, x_data) +#x轴刻度线 +plt.legend() +#显示图例 +plt.tight_layout() +#自动控制图像外部边缘,此方法不能够很好的控制图像间的间隔 +plt.show() +``` + +## 直方图 + +```py +fig,(ax0,ax1) = plt.subplots(nrows=2,figsize=(9,6)) +#在窗口上添加2个子图 +sigma = 1 +#标准差 +mean = 0 +#均值 +x=mean+sigma*np.random.randn(10000) +#正态分布随机数 +ax0.hist(x,bins=40,normed=False,histtype='bar',facecolor='yellowgreen',alpha=0.75) +#normed是否归一化,histtype直方图类型,facecolor颜色,alpha透明度 +ax1.hist(x,bins=20,normed=1,histtype='bar',facecolor='pink',alpha=0.75,cumulative=True,rwidth=0.8) +#bins柱子的个数,cumulative是否计算累加分布,rwidth柱子宽度 +plt.show() +#所有窗口运行 +``` + +## 散点图 + +```py +fig = plt.figure(4) +#添加一个窗口 +ax =fig.add_subplot(1,1,1) +#在窗口上添加一个子图 +x=np.random.random(100) +#产生随机数组 +y=np.random.random(100) +#产生随机数组 +ax.scatter(x,y,s=x*1000,c='y',marker=(5,1),alpha=0.5,lw=2,facecolors='none') +#x横坐标,y纵坐标,s图像大小,c颜色,marker图片,lw图像边框宽度 +plt.show() +#所有窗口运行 +``` + +## 三维图 + +```py +fig = plt.figure(5) +ax=fig.add_subplot(1,1,1,projection='3d') +#绘制三维图 + +x,y=np.mgrid[-2:2:20j,-2:2:20j] +#获取x轴数据,y轴数据 +z=x*np.exp(-x**2-y**2) +#获取z轴数据 + +ax.plot_surface(x,y,z,rstride=2,cstride=1,cmap=plt.cm.coolwarm,alpha=0.8) +#绘制三维图表面 +ax.set_xlabel('x-name') +#x轴名称 +ax.set_ylabel('y-name') +#y轴名称 +ax.set_zlabel('z-name') +#z轴名称 + +plt.show() +``` + +## 集合图形 + +```py +fig = plt.figure(6) +#创建一个窗口 +ax=fig.add_subplot(1,1,1) +#添加一个子图 +rect1 = plt.Rectangle((0.1,0.2),0.2,0.3,color='r') +#创建一个矩形,参数:(x,y),width,height +circ1 = plt.Circle((0.7,0.2),0.15,color='r',alpha=0.3) +#创建一个椭圆,参数:中心点,半径,默认这个圆形会跟随窗口大小进行长宽压缩 +pgon1 = plt.Polygon([[0.45,0.45],[0.65,0.6],[0.2,0.6]]) +#创建一个多边形,参数:每个顶点坐标 + +ax.add_patch(rect1) +#将形状添加到子图上 +ax.add_patch(circ1) +#将形状添加到子图上 +ax.add_patch(pgon1) +#将形状添加到子图上 + +fig.canvas.draw() +#子图绘制 +plt.show() +``` \ No newline at end of file diff --git a/Python/matplotlab/学习教程/03基本用法.md b/Python/matplotlab/学习教程/03基本用法.md new file mode 100644 index 00000000..bba0d704 --- /dev/null +++ b/Python/matplotlab/学习教程/03基本用法.md @@ -0,0 +1,135 @@ +# 基本用法 +## 本章知识点归纳如下: + +* 导入模块:import matplotlib.pyplot as plt +* 定义图像窗口:plt.figure() +* 画图:plt.plot(x, y) +* 定义坐标轴范围:plt.xlim()/plt.ylim() +* 定义坐标轴名称:plt.xlabel()/plt.ylabel() +* 定义坐标轴刻度及名称:plt.xticks()/plt.yticks() +* 设置图像边框颜色:ax = plt.gca() ax.spines[].set_color() +* 调整刻度位置:ax.xaxis.set_ticks_position()/ax.yaxis.set_ticks_position() +* 调整边框(坐标轴)位置:ax.spines[].set_position() + +## 导入模块 + +* 使用import导入模块matplotlib.pyplot,并简写成plt;使用import导入模块numpy,并简写成np +```py +import matplotlib.pyplot as plt +import numpy as np +``` +* 然后创建两组数据,使用np.linspace定义x:范围是(-3,3),个数是50,将产生一组(-3,3)内均匀分布的50个数;(x,y1)表示曲线1,(x,y2)表示曲线2。 +```py +x = np.linspace(-3, 3, 50) +y1 = 2*x + 1 +y2 = x**2 +``` + +## 定义图像窗口并画图 + +* 在画图前使用plt.figure()定义一个图像窗口:编号为3;大小为(8, 5);这两项参数可缺省。其中,num参数决定了程序运行后弹出的图像窗口名字,但在klab平台下不会显示。接着,我们使用plt.plot画出(x ,y2)曲线;使用plt.plot画(x ,y1)曲线,曲线的颜色属性(color)为红色;曲线的宽度(linewidth)为1.0;曲线的类型(linestyle)为虚线,除了虚线外,大家还可使用以下线性:'-'、'--'、'-.'、':' 。接着,我们使用plt.show()显示图像。 + +```py +plt.figure(num=3, figsize=(8, 5)) +plt.plot(x, y2) +plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--') +plt.show() +``` + +## 定义坐标轴名称及范围 +* 使用plt.xlim设置x坐标轴范围:(-1, 2); 使用plt.ylim设置y坐标轴范围:(-2, 3); 使用plt.xlabel设置x坐标轴名称:’I am x’; 使用plt.ylabel设置y坐标轴名称:’I am y’; +```py +plt.figure(num=3, figsize=(8, 5),) +plt.plot(x, y2) +plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--') +plt.xlim((-1, 2)) +plt.ylim((-2, 3)) +plt.xlabel('I am x') +plt.ylabel('I am y') +plt.show() +``` +## 定义坐标轴刻度及名称 + +* 有时候,我们的坐标轴刻度可能并不是一连串的数字,而是一些文字,或者我们想要调整坐标轴的刻度的稀疏,这时,就需要使用plt.xticks()或者plt.yticks()来进行调整:首先,使用np.linspace定义新刻度范围以及个数:范围是(-1,2);个数是5。使用plt.xticks设置x轴刻度:范围是(-1,2);个数是5。使用plt.yticks设置y轴刻度以及名称:刻度为[-2, -1.8, -1, 1.22, 3];对应刻度的名称为[‘really bad’,’bad’,’normal’,’good’, ‘really good’]。使用plt.show()显示图像。 +```py +plt.figure(num=3, figsize=(8, 5)) +plt.plot(x, y2) +plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--') +plt.xlim((-1, 2)) +plt.ylim((-2, 3)) +plt.xlabel('I am x') +plt.ylabel('I am y') +new_ticks = np.linspace(-1, 2, 5) +print(new_ticks) +plt.xticks(new_ticks) +plt.yticks([-2, -1.8, -1, 1.22, 3],[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$']) +plt.show() +[-1. -0.25 0.5 1.25 2. ] +``` +## 设置图像边框颜色 +* 细心的小伙伴可能会注意到,我们的图像坐标轴总是由上下左右四条线组成,我们也可以对它们进行修改:首先,使用plt.gca()获取当前坐标轴信息。使用.spines设置边框;使用.set_color设置边框颜色; +```py +plt.figure(num=3, figsize=(8, 5)) +plt.plot(x, y2) +plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--') +plt.xlim((-1, 2)) +plt.ylim((-2, 3)) +plt.xticks(new_ticks) +plt.yticks([-2, -1.8, -1, 1.22, 3],[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$']) +ax = plt.gca() +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') +plt.show() +``` +调整刻度及边框位置 +使用.xaxis.set_ticks_position设置x坐标刻度数字或名称的位置:bottom.(所有位置:top,bottom,both,default,none);使用.spines设置边框:x轴;使用.set_position设置边框位置:y=0的位置;(位置所有属性:outward,axes,data) + +plt.figure(num=3, figsize=(8, 5)) +plt.plot(x, y2) +plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--') +plt.xlim((-1, 2)) +plt.ylim((-2, 3)) +plt.xticks(new_ticks) +plt.yticks([-2, -1.8, -1, 1.22, 3],[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$']) +ax = plt.gca() +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') +ax.xaxis.set_ticks_position('bottom') +ax.spines['bottom'].set_position(('data', 0)) +plt.show() + +使用.yaxis.set_ticks_position设置y坐标刻度数字或名称的位置:left.(所有位置:left,right,both,default,none) 使用.spines设置边框:y轴;使用.set_position设置边框位置:x=0的位置;(位置所有属性:outward,axes,data) 使用plt.show显示图像. + +plt.figure(num=3, figsize=(8, 5)) +plt.plot(x, y2) +plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--') +plt.xlim((-1, 2)) +plt.ylim((-2, 3)) +plt.xticks(new_ticks) +plt.yticks([-2, -1.8, -1, 1.22, 3],[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$']) +ax = plt.gca() +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') +ax.xaxis.set_ticks_position('bottom') +ax.spines['bottom'].set_position(('data', 0)) +ax.yaxis.set_ticks_position('left') +ax.spines['left'].set_position(('data',0)) +plt.show() + +练一练 +小伙伴们,以上就是matplotlib的基本用法,是不是比较简单呢?现在,请根据上述所学内容,画出直线 y = x-1, 线型为虚线,线宽为1,纵坐标范围(-2,1),横坐标范围(-1,2),横纵坐标在(0,0)坐标点相交。横坐标的 [-1,-0.5,1] 分别对应 [bad, normal, good]。请一定自己尝试一番再看下面的答案噢~ + +#答案 +x = np.linspace(-1, 2, 50) +y = x - 1 +plt.figure() +plt.plot(x,y, linewidth=1.0, linestyle='--') +plt.xlim((-1,2)) +plt.ylim((-2,2)) +plt.xticks([-1,-0.5,1],['bad', 'normal', 'good']) +ax = plt.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)) +plt.show() \ No newline at end of file diff --git a/Python/matplotlab/学习教程/test1.py b/Python/matplotlab/学习教程/test1.py new file mode 100644 index 00000000..d57e773a --- /dev/null +++ b/Python/matplotlab/学习教程/test1.py @@ -0,0 +1,33 @@ +# changshi +import numpy as np +import matplotlib.pyplot as plt + +# 定义数据集 +x = np.linspace(-3,3,50) +y1 = 2*x+1 +y2 = x**2 + + +# 绘制图像 +plt.figure(num=3,figsize=(10,10)) +plt.plot(x,y1) +plt.plot(x,y2,color='red',linewidth=1,linestyle='--') + +# 定义坐标轴的范围及名称 +plt.xlim((-5,5)) +plt.ylim((0,10)) + +plt.xlabel('i am x') +plt.ylabel('i am y') + +# 刻度 +ticks = np.linspace(-1,2,5) +plt.xticks(ticks) +plt.yticks([-2,-1.8,-1,1.22,3],[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$']) + +# 设置边框颜色 +ax = plt.gca() +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') +# 展示图像 +plt.show() \ No newline at end of file diff --git a/Python/numpy/20随机数.md b/Python/numpy/20随机数.md new file mode 100644 index 00000000..17a3efad --- /dev/null +++ b/Python/numpy/20随机数.md @@ -0,0 +1,703 @@ +# 使用numpy产生随机数 +numpy中的random模块包含了很多方法可以用来产生随机数,这篇文章将对random中的一些常用方法做一个总结。 + +## 1、numpy.random.rand(d0, d1, ..., dn) +* 作用:产生一个给定形状的数组(其实应该是ndarray对象或者是一个单值),数组中的值服从[0, 1)之间的均匀分布。 +* 参数:d0, d, ..., dn : int,可选。如果没有参数则返回一个float型的随机数,该随机数服从[0, 1)之间的均匀分布。 +* 返回值:ndarray对象或者一个float型的值 +例子: +```py +# [0, 1)之间均匀分布的随机数,3行2列 +a = np.random.rand(3, 2) +print(a) +# 不提供形状 +b = np.random.rand() +print(b) +输出: + +[[0.26054323 0.28184468] + [0.7783674 0.71733674] + [0.90302256 0.49303252]] +0.6022098740124009 +``` +## 2、numpy.random.uniform(low=0.0, high=1.0, size=None) +* 作用:返回一个在区间[low, high)中均匀分布的数组,size指定形状。 +* 参数: + * low, high:float型或者float型的类数组对象。指定抽样区间为[low, high),low的默认值为0.0,hign的默认值为1.0 + * size:int型或int型元组。指定形状,如果不提供size,则返回一个服从该分布的随机数。 +例子: +```py +# 在[1, 10)之间均匀抽样,数组形状为3行2列 +a = np.random.uniform(1, 10, (3, 2)) +print(a) +# 不提供size +b = np.random.uniform(1, 10) +print(b) +输出: + +[[5.16545387 6.3769087 ] + [9.98964899 7.88833885] + [1.37173855 4.19855075]] +3.899250175275188 +``` +## 3、numpy.random.randn(d0, d1, ..., dn) +* 作用:返回一个指定形状的数组,数组中的值服从标准正态分布(均值为0,方差为1)。 +* 参数:d0, d, ..., dn : int,可选。如果没有参数,则返回一个服从标准正态分布的float型随机数。 +* 返回值:ndarray对象或者float +例子: +```py +# 3行2列 +a = np.random.randn(3, 2) +print(a) +# 不提供形状 +b = np.random.randn() +print(b) +输出: + +[[-1.46605527 0.35434705] + [ 0.43408199 0.02689309] + [ 0.48041554 1.62665755]] +-0.6291254375915813 +``` + +## 4、numpy.random.normal(loc=0.0, scale=1.0, size=None) +* 作用:返回一个由size指定形状的数组,数组中的值服从 μ=loc,σ=scale 的正态分布。 +* 参数: + * loc : float型或者float型的类数组对象,指定均值 μ + * scale : float型或者float型的类数组对象,指定标准差 σ + * size : int型或者int型的元组,指定了数组的形状。如果不提供size,且loc和scale为标量(不是类数组对象),则返回一个服从该分布的随机数。 +* 输出:ndarray对象或者一个标量 +例子: +```py +# 标准正态分布,3行2列 +a = np.random.normal(0, 1, (3, 2)) +print(a) +# 均值为1,标准差为3 +b = np.random.normal(1, 3) +print(b) +输出: + +[[ 0.34912031 -0.08757564] + [-0.99753101 0.37441719] + [ 2.68072286 -1.03663963]] +5.770831320998463 +``` +## 5、numpy.random.randint(low, high=None, size=None, dtype='l') +* 作用:返回一个在区间[low, high)中离散均匀抽样的数组,size指定形状,dtype指定数据类型。 +* 参数: + * low, high:int型,指定抽样区间[low, high) + * size:int型或int型的元组,指定形状 + * dypte:可选参数,指定数据类型,比如int,int64等,默认是np.int +* 返回值:如果指定了size,则返回一个int型的ndarray对象,否则返回一个服从该分布的int型随机数。 +例子: +```py +# 在[1, 10)之间离散均匀抽样,数组形状为3行2列 +a = np.random.randint(1, 10, (3, 2)) +print(a) +# 不提供size +b = np.random.randint(1, 10) +print(b) +# 指定dtype +c = np.random.randint(1, 10, dtype=np.int64) +print(c) +type(c) +输出: + +[[3 1] + [3 3] + [5 8]] +6 +2 +numpy.int64 +``` + +## 6、numpy.random.random(size=None) +* 作用:返回从[0, 1)之间均匀抽样的数组,size指定形状。 +* 参数: + * size:int型或int型的元组,如果不提供则返回一个服从该分布的随机数 +* 返回值:float型或者float型的ndarray对象 +* 例子: +```py +# [0, 1)之间的均匀抽样,3行2列 +a = np.random.random((3, 2)) +print(a) +# 不指定size +b = np.random.random() +print(b) +输出: + +[[0.80136714 0.63129059] + [0.04556679 0.04433006] + [0.09643599 0.53312761]] +0.32828505898057136 +``` + +# numpy API + +## 简单的随机数据 + +
+

随机抽样 (numpy.random)

+
+

简单的随机数据

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

rand(d0, d1, ..., dn)

+
+

随机值

+
+
>>> np.random.rand(3,2)
+array([[ 0.14022471,  0.96360618],  #random
+       [ 0.37601032,  0.25528411],  #random
+       [ 0.49313049,  0.94909878]]) #random
+
+
+

randn(d0, d1, ..., dn)

+
+

返回一个样本,具有标准正态分布。

+

Notes

+

For random samples from 技术分享, use:

+
+
sigma * np.random.randn(...) + mu
+
+

Examples

+
+
>>> np.random.randn()
+2.1923875335537315 #random
+
+

Two-by-four array of samples from N(3, 6.25):

+
+
>>> 2.5 * np.random.randn(2, 4) + 3
+array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],  #random
+       [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]]) #random
+
+
+

randint(low[, high, size])

+
+

返回随机的整数,位于半开区间 [low, high)。

+
+
>>> np.random.randint(2, size=10)
+array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0])
+>>> np.random.randint(1, size=10)
+array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
+
+

Generate a 2 x 4 array of ints between 0 and 4, inclusive:

+
+
>>> np.random.randint(5, size=(2, 4))
+array([[4, 0, 2, 1],
+       [3, 2, 2, 0]])
+
+
+

random_integers(low[, high, size])

+
+

返回随机的整数,位于闭区间 [low, high]。

+

Notes

+

To sample from N evenly spaced floating-point numbers between a and b, use:

+
+
a + (b - a) * (np.random.random_integers(N) - 1) / (N - 1.)
+
+

Examples

+
复制代码
+
>>> np.random.random_integers(5)
+4
+>>> type(np.random.random_integers(5))
+<type ‘int‘>
+>>> np.random.random_integers(5, size=(3.,2.))
+array([[5, 4],
+       [3, 3],
+       [4, 5]])
+
复制代码
+

Choose five random numbers from the set of five evenly-spaced numbers between 0 and 2.5, inclusive (i.e., from the set 技术分享):

+
+
>>> 2.5 * (np.random.random_integers(5, size=(5,)) - 1) / 4.
+array([ 0.625,  1.25 ,  0.625,  0.625,  2.5  ])
+
+

Roll two six sided dice 1000 times and sum the results:

+
+
>>> d1 = np.random.random_integers(1, 6, 1000)
+>>> d2 = np.random.random_integers(1, 6, 1000)
+>>> dsums = d1 + d2
+
+

Display results as a histogram:

+
+
>>> import matplotlib.pyplot as plt
+>>> count, bins, ignored = plt.hist(dsums, 11, normed=True)
+>>> plt.show()
+
+

 

+
+

random_sample([size])

+
+

返回随机的浮点数,在半开区间 [0.0, 1.0)。

+

To sample 技术分享 multiply the output of random_sample by (b-a) and add a:

+
+
(b - a) * random_sample() + a
+
+

Examples

+
+
>>> np.random.random_sample()
+0.47108547995356098
+>>> type(np.random.random_sample())
+<type ‘float‘>
+>>> np.random.random_sample((5,))
+array([ 0.30220482,  0.86820401,  0.1654503 ,  0.11659149,  0.54323428])
+
+

Three-by-two array of random numbers from [-5, 0):

+
+
>>> 5 * np.random.random_sample((3, 2)) - 5
+array([[-3.99149989, -0.52338984],
+       [-2.99091858, -0.79479508],
+       [-1.23204345, -1.75224494]])
+
+

 

+
+

random([size])

+
+

返回随机的浮点数,在半开区间 [0.0, 1.0)。

+

(官网例子与random_sample完全一样)

+
+

ranf([size])

+
+

返回随机的浮点数,在半开区间 [0.0, 1.0)。

+

(官网例子与random_sample完全一样)

+
+

sample([size])

+
+

返回随机的浮点数,在半开区间 [0.0, 1.0)。

+

(官网例子与random_sample完全一样)

+
+

choice(a[, size, replace, p])

+
+

生成一个随机样本,从一个给定的一维数组

+

Examples

+

Generate a uniform random sample from np.arange(5) of size 3:

+
+
>>> np.random.choice(5, 3)
+array([0, 3, 4])
+>>> #This is equivalent to np.random.randint(0,5,3)
+
+

Generate a non-uniform random sample from np.arange(5) of size 3:

+
+
>>> np.random.choice(5, 3, p=[0.1, 0, 0.3, 0.6, 0])
+array([3, 3, 0])
+
+

Generate a uniform random sample from np.arange(5) of size 3 without replacement:

+
+
>>> np.random.choice(5, 3, replace=False)
+array([3,1,0])
+>>> #This is equivalent to np.random.permutation(np.arange(5))[:3]
+
+

Generate a non-uniform random sample from np.arange(5) of size 3 without replacement:

+
+
>>> np.random.choice(5, 3, replace=False, p=[0.1, 0, 0.3, 0.6, 0])
+array([2, 3, 0])
+
+

Any of the above can be repeated with an arbitrary array-like instead of just integers. For instance:

+
+
>>> aa_milne_arr = [‘pooh‘, ‘rabbit‘, ‘piglet‘, ‘Christopher‘]
+>>> np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3])
+array([‘pooh‘, ‘pooh‘, ‘pooh‘, ‘Christopher‘, ‘piglet‘],
+      dtype=‘|S11‘)
+
+

 

+
+

bytes(length)

+
+

返回随机字节。

+
+
>>> np.random.bytes(10)
+‘ eh\x85\x022SZ\xbf\xa4‘ #random
+
+

 

+
+
+
+

排列

+ + + + + + + + + + + +
+

shuffle(x)

+
+

现场修改序列,改变自身内容。(类似洗牌,打乱顺序)

+
+
>>> arr = np.arange(10)
+>>> np.random.shuffle(arr)
+>>> arr
+[1 7 5 2 9 4 3 6 0 8]
+
+

 

+

This function only shuffles the array along the first index of a multi-dimensional array:

+
+
>>> arr = np.arange(9).reshape((3, 3))
+>>> np.random.shuffle(arr)
+>>> arr
+array([[3, 4, 5],
+       [6, 7, 8],
+       [0, 1, 2]])
+
+

 

+
+

permutation(x)

+
+

返回一个随机排列

+
+
>>> np.random.permutation(10)
+array([1, 7, 4, 3, 0, 9, 2, 5, 8, 6])
+
+
+
>>> np.random.permutation([1, 4, 9, 12, 15])
+array([15,  1,  9,  4, 12])
+
+
+
>>> arr = np.arange(9).reshape((3, 3))
+>>> np.random.permutation(arr)
+array([[6, 7, 8],
+       [0, 1, 2],
+       [3, 4, 5]])
+
+

 

+
+
+
+

分布

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

beta(a, b[, size])

+
贝塔分布样本,在 [0, 1]内。
+

binomial(n, p[, size])

+
二项分布的样本。
+

chisquare(df[, size])

+
卡方分布样本。
+

dirichlet(alpha[, size])

+
狄利克雷分布样本。
+

exponential([scale, size])

+
指数分布
+

f(dfnum, dfden[, size])

+
F分布样本。
+

gamma(shape[, scale, size])

+
伽马分布
+

geometric(p[, size])

+
几何分布
+

gumbel([loc, scale, size])

+
耿贝尔分布。
+

hypergeometric(ngood, nbad, nsample[, size])

+
超几何分布样本。
+

laplace([loc, scale, size])

+
拉普拉斯或双指数分布样本
+

logistic([loc, scale, size])

+
Logistic分布样本
+

lognormal([mean, sigma, size])

+
对数正态分布
+

logseries(p[, size])

+
对数级数分布。
+

multinomial(n, pvals[, size])

+
多项分布
+

multivariate_normal(mean, cov[, size])

+
+

多元正态分布。

+
+
>>> mean = [0,0]
+>>> cov = [[1,0],[0,100]] # diagonal covariance, points lie on x or y-axis
+
+
+
>>> import matplotlib.pyplot as plt
+>>> x, y = np.random.multivariate_normal(mean, cov, 5000).T
+>>> plt.plot(x, y, ‘x‘); plt.axis(‘equal‘); plt.show()
+
+

 

+
+

negative_binomial(n, p[, size])

+
负二项分布
+

noncentral_chisquare(df, nonc[, size])

+
非中心卡方分布
+

noncentral_f(dfnum, dfden, nonc[, size])

+
非中心F分布
+

normal([loc, scale, size])

+
+

正态(高斯)分布

+

Notes

+

The probability density for the Gaussian distribution is

+
+

技术分享

+
+

where 技术分享 is the mean and 技术分享 the standard deviation. The square of the standard deviation, 技术分享, is called the variance.

+

The function has its peak at the mean, and its “spread” increases with the standard deviation (the function reaches 0.607 times its maximum at 技术分享 and 技术分享 [R217]).

+

 

+

Examples

+

Draw samples from the distribution:

+
+
>>> mu, sigma = 0, 0.1 # mean and standard deviation
+>>> s = np.random.normal(mu, sigma, 1000)
+
+

Verify the mean and the variance:

+
+
>>> abs(mu - np.mean(s)) < 0.01
+True
+>>> abs(sigma - np.std(s, ddof=1)) < 0.01
+True
+
+

Display the histogram of the samples, along with the probability density function:

+
+
>>> import matplotlib.pyplot as plt
+>>> count, bins, ignored = plt.hist(s, 30, normed=True)
+>>> plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *
+...                np.exp( - (bins - mu)**2 / (2 * sigma**2) ),
+...          linewidth=2, color=‘r‘)
+>>> plt.show()
+
+

 

+
+

pareto(a[, size])

+
帕累托(Lomax)分布
+

poisson([lam, size])

+
泊松分布
+

power(a[, size])

+
Draws samples in [0, 1] from a power distribution with positive exponent a - 1.
+

rayleigh([scale, size])

+
Rayleigh 分布
+

standard_cauchy([size])

+
标准柯西分布
+

standard_exponential([size])

+
标准的指数分布
+

standard_gamma(shape[, size])

+
标准伽马分布
+

standard_normal([size])

+
标准正态分布 (mean=0, stdev=1).
+

standard_t(df[, size])

+
Standard Student’s t distribution with df degrees of freedom.
+

triangular(left, mode, right[, size])

+
三角形分布
+

uniform([low, high, size])

+
均匀分布
+

vonmises(mu, kappa[, size])

+
von Mises分布
+

wald(mean, scale[, size])

+
瓦尔德(逆高斯)分布
+

weibull(a[, size])

+
Weibull 分布
+

zipf(a[, size])

+
齐普夫分布
+
+

随机数生成器

+ + + + + + + + + + + + + + + + + + + +
+

RandomState

+
Container for the Mersenne Twister pseudo-random number generator.
+

seed([seed])

+
Seed the generator.
+

get_state()

+
Return a tuple representing the internal state of the generator.
+

set_state(state)

+
Set the internal state of the generator from a tuple.
+
\ No newline at end of file diff --git a/aa.jpg b/aa.jpg new file mode 100644 index 00000000..576b31a5 Binary files /dev/null and b/aa.jpg differ diff --git a/信息系统集成/第2章 智能系统中的弱电系统.md b/信息系统集成/第2章 智能系统中的弱电系统.md deleted file mode 100644 index 7f25cda7..00000000 --- a/信息系统集成/第2章 智能系统中的弱电系统.md +++ /dev/null @@ -1,8 +0,0 @@ -# 智能系统中的弱电系统 - -## 弱电系统与物联网 - -* 直流1.5V$\sim$ 36V -* - -## \ No newline at end of file diff --git a/信息系统集成/第2章 综合布线图的工程技术.md b/信息系统集成/第2章 综合布线图的工程技术.md deleted file mode 100644 index 27677425..00000000 --- a/信息系统集成/第2章 综合布线图的工程技术.md +++ /dev/null @@ -1,3 +0,0 @@ -# 综合布线图的工程技术 - -## \ No newline at end of file diff --git a/信息系统集成/课程概要.md b/信息系统集成/课程概要.md deleted file mode 100644 index 5ab8fed1..00000000 --- a/信息系统集成/课程概要.md +++ /dev/null @@ -1,22 +0,0 @@ -# 课程概要 - -## 课程安排 - -## 考核标准 - -### 1+4+1(1个投名状4个单元作业1考试) - - -* 投名状作业:提交一份设计图及项目说明。投名状啥的。路线图、结构图。 -* 每个单元一个可选的作业:设计布线图,户型图+智慧家居的布线图+或者+综述性作业 - * 每个单元包含一个设计作业。共4个设计作业,选三个完成设计作业。 - * 选一个单元,综合成一篇论文。 - -* 作业提交eai2019@126.com - -## 主要内容 - - 1. 物联网 - 2. 网络 - 3. 分析设计 - 4. 大数据后端 diff --git a/工作日志/2020年9月10日.md b/工作日志/2020年9月10日.md deleted file mode 100644 index 32c6af8b..00000000 --- a/工作日志/2020年9月10日.md +++ /dev/null @@ -1 +0,0 @@ -## \ No newline at end of file diff --git a/工作日志/2020年9月14日.md b/工作日志/2020年9月14日.md index 78472100..4e8385e4 100644 --- a/工作日志/2020年9月14日.md +++ b/工作日志/2020年9月14日.md @@ -1,4 +1,3 @@ -今天要做的事情: # 主机配置-服务器搭建 ## 需要了解的事情 diff --git a/工作日志/2020年9月28日.md b/工作日志/2020年9月28日.md new file mode 100644 index 00000000..caf04c51 --- /dev/null +++ b/工作日志/2020年9月28日.md @@ -0,0 +1,24 @@ +# 学习安排 +## 具体的学习计划 + +* 每天早上:一周的课程python实现 +* 每天下午:一周的课程python实现 +* 每天晚上:阅读论文并总结。 + + + +## 方法 +1. 涉及到基础知识进行补充,例如线性代数 +2. 涉及到的编程知识进行补充,例如Numpy、scikitlearn、scipy等。 + + +也就是说,现在要同时学习三个东西。机器学习,机器学习依赖的数学基础,机器学习实现的编程基础。降低速度,尽量在一个月内,实现初步认知。 +## 补充 +应该对matplotlib和scipy的教程进行补充。教程部分只完成简单的说明即可。所有的例子,手动运行敲一遍。教程该出简单的实例,然后手动实现实例。 + +具体的内容,等到实践过程中进行学习。 + + + + + diff --git a/工作日志/2020年9月29日.md b/工作日志/2020年9月29日.md new file mode 100644 index 00000000..d8fc65ef --- /dev/null +++ b/工作日志/2020年9月29日.md @@ -0,0 +1,16 @@ +# 组会的PPT结构 + +## 情报利用的现状 + +## 联邦学习的现状 + +## 机器学习在情报利用领域可能的应用路径 + +## 拟打算应用的机器学习算法 + +## 面临的难题 + +## 解决问题的具体规划 + +## 最近做的界面的事情 + diff --git a/工作日志/2020年9月30日.md b/工作日志/2020年9月30日.md new file mode 100644 index 00000000..ac048d4e --- /dev/null +++ b/工作日志/2020年9月30日.md @@ -0,0 +1 @@ +# 看论文工具与方法 \ No newline at end of file diff --git a/工作日志/2020年9月3日.md b/工作日志/2020年9月3日.md index 4a1a3d79..b02bdb6d 100644 --- a/工作日志/2020年9月3日.md +++ b/工作日志/2020年9月3日.md @@ -1,3 +1,4 @@ +# 情报威胁与联邦学习 ## 研究方向 * 情报威胁----定义系统的应用场景,包括输入输出。 diff --git a/工作日志/2020年9月4日.md b/工作日志/2020年9月4日.md index 169358e7..8ada0b6f 100644 --- a/工作日志/2020年9月4日.md +++ b/工作日志/2020年9月4日.md @@ -1,3 +1,4 @@ +# 供应链金融 ## 时间安排 上午:完成供应链金融的调查报告 diff --git a/工作日志/2020年9月6日.md b/工作日志/2020年9月6日.md index 0ca6756d..38167e10 100644 --- a/工作日志/2020年9月6日.md +++ b/工作日志/2020年9月6日.md @@ -1,12 +1,20 @@ -当前的主要任务: +# 机器学习 +## 当前的主要任务: 现在处在研究的第一和第二阶段。关于第一阶段联邦学习的应用场景,主要由蒋师兄完成。第二阶段,学习联邦学习关联的基础知识,为第三阶段机器学习算法的实现和框架的搭建做好准备。 看完相关的文章和博客。然后开始学习,用两周时间学习完成基础知识。在学习基础知识的时候,使用tensorflow框架进行算法的运行。 +------------------- +## 长久的时间计划: +* 必须在十一月份之前完成学习工作。那就到10月30号把。还有五本需要看的书。10月30号之前,完全搞懂该领域的内容。 +* 十一月份,进行调研,寻找大量相关的研究工作。 +* 十二月份,对相关领域的算法进行实现。对算法进行改进。 + +> 感觉时间不够了啊,兄弟。你这需要做的事情有点多。国庆节,尽量恶补完成大部分机器学习的基础知识和主要的算法,然后国庆节后开始看论文。 -------------- -学习路线 +## 学习路线 ### Python系列(一周) diff --git a/工作日志/2020年9月9日.md b/工作日志/2020年9月9日.md index 51dbcf0c..70162b69 100644 --- a/工作日志/2020年9月9日.md +++ b/工作日志/2020年9月9日.md @@ -45,7 +45,7 @@ easy-window小程序。 ### 工程部署,使用nodejs封装工具发布。 * 使用electron-package对工程进行打包√ -* 使用electron-build或者electron-asar对工程进行发布。创建安装程序。 +* 使用electron-build或者electron-asar对工程进行发布。创建安装程序。√ ## 3 解决的bug问题 diff --git a/工作日志/总结.md b/工作日志/总结.md new file mode 100644 index 00000000..33351ef7 --- /dev/null +++ b/工作日志/总结.md @@ -0,0 +1,21 @@ +## 第一周(9.1-9.6) +* 阅读漏洞利用的相关知识,证明了漏洞利用的不可行。 +* 更换了开题的方向,转向联邦学习 + +## 第二周(9.7-9.13) + +* 对联邦学习进行了一周的调研,了解了联邦学习是什么。 +* 对情报利用的方式进行了讨论,对情报可能的利用方向进行了总结。 +* 与公司进行对话,了解了情报利用利于相关的内容。 + + +## 第三周(9.14-9.20) +* 完成了界面设计的一套方案。nodejs-electron-html/js/css-Cmake(make),打通了界面设计的技术路径。 + +## 第四周(9.21-9.27) +* 机器学习任务的开始。明确了机器学习的学习路径。 +* 完成了python3-numpy-scipy-matplotlib-pandas机器学习系列工具的学习。需要通过具体的编程项目进行熟练。 + +## 第五周(9.28-10.4) +* 吴恩达课程完成。 +* 机器学习相关工具的熟练。 \ No newline at end of file diff --git a/机器学习/PPT/Lecture1.pdf b/机器学习/PPT/Lecture1.pdf new file mode 100644 index 00000000..0d2f96eb Binary files /dev/null and b/机器学习/PPT/Lecture1.pdf differ diff --git a/机器学习/PPT/Lecture10.pdf b/机器学习/PPT/Lecture10.pdf new file mode 100644 index 00000000..5dcd8a63 Binary files /dev/null and b/机器学习/PPT/Lecture10.pdf differ diff --git a/机器学习/PPT/Lecture11.pdf b/机器学习/PPT/Lecture11.pdf new file mode 100644 index 00000000..68fef894 Binary files /dev/null and b/机器学习/PPT/Lecture11.pdf differ diff --git a/机器学习/PPT/Lecture12.pdf b/机器学习/PPT/Lecture12.pdf new file mode 100644 index 00000000..fb218987 Binary files /dev/null and b/机器学习/PPT/Lecture12.pdf differ diff --git a/机器学习/PPT/Lecture13.pdf b/机器学习/PPT/Lecture13.pdf new file mode 100644 index 00000000..16e5aa86 Binary files /dev/null and b/机器学习/PPT/Lecture13.pdf differ diff --git a/机器学习/PPT/Lecture14.pdf b/机器学习/PPT/Lecture14.pdf new file mode 100644 index 00000000..eb69f47e Binary files /dev/null and b/机器学习/PPT/Lecture14.pdf differ diff --git a/机器学习/PPT/Lecture15.pdf b/机器学习/PPT/Lecture15.pdf new file mode 100644 index 00000000..3871e0ce Binary files /dev/null and b/机器学习/PPT/Lecture15.pdf differ diff --git a/机器学习/PPT/Lecture16.pdf b/机器学习/PPT/Lecture16.pdf new file mode 100644 index 00000000..cea150ba Binary files /dev/null and b/机器学习/PPT/Lecture16.pdf differ diff --git a/机器学习/PPT/Lecture17.pdf b/机器学习/PPT/Lecture17.pdf new file mode 100644 index 00000000..105ad572 Binary files /dev/null and b/机器学习/PPT/Lecture17.pdf differ diff --git a/机器学习/PPT/Lecture18.pdf b/机器学习/PPT/Lecture18.pdf new file mode 100644 index 00000000..65eb8410 Binary files /dev/null and b/机器学习/PPT/Lecture18.pdf differ diff --git a/机器学习/PPT/Lecture2.pdf b/机器学习/PPT/Lecture2.pdf new file mode 100644 index 00000000..720c3a95 Binary files /dev/null and b/机器学习/PPT/Lecture2.pdf differ diff --git a/机器学习/PPT/Lecture3.pdf b/机器学习/PPT/Lecture3.pdf new file mode 100644 index 00000000..d4bd4f07 Binary files /dev/null and b/机器学习/PPT/Lecture3.pdf differ diff --git a/机器学习/PPT/Lecture4.pdf b/机器学习/PPT/Lecture4.pdf new file mode 100644 index 00000000..9b763d67 Binary files /dev/null and b/机器学习/PPT/Lecture4.pdf differ diff --git a/机器学习/PPT/Lecture5.pdf b/机器学习/PPT/Lecture5.pdf new file mode 100644 index 00000000..995b7099 Binary files /dev/null and b/机器学习/PPT/Lecture5.pdf differ diff --git a/机器学习/PPT/Lecture6.pdf b/机器学习/PPT/Lecture6.pdf new file mode 100644 index 00000000..aba6d804 Binary files /dev/null and b/机器学习/PPT/Lecture6.pdf differ diff --git a/机器学习/PPT/Lecture7.pdf b/机器学习/PPT/Lecture7.pdf new file mode 100644 index 00000000..2a3d04a5 Binary files /dev/null and b/机器学习/PPT/Lecture7.pdf differ diff --git a/机器学习/PPT/Lecture8.pdf b/机器学习/PPT/Lecture8.pdf new file mode 100644 index 00000000..44e16f30 Binary files /dev/null and b/机器学习/PPT/Lecture8.pdf differ diff --git a/机器学习/PPT/Lecture9.pdf b/机器学习/PPT/Lecture9.pdf new file mode 100644 index 00000000..ab810c0a Binary files /dev/null and b/机器学习/PPT/Lecture9.pdf differ diff --git a/机器学习/img/gradient.png b/机器学习/img/gradient.png new file mode 100644 index 00000000..2b1f00d5 Binary files /dev/null and b/机器学习/img/gradient.png differ diff --git a/机器学习/机器学习实战/01matplot3D图像.py b/机器学习/机器学习实战/01matplot3D图像.py new file mode 100644 index 00000000..da3741dc --- /dev/null +++ b/机器学习/机器学习实战/01matplot3D图像.py @@ -0,0 +1,21 @@ +# 使用numpy实现线性回归 +import numpy as np +import matplotlib.pyplot as plt + + +# 尝试使用matplot画了一个三维图像。 +x_1 = np.arange(0,10,0.1) +x_1 = np.expand_dims(x_1,0) +x_1 = np.repeat(x_1,100,axis=0) +x_2= np.arange(0,10,0.1) +x_2 = np.expand_dims(x_2,1) +x_2 = np.repeat(x_2,100,axis=1) + +y = ((x_1+x_2-10)**2) + +print(x_1.flatten()) +ax = plt.axes(projection='3d') + +ax.scatter3D(x_1.flatten(),x_2.flatten(),y.flatten(),c=y, cmap='Greens') + +plt.show() diff --git a/机器学习/机器学习实战/02线性回归尝试.py b/机器学习/机器学习实战/02线性回归尝试.py new file mode 100644 index 00000000..b33803eb --- /dev/null +++ b/机器学习/机器学习实战/02线性回归尝试.py @@ -0,0 +1,26 @@ +# 吴恩达线性回归第一部分 +# 这是第一个线性回归(机器学习算法)用来预测房价,感觉有点神奇。 +import numpy as np + +# 构造了样本数据集 +x = np.arange(0,100,1) +loss = np.random.rand(100)-0.5 +y = 2*x+6+loss + +# 对样本数据集进行线性回归y=a0+a1x +# 给出参数的初始值 +a0 = -10 +a1 = -10 +w = 0.0001 # 表示梯度下降速度 + +# 对a0进行梯度下降 + +for i in range(1000): + a0 = a0-100*w*(1/100)*np.sum(a0+a1*x-y) + a1 = a1-w*(1/100)*np.sum((a0+a1*x-y)*x) + +print(a0,a1) + + + + diff --git a/机器学习/机器学习课程/first.py b/机器学习/机器学习课程/first.py deleted file mode 100644 index 864d9bfe..00000000 --- a/机器学习/机器学习课程/first.py +++ /dev/null @@ -1,3 +0,0 @@ -# 用来实现吴恩达的机器学习课程 - - diff --git a/机器学习/机器学习课程/机器学习基础.md b/机器学习/机器学习课程笔记/机器学习基础.md similarity index 98% rename from 机器学习/机器学习课程/机器学习基础.md rename to 机器学习/机器学习课程笔记/机器学习基础.md index 331a8734..e048f208 100644 --- a/机器学习/机器学习课程/机器学习基础.md +++ b/机器学习/机器学习课程笔记/机器学习基础.md @@ -1,3 +1,4 @@ +## 机器学习分类 * 有监督的学习:给出了正确答案 * 回归问题:预测连续的数值输出。(输出是连续的,一条曲线) * 分类问题:预测离散的值输出。(输出局限于几个类别,有界离散的输出) @@ -7,14 +8,6 @@ * 聚类问题:将相同主体的新闻聚集到一块。社交网络划分为不同的圈子。结果不是事先给出的,通过机器学习,发现数据的内部结构。 - - - - - - - - ## 典型问题 * 房屋面积-房屋价格:回归问题 diff --git a/机器学习/机器学习课程笔记/线性回归.md b/机器学习/机器学习课程笔记/线性回归.md new file mode 100644 index 00000000..b9af37bd --- /dev/null +++ b/机器学习/机器学习课程笔记/线性回归.md @@ -0,0 +1,50 @@ +# 线性回归 + +## 房价问题 +* 数据集构成 + * 训练集 + * 样本数量m + * 样本特征$x_i$ + * 目标变量y + + + +## 假设函数 + * 假设函数 + $$h(x)=\theta_0+\theta_1 x$$ + * 模型参数$\theta_0,\theta_1$ +## 代价函数 + * 损失函数、代价函数(loss/cost function):平方误差代价函数 + +$$ +J(\theta_0,\theta_1)=\frac{1}{2m}\sum_1^m(h(x_i)-y_i)^2 +$$ + * 目标函数: +$$ +minimize_{\theta_0,\theta_1} J(\theta_0,\theta_1) +$$ + +## 梯度下降 + +* 目标 + +$$ +min_{\theta_1,\theta_2,\dots}J(\theta_1,\theta_2,\dots) +$$ +* 给定$\theta$的初始值。不断修改$\theta$的值,使代价函数最小。统计学上使用全局的最小二乘法实现参数估计,计算机科学上使用局部迭代的梯度下降算法实现参数估计。 +* 梯度下降算法的公式 + +$$ +\theta_j = \theta_j - \alpha\frac{\partial}{\partial \theta_j}J(\theta_1,\theta_2,\dots) +$$ +* 吴恩达给出了梯度下降函数的解释,当导数为正时,表示函数递增,此时自变量减去一个正值,自变量减小,函数值下降。当导数为负时,表示函数递减,此时自变量减去一个负值,自变量增加,函数值增加。 + +## batch梯度下降 + +* 每一步都遍历了样本中所有的数据。 + +## 梯度下降算法与最小二乘法区别 + +* 给出假设函数(这是拟合的函数) +* 使用最小二乘算法进行参数估计。这个是统计学的方法,利用样本的统计学特征,一次性全局计算准确的最小损失函数。 +* 使用梯度下降算法,进行参数估计。这是一个迭代的方法,利用每一条数据,更新参数。 \ No newline at end of file diff --git a/程序设计语言原理/image/chomsky文法的关系.png b/程序设计语言原理/image/chomsky文法的关系.png deleted file mode 100644 index 2df35d01..00000000 Binary files a/程序设计语言原理/image/chomsky文法的关系.png and /dev/null differ diff --git a/程序设计语言原理/image/发展历史.png b/程序设计语言原理/image/发展历史.png deleted file mode 100644 index 80628aca..00000000 Binary files a/程序设计语言原理/image/发展历史.png and /dev/null differ diff --git a/程序设计语言原理/image/词法分析.png b/程序设计语言原理/image/词法分析.png deleted file mode 100644 index d3a21c26..00000000 Binary files a/程序设计语言原理/image/词法分析.png and /dev/null differ diff --git a/程序设计语言原理/image/语法分析图.png b/程序设计语言原理/image/语法分析图.png deleted file mode 100644 index 00947c81..00000000 Binary files a/程序设计语言原理/image/语法分析图.png and /dev/null differ diff --git a/程序设计语言原理/第0章 概论.md b/程序设计语言原理/第0章 概论.md deleted file mode 100644 index 08e55d02..00000000 --- a/程序设计语言原理/第0章 概论.md +++ /dev/null @@ -1,42 +0,0 @@ -# 绪论 - -## 1 语言 - -### 语言的一般特性 -* 媒体性 -* 规范性 -* 演进性 -* 抽象性 -* 冗余多义性 - -### 程序设计语言的特性 - -* 程序设计语言是人工语言 -* 主要通信对象是机器 -* 用于表达软件 - -### 程序设计语言的作用(为什么研究) - -* 计算机软硬件技术的窗口 -* 人们研究计算表达的形势 -* 它和计算机理论研究联系最为密切 -* 研究有利于与提高软件开发人员的素质 -* 有利于开发专用用语言或界面语言 -* 有利于新领域语言的发展 -* 有利于通用语言的标准化规范化 - -## 2 程序设计语言的定义与处理器 -> 一个程序设计语言的实际存在是《语言规格说明书》。一个程序设计语言的实际存在是改语言程序的处理器。 -### 解释器 -解释器读入一段相对完整源代码(多数情况下是一句)翻译为目标代码后,立即解释执行。 - -### 编译器 - -编译器读入一个独立的编译单元(程序的逻辑单元,如主程序 、函数,子程序。或若干个逻辑单元组成的编译单元,如文件、模块、包) 翻译为可执行的目标代码单元,经过连接必要的库支持例程成为可执行内存映象,加载到内存中运行,由于是按单元翻译,可以经过上下文分析作若干次优化,目标代码质量高。 - -### 元语言(metalanguage) - -表达每一个语法特征 -* 字符集、词条表由它们提供标识符、运算符、关键字、空格、限制符、各种数字量、字符串常量等语法概念。 -* 注释 注释符号之内(或以后)的符号串是为人们阅读,处理器要略去的。 -* 语法结构定义,定义以上符号组合的合法结构。它给出语句、表达式、程序单元、块(如FORTRAN的循环域)、作用域、嵌套与结合等语法概念。 diff --git a/程序设计语言原理/第10章 代数语义学.md b/程序设计语言原理/第10章 代数语义学.md deleted file mode 100644 index e69de29b..00000000 diff --git a/程序设计语言原理/第1章 历史.md b/程序设计语言原理/第1章 历史.md deleted file mode 100644 index 55bde9f6..00000000 --- a/程序设计语言原理/第1章 历史.md +++ /dev/null @@ -1,117 +0,0 @@ -# 发展与分类 - -## 1 历史 -![](\image/发展历史.png) - -### 程序设计语言简史 -* 1945 ENIAC 真空管计算机 -* 1946 冯诺依曼机构UNIVAC-1计算机 -* 50年代 FORTRAN ALGOL COBOL -* 60年代 APL SNOBOL LOGO PASCAL -* 70年代 C LISP Perlog Edison -* 80年代 面向对象Smalltalk C++ SQL - -## 2 分类 - -### 对机器依赖程度 - -* 低级语言:机器语言和汇编语言 -* 中级语言:编程操纵机器硬件,不涉及地址码和操作码。 -* 高级语言:独立于机器 - -### 应用领域 -* 商用语言 -* 科学计算 -* 系统程序设计 -* 模拟预演 -* 正文处理 -* 实时处理 -* 嵌入式应用 -* 人工智能应用 -* 查询和命令语言 -* 教学语言 -* 打印专用 -* 专用与某种数据结构 -``` -/* -引入外部文件进行构建 -能够定义文本的名字,实现文本与排版的分离 -能够进行文本与文本的嵌套,支持嵌套处理 -能够使用反斜杠转义特殊符号 -支持链式处理 -全局默认控制对象env -定义新的处理函数默认一个文本输入对象,默认一个文本输出对象。前边的函数可以覆盖处理前边的函数。内部函数的优先级更高。 -能够定义函数所处的模块。 -自顶向下的设计过程。从全局到局部。所以后边可以覆盖前边,细节覆盖总体布局。 -链式处理,是对原来文本的处理,不是生成新的文本 -定义引用,引用编号,自动引用 -*/ -import another_name.pp -import another_progrom.pp - -//paper 模块的leftboder函数 -env.paper.leftborder(29) - -textname={i am a good man} -textname.fix(delete) -text1,text2,text3.fix() -pic1,pic2.middle() - -{zhesh 'pic.hello()' iwe\alpha nben}.hello(middle,big).world(45size).print() - -def newp(hello,txt): - this is content -enddef -``` -### 实现计算方式 -* 编译型语言 -* 解释型语言 - -### 使用方式 -* 交互式语言 -* 非交互式语言 - -### 程序设计范型 -单范型语言:程序组织和实现计算的模式 -* 命令式语言 -* 面向对象语言 -* 数据流语言 -* 函数式语言 -* 逻辑式语言 -* 并发程序设计语言 - -多范型语言: -包含多种范型的程序设计语言。 - - - - -### 断代 - -* 第一代:机器语言 -* 第二代:汇编语言 -* 第三代:高级语言 -* 第四代:非过程语言 -* 第五代:自然语言(人工智能) - -## 3 形式语言与图灵机 - -### 形式语言特点 - -* 符号集 -* 转换规则 - -### 图灵机五元组 -$$(q_i,S_j,S_k,(R,L,N),q_j)$$ -机器当前状态读入$S_j$后写入$S_k$,进行操作$R/L/N$,转换为装填$q_j$。 - -### 指令系统 - -* CISC(reduced instruction set computer)。指令复杂,执行较慢。不利于大规模集成电路设计。 -* RISC(complex instruction set computer)。简化了指令系统,适合大规模集成电路设计。执行速度快。提供高级程序设计语言支持,简化了编程设计过程。 - -## 4 发展过程 - -* 汇编语言。与机器指令一一对应。 -* 虚拟机,在计算机机器语言之上,虚拟各种不同语言的计算机环境。 -* 语言要求:Go、Python、Scala。 diff --git a/程序设计语言原理/第2章 程序设计语言设计概述.md b/程序设计语言原理/第2章 程序设计语言设计概述.md deleted file mode 100644 index a8530fed..00000000 --- a/程序设计语言原理/第2章 程序设计语言设计概述.md +++ /dev/null @@ -1,274 +0,0 @@ -# 设计概述 - -## 1 表示与抽象 -### 表达与抽象的概念 -* 表示是对事物抽象的表达。 -* 抽象是对论题本质的提取。 -* 同一个事物在不同抽象层次上的表示。自然语言描述、高级语言表示、汇编语言表示、机器语言表示。 -* 上层抽象可以用多种下层抽象的实现。 -### 不同抽象层次 -* 客观世界自然语言描述 -* 数学模型数学语言描述 -* 程序设计程序语言描述 -* 机器指令机器语言描述 - - -### 显示表示和隐式表示 -* 显示表示float n=3.14指明n的类型。 -* 隐式表示 n=3.14缺省为浮点类型。 - -### 聚合表示和分散表示。 -* 分散表示。整型,浮点型等数据之间的+运算使用不同的运算符。 -* 聚合表示。所有类型的+运算都可以使用+运算符实现。或者同一个函数实现。 - -## 2 设计目标 - -### 具体目标 -定义一组能表示某种范型的特征集,每个特征有严格定义并可在机器上高效实现,程序员可灵活运用这些特征表达它所希望的任何计算。 - -### 评价标准 -* 模型有力 Model Power -* 语义清晰 Semantic Clarity -* 移植性好 Portability -* 可读性好 Readability -* 程序质量 Quality -* 安全性 -* 并发 -* 方便 Convenience -* 简单 Simplicity -* 高效 Efficiency -* 灵活性 Flexibility -* 可扩充性 Extensible -* 可重用性 Reusable - - -## 3 设计准则 - -### 具体准则 -* 频度准则:越常用越简单 -* 结构一致:程序结构和计算的逻辑结构一致,可读、方便 -* 局部性 Locality: - - 只有全局变量 Basic - - 不鼓励全局变量 Pascal, C - - 无全局变量函数式 Java -* 词法内聚 Lexical Coherence : 变量在使用处就近声明(Pascal 声明和语句严格分开) -* 语法一致性 -* 安全性Security -* 正交性和正规性 -* 数据隐藏。封装,以名字封装内部数据设计者可见使用者不可见 -* 抽象表达 - - -## 4 规格说明 - -### 概述 - -规格说明用来定义一个语言文本的语法和语义。用于表达程序设计语言的的语言成为元语言。 -* 形式语法:以形式结构规则的语言元素组合规则。 -* 微语法:词法Lexicon -* 宏语法:定义特征规则 - -### 字符集 -* 允许出现在语言的程序里出现的字符的全体 - - -### 词法分析 - -由程序的字符序列得到词法元素序列的过程就是词法分析。编译器处理表示源程序的字符序列,根据词法规则做词法分析,将 源程序切分为符合词法的段,识别出源程序的有意义单词(token) 。词法分析得到一个(表达被分析的源程序的)单词流,流中各单词 标明了词法类别。词法分析中抛弃所有无保留价值的分隔符(如空白符)和噪声词。 - -词法分析通常采用最长可能原则,确定可能成为单词的最长字符串。 - -词法分类主要包括以下内容 -* 标识符:文字形式的词法对象,用于表示程序对象的名字。 -* 关键字:语言规定了特殊意义的标识符 -* 运算符:有预定义意义的特殊字符或特殊字符序列 -* 分隔符:用于分隔程序里的不同词法元素的特殊符号或标识符。空格,换行和制表符等,通常作为语法元素的分隔符。 - -### 语法分析 - -* 语法分析定义 - -语法规定位于词法层次之上的程序结构。 - -语法用于确定一个输入序列是否合法的程序。程序存在多个不同层次的合法性问题: -– 局部结构 例:C程序里的if 之后是不是左括号,括号是否配对 -– 上下文关系 例:变量使用前是否有定义,使用是否符合类型的要求 -– 深层问题 例:使用变量的值之前,变量是否已经初始化 - -* 语法分析图 - -![](image/语法分析图.png) - -其中方框为非终结符,圆和椭圆形为终结符。箭头指向构造流向。每个非终结符又可开始一个语法图(一条产生式规则) 。与EBNF完全对应,[ ]以'短路'绕道表示,{ }以迥环表示,小圆弧是有意义的,表示流向。有的语法图在环线上注上数字表示最多转几次。 - -* 语法分析分类 - * “自顶向下” 释义则从文法的起始符开始,按可能产生的表达式寻 找语句相同的结构匹配。每一步都产生下一个可能的源符号串,找到再 往下走。 - * “由底向上”释义则相反,它先查找源代码的各个符号串,看它能 否匹配归结为产生式左边的非终结符,如果有含混则向前多读入k个符 号串,为此归约下去,一个短语一个短语,最后到达起始符号串,归约 的过程就形成了释义树。 - - -### 语义分析 -> 在最后再详细补充 - -程序通常要在计算机上执行,因此按照程序的运行步骤或操作来说明程序设计语言是很自然的,这就是所谓的操作语义学。大多数程序设计语言的非形式化语义都是用这种方式说明的。例如 Pascal中while命令的操作语义可说明如下: -``` -执行命令while E do C,其步骤为: - (1) 对表达式E求值,产生一个真假值。 - (2) 如果值为true,则执行命令C,然后从(1)开始重复。 - (3) 如果值为false,终止。 -``` - - -* 指称语义。为每个程序短语指派一数学实体(指称)为其意义。典型情况是将其输入映射为输出的函数。例如,一个表达式的指称是将环境和存储映射为值的函数。一个命令的指称是将环境、初始存储映射为最终存储的函数。 -``` - execute 〖while E do C〗 = - let execute-while env sto = - let truth-value tr=evaluate〖E〗 env sto in - if tr - then execute-while env (execute 〖C〗 env sto) - else sto - in - execute-while -``` -* 公理语义。它只定义证明规则(公理及推理规则),以此证明程序的某些性质。这些证明规则在某种意义上就是抽象的语义。公理语义主要用于程序验证,语言理解,语言规范/标准化等方面,对编译 、解释器的 没有直接的作用。把语言的公理描述看作是该语言的一个理论,该理论由三部分组成: - * 公理集 元语言描述的不加证明的公理集如:|- 0 succ 0 即自然数0的后继大于0是一个定理(由|-表示)也是一条公理。 - * 语法规划集 以它来确定什么是合式公式。 - * 推理规则集 从已确立的定理演绎新定理。 - -* 代数语义。代数语义把语义模型的集合看成是一个代数结构,模型簇 对应为代数系统。 - - -## 5 上下文无关文法 - -### 文法(Grammar) -文法可导出该语言所有可能的句子,形式地,一个文法G是一个四元组: -$$ -G=(S,N,T,P) -$$ -* 其中,T是终结符号串的有限集。 -* N是非终结符号串的有限集,是文法中提供的成分概念,相当于英语动词短语、名词短语或定语从句等句子成分的符号表示。 -* T∩N = Φ,即它们是不相交的。 -* S是起始符号串,S∈N。 -* P是产生式,一般形式是:α→β α,β∈(T∪N)*。“→”表示左端可推导出右端,如α→β,α→Υ,α→δ则可写为: α→β|Υ|δ - - -如果产生式将语言的非终结符中的每一个标记都推得为终结符号,则这一组产生式集即为该语言的全部文法。 - -### 文法的递归表示 - -文法的递归表示在形式文法中是必须的。例2-1 整数的产生式表示法: -``` -→0|1|2|3|4|5|6|7|8|9 - 一位数字是整数 - 两位数字也是整数 - n位数字也是整数 -可以写成: -|| -``` -> α→αβ是左递归产生式,而α→βα是右递归产生式,也叫尾递归的。不同型式的产生式决定了不同型式的文法。 - -### Chomsky文法 -> 希腊字母是终结符。大写字母是非终结符。 - -* **0型文法**如果对产生式α→β左端和右端不加任何限制: -``` -α∈(N∪T) ,β∈(N∪T)* -``` -这种文法对应的语言是递归可枚举语言。在编译理论中,图灵机(或双向下推机)可以识别这种语言。 - -* **1型文法**如果产生式形如: -``` -αAβ→αBβ α,β∈(N∪T)*, A∈N, B∈(N∪T) -``` -则叫做上下文相关文法,对应的语言是上下文敏感语言。线性有界自动机可识别这种语言。(因为左端含有非终结符,每一个推导式与左右两边的非终结符有关,所以是上下文有关文法) - -* **2型文法**如果产生式形如: -``` -A→α α∈ (N∪T)*, A∈N -``` -左端不含终结符且只有一个非终结符。这种文法叫上下文无关文法。对应的语言即上下文无关语言。非确定下推机能识别这种语言。 - -* 3型文法 如果产生式形如: -``` -A→ αB|Bα α∈T*, A,B ∈N -``` -左端不含终结符且只有一个非终结符。右端最多也只有一个非终结符且不在最左就在最右端。这种文法叫做正则文法,对应为正则语言。有限自动机可识别这种语言。显然,这种文法经置换可消除右端非终结符,使每一产生式均可用一终结符的正则表达式表达。 -例2-2 所有产生式的非终结符均可置换为终结符表达式。 -``` -设产生式是: -N={S,R, Q}, T={a,b,c} -P={S→Ra, S→Q, R→Qb, Q→c} -则有: -S→Ra→Qba→cba|S→Q→c -R→Qb→cb -Q→c -``` -![](image/chomsky文法的关系.png) - -### BNF和EBNF - -BNF就是上下文无关文法的表示法。 - -* ::= '定义为',即产生式中的“→”符号。 -* < > 表示所括符号串是非终结符号串。 -* | '或者'表示左右两边符号串序列是可替换的。终结符、关键字、标点符号直接写在产生式中。 - -BNF示例 -``` - ::= - | - ::= + - |- - | - ::= - | < digit> - | -``` - -增加更多内容 - -* "[ ]"表示括号内的内容是可选的。 -* "{ }"表示括号内的内容可重复0至多次。 -* "*"是指可以重复多次。 -* "+"是指可以出现多次 -* "?"意思是操作符左边的符号(或括号中的一组符号)是可选项(可以出现0到多次)。 -``` - ::= [ +|-] - ::= { | } - ::= - ::= { | < letter>}* -``` - -EBNF将BNF与正则表达式结合起来 - -* 其元语符号变动是: 增加[ ]、{ } 、( )(表示成组)、.(表示产生式终结)。[ ] 、{ } 意义同前,旨在消除或减少递归表达。 -* 取消非终结符的尖括号,至少是产生式左端,为此符号串中空白用'_'连接。 -* 为区别元符号和程序符号(程序中也有[ ]、 、()、.),程序中的终结符加引号,如'(', ')', '.'。 - -``` -program ::= ';' '.'. -program_heading ::= 'program' [ '(' ')']. -program_parameters ::= . -identifier_list ::= {',' } . -program_block ::= . -block ::= - - . -variable_declaration_part ::= ['var' ';' - { ';' }]. -variable_declaration ::= ';' . -statement_part ::= compound_statement. -compound_statement ::= 'begin' 'end'. -statement_sequence ::= {';' }. -statement::=[