02_02 python机器学习_第二章监督学习_K邻近(K-NN)

python机器学习_第二章监督学习_K邻近(K-NN)

01 概念

我的理解:
将一块磁铁放在一堆分散的不同颜色的铁块中, 算法中的参数用于设定磁铁可以吸附铁块的个数,肯定是从最近位置的铁块开始吸引.
当参数为1时,只吸引一个铁块,因此这个铁块是什么颜色, 那么这块磁铁就标记成什么颜色.
当参数为N时,会吸附N个铁块, 不同颜色的铁块都会吸附过来,以最多颜色的铁块来标记磁铁的颜色.
磁铁就好比新数据, 铁块就好建模用的数据样本.

K邻近算法使用建议:
对于复杂模型产生的数据,应当使K尽量小, 因为复杂模型的数据已经足够精准,扩大K势必降低其精确度.
反之,针对简单模型,因为数据太含糊不清,应尽量使K大一些,多一些参考数据来决定最终数据类型.

02 多近邻 决策边界

在K邻近算法中,当使用>1个近邻时,虽然可以通过程序来判断新数据的类别,那么怎么能通过人眼直观的判断数据的类别呢?
书中使用了决策边界, 就想地图中的国界线, 同类数据的底色会被标记成一种颜色,混在在一起的那些数据,根据指定的近邻数也会出区分出决策边界的位置.

02_001 决策边界示例代码

书中的代码

import matplotlib.pyplot as plt
import mglearn
from sklearn.neighbors import KNeighborsClassifier

x, y = mglearn.datasets.make_forge()
fig, axes = plt.subplots(1, 3, figsize=(10, 3))

for n_neighbors, ax in zip([1, 3, 9], axes):
    clf = KNeighborsClassifier(n_neighbors=n_neighbors).fit(x, y)
    mglearn.plots.plot_2d_separator(clf, x, fill=True, eps=0.5, ax=ax, alpha=.4)
    mglearn.discrete_scatter(x[:, 0],x[:, 1], y, ax=ax)
    ax.set_title("{} neighbors".format(n_neighbors))
    ax.set_xlabel("feature 0")
    ax.set_ylabel("feature 1")

axes[0].legend(loc=3)

plt.show()

效果图, 可以明显的看到边界位置了.

在这里插入图片描述

02_001 代码分析_PKG

# 绘图包
import matplotlib.pyplot as plt
# 配色方案包,这里有一些简单的数据样本可以直接使用
# 我理解: 因为重点是图形表示,所以使用图形包中的数据样本能来的快些,因此没有使用sklearn.datasets的数据
import mglearn
# K邻近算法
from sklearn.neighbors import KNeighborsClassifier

02_001 代码分析_实例话数据源

# 实例话数据源
x, y = mglearn.datasets.make_forge()

02_001 代码分析_创建画布

  • figure 是画布
    好比绘画用的纸,画不可以超过纸大小, 一张纸设置一次就行,设置后,对于这张纸都是全局设置
  • plot 是绘画
    绘画的设置仅影响这个画的本身, 一张纸上画俩苹果, 就是俩plot, 第一个苹果的颜色不会影响到第二个苹果.

要说明subplots还得先从subplot说起.
subplot返回的一个绘图对象, 是显示在画布基础上的.

import matplotlib.pyplot as plt
import mglearn

# 实例话数据源
x, y = mglearn.datasets.make_forge()

# sbuplot设置的三个接口粉分别是  row, column,index
# 画布的背景大小为 row * column的矩阵大小
# index表示返回的是这个矩阵中的第几个画布,  index从1开始, index的取值范围 [>1 and < row*column]
pt = plt.subplot(1, 2, 1)
pt.scatter(x[:, 0], y, s=50, marker='x', label='featrue1')
pt.legend()

plt.show()

效果图:

在这里插入图片描述

换个位置试试:

在这里插入图片描述

subplots是在subplot的基础上返回两个对象

#创建画布
# axes 
#  是个数组 [axes[0], axes[1],.....]
#  如果想设置画布,直接通过数组下标设置就行, 比如:  第二块画布为axe_2 = axes[1] 
fig, axes = plt.subplots(1, 3, figsize=(10, 3))

如果使用subplot来做的话,类似下面这样
创建2个画布, 然后再画布上分别绘图.

import matplotlib.pyplot as plt

# 设置画布大小
plt.figure(figsize=(6, 3))
fig = plt.figure(1)
sp1 = fig.add_subplot(211)
sp1.plot([1, 2, 3])

# 每个画布大小都必须设置一遍
plt.figure(figsize=(6, 3))
fig2 = plt.figure(2)
sp2 = fig2.add_subplot(211)
sp2.plot([4, 5, 6])

plt.show()

在这里插入图片描述

在一个画布上:

plt.figure(figsize=(6, 3))
fig = plt.figure(1)

sp1 = fig.add_subplot(211)
sp1.plot([1, 2, 3])

sp2 = fig.add_subplot(212)
sp2.plot([4, 5, 6])

plt.show(<
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值