Предмашинное обучение (5): освойте использование часто используемой библиотеки Matplotlib за 30 минут.

машинное обучение

Matplotlib — это библиотека для построения графиков Python, построенная на NumPy, инструменте для визуализации данных в машинном обучении.

Об этом мы говорили в предыдущей статьеИспользование NumPy, мы не будем обсуждать здесь соответствующие знания о NumPy.
Matplotlib обладает сильными инструментальными свойствами, что означает, что он предназначен только для моего использования, и нам не нужно тратить слишком много усилий на его доработку. Нам просто нужно знать, что он может делать, какую графику он может рисовать, и достаточно одного впечатления. То, что мы используем в реальном использовании, мы, естественно, станем опытными, когда будем использовать это, а функции, которые не используются, означают, что это бесполезно для вас.
ЭтоУчитесь по запросу. я здесь«Как стать программистом в десять раз быстрее»Аналогичная концепция упоминается здесь.

1. Обычное использование Matplotlib

1. Нарисуйте простое изображение

Берем самую распространенную функцию активации в машинном обученииsigmoidНапример, нарисуем.

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10,10,1000)
y = 1 / (1 + np.exp(-x))
plt.plot(x,y)
plt.show()

Формула для сигмоиды:y=f(x)=11+exy = f(x) =\frac{1}{1+e^{-x}}Метод plot() показывает тренды между переменными, а метод show() показывает графики.
Мы получаем изображение, как показано на рисунке:

2. Добавьте общие элементы

Мы добавляем некоторые справочные элементы, и объяснение каждой функции подробно отмечено в коде.

x = np.linspace(-10,10,1000)

#写入公式
y = 1 / (1 + np.exp(-x))

#x轴范围限制
plt.xlim(-5,5)

#y轴范围限制
plt.ylim(-0.2,1.2)

#x轴添加标签
plt.xlabel("X axis")

#y轴添加标签
plt.ylabel("Y axis")

#标题
plt.title("sigmoid function")

#设置网格,途中红色虚线
plt.grid(linestyle=":", color ="red")

#设置水平参考线
plt.axhline(y=0.5, color="green", linestyle="--", linewidth=2)

#设置垂直参考线
plt.axvline(x=0.0, color="green", linestyle="--", linewidth=2)

#绘制曲线
plt.plot(x,y)

#保存图像
plt.savefig("./sigmoid.png",format='png', dpi=300)

Приведенный выше код включает в себя ограничение диапазона осей X, Y, добавление заголовков и меток, настройку сеток, добавление направляющих, сохранение изображений и т. д.
Нарисуйте изображение следующим образом:

3. Нарисуйте несколько кривых

#生成均匀分布的1000个数值
x = np.linspace(-10,10,1000)

#写入sigmoid公式
y = 1 / (1 + np.exp(-x))
z = x**2
plt.xlim(-2,2)
plt.ylim(0,1)

#绘制sigmoid
plt.plot(x,y,color='#E0BF1D',linestyle='-', label ="sigmoid")

#绘制y=x*x
plt.plot(x,z,color='purple',linestyle='-.', label = "y=x*x")

#绘制legend,即下图角落的图例
plt.legend(loc="upper left")

#展示
plt.show()

Чтобы нарисовать несколько изображений, вы можете напрямую вызвать несколько plot() . Примечание: Если метод legend() не вызывается, легенда (легенда) в левом верхнем углу не рисуется. вcolorПараметры поддерживают шестнадцатеричное представление.

4. Знать рисунок (холст)

Во-первых, известный нам рисунок (канвас), как и легенда, о которой мы упоминали выше, — это отображение строк меток. Пунктирные линии, заключенные в сетку, являются направляющими сетки. Текстовые метки, такие как Title/x метка оси. Эта картинка помогает нам иметь ценностное представление о фигуре.

5. Рисование нескольких изображений

Фигуре может соответствовать несколько сюжетов, теперь попробуем нарисовать на фигуре несколько изображений.

x = np.linspace(-2*np.pi, 2*np.pi, 400)
y = np.sin(x**2)
z = 1 / (1 + np.exp(-x))
a = np.random.randint(0,100,400)
b = np.maximum(x,0.1*x)

#创建两行两列的子图像
fig, ax_list = plt.subplots(nrows=2, ncols=2)

# 'r-'其中r表示color=red,-表示linestyle='-'
ax_list[0][0].plot(x,y,'r-')
ax_list[0][0].title.set_text('sin')

ax_list[0][1].scatter(x,a,s=1)
ax_list[0][1].title.set_text('scatter')

ax_list[1][0].plot(x,b,'b-.')
ax_list[1][0].title.set_text('leaky relu')

ax_list[1][1].plot(x,z,'g')
ax_list[1][1].title.set_text('sigmoid')

#调整子图像的布局
fig.subplots_adjust(wspace=0.9,hspace=0.5)
fig.suptitle("Figure graphs",fontsize=16)

