逻辑分类简要概念:
逻辑分类实际上是基于线性回归+ sigmoid的一个分类器。
二分类代码:
import numpy as np
import matplotlib.pyplot as plt
import sklearn.linear_model as lm
x = np.array([[3, 1],
[2, 5],
[1, 8],
[6, 4],
[5, 2],
[3, 5],
[4, 7],
[4, -1]])
y = np.array([0, 1, 1, 0, 0, 1, 1, 0])
# solver='liblinear':逻辑函数的函数关系('liblinear为线性函数关系)
# C=1 代表正则强度,用于防止过拟合
model = lm.LogisticRegression(solver='liblinear', C=1) # 基于逻辑回归的逻辑分类器
model.fit(x, y)
result = model.predict([[3, 9], [6, 1]])
# 画图:
# 获取样本集的边界
l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
# 把可视区间划分为500 * 500的二维坐标矩阵
n = 500
# np.linspace(l, r, n)从 l到r 之间拆 500份
# np.meshgrid() 相当于一个500*500的点阵,grid_x 横坐标(500*500) grid_y 纵坐标(500*500)
grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
# 使用模型,得到点阵中每个坐标的类别
# grid_x.ravel() 500*500变成1行 1*250000
# np.column_stack() 两个矩阵按照列合并 (25000*2)
mesh_x = np.column_stack((grid_x.ravel(), grid_y.ravel()))
mesh_z = model.predict(mesh_x) # mesh_z (250000*1)
grid_z = mesh_z.reshape(grid_x.shape)
# 画图
plt.figure('LR Classifcation', facecolor='lightgray')
plt.title('LR Classifcation', fontsize=16)
plt.scatter(x[:, 0], x[:, 1], c=y, cmap = 'jet', label='Sample Points', s=70, zorder=3) # c=y 按照结果y划分颜色,cmap = 'jet'颜色工具包, zorder=3提高图层层面
# 调用plt.pcolormesh()绘制分类边界
# 原理: 根据参数,把可是区间拆分成坐标网格,由于每个网格都有相应的类别,可以使用cmap为每个网格填充颜色
plt.pcolormesh(grid_x, grid_y, grid_z, cmap='gray')
plt.legend()
plt.show()
输出图:
多分类代码:
# 如果要分3种或3种以上类别
# 假设 A、B、C
# 方法: 构建1个分类器,用来判断为A概率。再构建1个,用来判断为B概率,再构建1个,用来判断为C概率
# 最终选择概率最高的类别作为新样本的分类结果
import numpy as np
import matplotlib.pyplot as plt
import sklearn.linear_model as lm
x = np.array([[4, 7],
[3.5, 8],
[3.1, 6.2],
[0.5, 1],
[1, 2],
[1.2, 1.9],
[6, 2],
[5.7, 1.5],
[5.4, 2.2]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])
# 逻辑分类器
model = lm.LogisticRegression(solver='liblinear', C=1000) # 内部会检测有多少种类,按照上述方法来构建多个分类器
model.fit(x, y)
# 获取样本集的边界
l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
# 把可视区间划分为500 * 500的二维坐标矩阵
n = 500
# np.linspace(l, r, n)从 l到r 之间拆 500份
# np.meshgrid() 相当于一个500*500的点阵,grid_x 横坐标(500*500) grid_y 纵坐标(500*500)
grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
# 使用模型,得到点阵中每个坐标的类别
# grid_x.ravel() 500*500变成1行 1*250000
# np.column_stack() 两个矩阵按照列合并 (25000*2)
mesh_x = np.column_stack((grid_x.ravel(), grid_y.ravel()))
mesh_z = model.predict(mesh_x) # mesh_z (250000*1)
grid_z = mesh_z.reshape(grid_x.shape)
# 画图
plt.figure('LR Classifcation', facecolor='lightgray')
plt.title('LR Classifcation', fontsize=16)
plt.scatter(x[:, 0], x[:, 1], c=y, cmap = 'jet', label='Sample Points', s=70, zorder=3) # c=y 按照结果y划分颜色,cmap = 'jet'颜色工具包, zorder=3提高图层层面
# 调用plt.pcolormesh()绘制分类边界
# 原理: 根据参数,把可是区间拆分成坐标网格,由于每个网格都有相应的类别,可以使用cmap为每个网格填充颜色
plt.pcolormesh(grid_x, grid_y, grid_z, cmap='gray')
plt.legend()
plt.show()
输出图: