机器学习-分类模型-逻辑分类(2)

逻辑分类简要概念:

 

逻辑分类实际上是基于线性回归+ 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()

输出图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值