Среди них наиболее важным являетсяsubplotsметод, создаем часть изображения с 2 строками и 2 столбцами, а затем мы вызываем каждый метод рисования в ax_list. в'r-','b-.'Параметры являются аббревиатурами чертежей, и последующие параграфы аббревиатур параметров в этой статье будут объяснены отдельно.

6. Нарисуйте общие схемы

Мы часто используем графики для представления взаимосвязи между данными.Обычные графики включают гистограммы, гистограммы, круговые диаграммы, точечные диаграммы и так далее.

#使绘图支持中文
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
#创建两行两列的子图像
fig, [[ax1,ax2],[ax3,ax4],[ax5,ax6]] = plt.subplots(nrows=3, ncols=2,figsize=(8,8))

#绘制柱状图bar
value = (2, 3, 4, 1, 2)
index = np.arange(5)
ax1.bar(index, value,alpha=0.4, color='b')
ax1.set_xlabel('Group')
ax1.set_ylabel('Scores')
ax1.set_title('柱状图')

#绘制直方图histogram
h = 100 + 15 * np.random.randn(437)
ax2.hist(h, bins=50)
ax2.title.set_text('直方图')

#绘制饼图pie
labels = 'Frogs', 'Cai', 'Yongji', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)
ax3.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
        shadow=True, startangle=90)
ax3.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
ax3.title.set_text('饼图')

#绘制棉棒图stem
x = np.linspace(0.5, 2*np.pi, 20)
y = np.random.randn(20)
ax4.stem(x,y, linefmt="-.", markerfmt="o", basefmt='-')
ax4.set_title("棉棒图")

#绘制气泡图scatter
a = np.random.randn(100)
b = np.random.randn(100)
ax5.scatter(a, b, s=np.power(2*a+4*b,2), c=np.random.rand(100), cmap=plt.cm.RdYlBu, marker="o")

#绘制极线图polar
fig.delaxes(ax6)

ax6 = fig.add_subplot(236, projection='polar')
#ax6 = fig.add_subplot(2,3,6, projection='polar')#2行,3列,第6个图
r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r
ax6.plot(theta, r)
ax6.set_rmax(2)
ax6.set_rticks([0.5, 1, 1.5, 2])  # Less radial ticks
ax6.set_rlabel_position(-22.5)  # Move radial labels away from plotted line
ax6.grid(True)

#调整子图像的布局
fig.subplots_adjust(wspace=1,hspace=1.2)
fig.suptitle("图形绘制",fontsize=16)

Нарисуйте изображение следующим образом:

7. Сокращение параметра

Так как matplotlib поддерживает аббревиатуры параметров, я считаю необходимым вынести это отдельно и рассказать о представлении аббревиатуры каждого параметра.

x = np.linspace(-10,10,20)
y = 1 / (1 + np.exp(-x))
plt.plot(x,y,c='k',ls='-',lw=5, label ="sigmoid", marker="o", ms=15, mfc='r')
plt.legend()

Нарисуйте изображение следующим образом:

7.1 c означает цвет (цвет)

персонаж цвет
«б» blue
'г' green
'р' red
'с' cyan
«м» magenta
'у' yellow
«к» black
'ж' white

7,2 ls обозначает стиль линии (стиль линии)

персонаж описывать
'-' solid line style
'--' dashed line style
'-.' dash-dot line style
':' dotted line style
'.' point marker
',' pixel marker
'o' circle marker
'v' triangle_down marker
'^' triangle_up marker
'<' triangle_left marker
'>' triangle_right marker
'1' tri_down marker
'2' tri_up marker
'3' tri_left marker
'4' tri_right marker
's' square marker
'p' pentagon marker
'*' star marker
'h' hexagon1 marker
'H' hexagon2 marker
'+' plus marker
'x' x marker
'D' diamond marker
'd' thin_diamond marker
'|' vline marker
'_' hline marker

7.3 маркер (стиль маркера)

Стили обозначений показаны ниже:

7.4 Другие сокращения

  1. lwПредставляет ширину линии (ширину линии), например: lw=2,5
  2. msПредставляет markersize (размер маркера), например: ms=5
  3. mfcПредставляет markerfacecolor (цвет маркера), например: mfc='red'

2. Расширенное использование Matplotlib

1. Добавьте текстовые заметки

Мы можем добавить текст, стрелки и другие аннотации на холст (рисунок), чтобы сделать представление изображения более четким и точным.
мы называемannotateметод рисования аннотаций.

fig, ax = plt.subplots(figsize=(8, 8))

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)

# 绘制一条曲线
line, = ax.plot(t, s)

#添加注释
ax.annotate('figure pixels',
            xy=(10, 10), xycoords='figure pixels')
ax.annotate('figure points',
            xy=(80, 80), xycoords='figure points')
ax.annotate('figure fraction',
            xy=(.025, .975), xycoords='figure fraction',
            horizontalalignment='left', verticalalignment='top',
            fontsize=20)

