(6)从Intuition的角度透彻理解Logistic Regression
在Spyder集成开发环境中,将光标放置于meshgrid单词上,按Ctrl+鼠标左键查看meshgrid的帮助文档。
def meshgrid(*xi, **kwargs):
"""
从坐标向量返回坐标矩阵。
制作N-D坐标阵列,用于对N-D网格上的N-D标量/矢量场,给定一维坐标阵列x1,x2,…,xn。
版本修改: 1.9
允许1-D和0-D
参数
----------
x1, x2,..., xn : array_like
表示网格坐标的一维数组。索引:'xy'、'ij',可选输出的笛卡尔(“xy”,默认)或矩阵(“ij”)索引。有关详细信息,请参阅注释。
版本增加: 1.7.0
sparse : bool, optional
如果为真,则返回稀疏网格以节省内存。默认值为假。
版本增加: 1.7.0
copy : bool, optional
如果为false,则返回原始数组中的视图,以便节省内存。默认值为true。请注意sparse=False, copy=False可能返回非连续的数组。此外,广播数组的多个元素可能指单个内存位置。如果你需要写入数组,首先进行复制。
版本增加: 1.7.0
返回
-------
X1, X2,..., XN : ndarray
对于向量x1, x2,..., xn,长度为Ni=Len(Xi),返回(N1, N2, N3,...Nn)形状的数组,如果indexing='ij'或(N2, N1, N3,...Nn)形状的数组,如果indexing=xy
用xi的元素,反复填充矩阵第一个维度“x1”,第二个维度“x2”,依此类推。
注意
-----
此函数通过索引支持两种索引约定关键字参数。给字符串“ij”返回一个使用网格矩阵索引的网格,而“xy”返回带有笛卡尔索引的网格。在输入长度为m和n的二维情况下,输出形状为(n,m)用于“xy”索引,(m,n)用于“ij”索引。在三维情况下输入长度为m、n和p时,输出形状为(n、m、p)“xy”索引和(m,n,p)用于“ij”索引。区别由以下代码段说明:
xv, yv = np.meshgrid(x, y, sparse=False, indexing='ij')
for i in range(nx):
for j in range(ny):
# treat xv[i,j], yv[i,j]
xv, yv = np.meshgrid(x, y, sparse=False, indexing='xy')
for i in range(nx):
for j in range(ny):
# treat xv[j,i], yv[j,i]
在一维和0-D情况下,索引和稀疏关键字没有效果。
更多参考
--------
index_tricks.mgrid : 使用索引符号构造多维“网格”
index_tricks.ogrid : 用索引符号构造一个开放的多维“网格”
例子
--------
>>> nx, ny = (3, 2)
>>> x = np.linspace(0, 1, nx)
>>> y = np.linspace(0, 1, ny)
>>> xv, yv = np.meshgrid(x, y)
>>> xv
array([[ 0. , 0.5, 1. ],
[ 0. , 0.5, 1. ]])
>>> yv
array([[ 0., 0., 0.],
[ 1., 1., 1.]])
>>> xv, yv = np.meshgrid(x, y, sparse=True) # make sparse output arrays
>>> xv
array([[ 0. , 0.5, 1. ]])
>>> yv
array([[ 0.],
[ 1.]])
meshgrid对于计算网格上的函数非常有用。
>>> x = np.arange(-5, 5, 0.1)
>>> y = np.arange(-5, 5, 0.1)
>>> xx, yy = np.meshgrid(x, y, sparse=True)
>>> z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
>>> h = plt.contourf(x,y,z)
"""
ndim = len(xi)
copy_ = kwargs.pop('copy', True)
sparse = kwargs.pop('sparse', False)
indexing = kwargs.pop('indexing', 'xy')
if kwargs:
raise TypeError("meshgrid() got an unexpected keyword argument '%s'"
% (list(kwargs)[0],))
if indexing not in ['xy', 'ij']:
raise ValueError(
"Valid values for `indexing` are 'xy' and 'ij'.")
s0 = (1,) * ndim
output = [np.asanyarray(x).reshape(s0[:i] + (-1,) + s0[i + 1:])
for i, x in enumerate(xi)]
if indexing == 'xy' and ndim > 1:
# switch first and second axis
output[0].shape = (1, -1) + s0[2:]
output[1].shape = (-1, 1) + s0[2:]
if not sparse:
# Return the full N-D matrix (not only the 1-D vector)
output = np.broadcast_arrays(*output, subok=True)
if copy_:
output = [x.copy() for x in output]
return output
(9) 可视化测试集的预测结果。
# Visualising the Test set results
from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Logistic Regression (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()
在Spyder集成环境全选以上代码,按Shift+Enter键运行,如图32-16所示,图是测试集的运行结果。
图中为什么是一条直线将红色的区域、绿色的区域区分开?它是直线的原因:逻辑回归是在线性回归的基础上发展出来的,简单线性回归是一条直线。但这会造成一些误差,有时候不太希望直线出现,希望有些弯曲,在后面的案例中我们将调到更有价值的状态。
本文根据王家林老师《30个真实商业案例代码中成为AI实战专家(10大机器学习案例、13大深度学习案例、7大增强学习案例)课程》整理。