#第一个箭头
ax.annotate('point offset from data',
            xy=(2, 1), xycoords='data',
            xytext=(-15, 25), textcoords='offset points',
            arrowprops=dict(facecolor='black', shrink=0.05),
            horizontalalignment='right', verticalalignment='bottom')

#第二个箭头
ax.annotate('axes fraction',
            xy=(3, 1), xycoords='data',
            xytext=(0.8, 0.95), textcoords='axes fraction',
            arrowprops=dict(facecolor='black', shrink=0.05),
            horizontalalignment='right', verticalalignment='top')

ax.set(xlim=(-1, 5), ylim=(-3, 5))

Нарисуйте изображение следующим образом:

2. Рисование 3D-изображений

Для рисования 3D-изображений требуется импортAxes3Dбиблиотека.

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np


fig = plt.figure(figsize=(15,15))
ax = fig.gca(projection='3d')

# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)

# Customize the z axis.
ax.set_zlim(-1.01, 1.01)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

# Add a color bar which maps values to colors.
fig.colorbar(surf, shrink=0.5, aspect=5)

вcmapЭто означает цветовую карту, которая используется для рисования цветового распределения, градиентных цветов и т. д.cmapобычно подходятcolorbarИспользуйте , чтобы нарисовать цветовую полосу изображения.

3. Импорт изображений (цены на жилье в Калифорнии)

вводитьmpimgбиблиотека для импорта изображений.
В качестве примера мы возьмем данные о ценах на жилье в Калифорнии, импортируем данные о ценах на жилье в Калифорнии, чтобы нарисовать точечную диаграмму, и импортируем изображения карты Калифорнии, чтобы просмотреть данные о широте и долготе карты, соответствующие ценам на жилье. Также с помощью цветовой шкалы нарисуйте тепловое изображение.
код показывает, как показано ниже:

import os
import urllib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

#加州房价数据(大家不用在意域名)
housing = pd.read_csv("http://blog.caiyongji.com/assets/housing.csv")
#加州地图
url = "http://blog.caiyongji.com/assets/california.png"
urllib.request.urlretrieve("http://blog.caiyongji.com/assets/california.png", os.path.join("./", "california.png"))
california_img=mpimg.imread(os.path.join("./", "california.png"))

#根据经纬度绘制房价散点图
ax = housing.plot(kind="scatter", x="longitude", y="latitude", figsize=(10,7),
                       s=housing['population']/100, label="Population",
                       c="median_house_value", cmap=plt.get_cmap("jet"),
                       colorbar=False, alpha=0.4,
                      )
plt.imshow(california_img, extent=[-124.55, -113.80, 32.45, 42.05], alpha=0.5,
           cmap=plt.get_cmap("jet"))
plt.ylabel("Latitude", fontsize=14)
plt.xlabel("Longitude", fontsize=14)

prices = housing["median_house_value"]
tick_values = np.linspace(prices.min(), prices.max(), 11)

#颜色栏,热度地图
cbar = plt.colorbar(ticks=tick_values/prices.max())
cbar.ax.set_yticklabels(["$%dk"%(round(v/1000)) for v in tick_values], fontsize=14)
cbar.set_label('Median House Value', fontsize=16)
v
plt.legend(fontsize=16)

Нарисуйте изображение следующим образом:
Красный — дорогой, синий — дешевый, размер круга указывает на численность населения.

4. Нарисуйте контурные линии

Контуры полезны для рисования трехмерных изображений в двухмерном пространстве.

def f(x, y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)

X, Y = np.meshgrid(x, y)
Z = f(X, Y)
plt.contourf(X, Y, Z, 20, cmap='RdGy')
plt.colorbar()

Нарисуйте изображение следующим образом:
Черные области — пики, красные области — долины.

рисовать анимацию

Необходимо ввести анимацию рисованияanimationбиблиотека, по телефонуFuncAnimationспособ реализации анимации рисования.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
line, = ax.plot([], [], lw=2)

# 初始化方法
def init():
    line.set_data([], [])
    return line,

# 数据更新方法,周期性调用
def animate(i):
    x = np.linspace(0, 2, 1000)
    y = np.sin(2 * np.pi * (x - 0.01 * i))
    line.set_data(x, y)
    return line,

#绘制动画,frames帧数,interval周期行调用animate方法
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=200, interval=20, blit=True)
anim.save('ccccc.gif', fps=30)

plt.show()

в приведенном выше кодеanim.save()Метод поддерживает сохранение файлов формата mp4.
Нарисуйте анимацию следующим образом:

Эпилог

На этом серия предварительного машинного обучения завершена, и мы полностью готовы к мобильному машинному обучению. Посмотреть полныйСерия «Предмашинное обучение»Пожалуйста, обратите внимание на публичный аккаунт [caiyongji] или посетите мой личный блогblog.caiyongji.comОбновление синхронизации.
Как вы могли заметить, мои уроки более практичны. Следующая серия руководств по машинному обучению также будет больше ориентирована на практическое использование, а не на теоретическое направление.

Студенты, которые боятся математики, не паникуйте, просто следуйте за мной и учитесь медленно.