記事ディレクトリ
分類と回帰のための近傍アルゴリズム
k 最近傍アルゴリズムは教師あり学習アルゴリズムに属し、基本的な分類および回帰アルゴリズムです。
アルゴリズムの原理: 未分類のデータの場合、そのデータに隣接する k 個の分類されたインスタンスとその最も近い距離に投票して、そのデータが属するカテゴリ、つまり、そのデータに最も近い k 個のインスタンスの大多数が属するカテゴリを決定します。 to は、この分類インスタンスのカテゴリです。
朱色に近いものは赤、墨に近いものは黒であると単純に理解できます。
一般に、k 値の選択が異なると異なる結果が得られ、適切な k 値を選択することはアルゴリズムにとって非常に重要です。
k の値が小さすぎることは、モデルが複雑すぎることを意味し、簡単に過学習につながる可能性があります。つまり、ノイズの影響を受けやすくなります。
k 値が大きすぎる場合は、モデルが単純すぎることを意味し、簡単にアンダーフィッティングにつながる可能性があります。このとき、分類対象の問題から遠く離れたサンプル点も分類に関与することになります。予測を誤ります。
距離の尺度
k 最近傍アルゴリズムでは、未分類データと分類済みであることがわかっているすべてのサンプル データとの間の距離を毎回計算し、最も近い距離で k データを並べ替えて最終的な分類結果に投票する必要があります。距離も非常に重要な部分であり、計算には一般に 3 つの方法があります。
- ユークリッド距離:
L ( xi , xj ) = ( ∑ l = 1 n ( xi ( l ) − xj ( l ) ) 2 ) 1 2 ) L(x_i, x_j)=\left ( \sum_{l=1}^{n} (x_i^{(l)}-x_j^{(l)})^2 \right )^{\frac{1}{2}} )L ( ×私は、バツj)=(l = 1∑ん( ×私( l )−バツj( l ))2 )21)
- マンハッタン距離:
L ( xi , xj ) = ∑ l = 1 n ∣ xi ( l ) − xj ( l ) ∣ L(x_i, x_j)=\sum_{l=1}^{n}|x_i^{(l)}- x_j^{(l)}|L ( ×私は、バツj)=l = 1∑ん∣ x私( l )−バツj( l )∣
- 各座標の距離の最大値:
KaTeX 解析エラー: 未定義の制御シーケンス: 位置 13 の \sideset: L(x_i,x_j)=\̲s̲i̲d̲e̲s̲e̲t̲{}{}{max}_l|x_i…
アルゴリズムの長所と短所
アルゴリズムの利点:
- 適切な k 値は、継続的な実験を通じて見つけることができます。
- アルゴリズムの精度は高いです。
- 異常値やノイズに対する高い耐性。
このアルゴリズムの欠点:
- ラベルのないサンプルが分類されるたびに、すべてのラベル付きサンプルとその近傍サンプルとの距離とランクを計算する必要があります。
- k 値の選択を決定するのは困難です。
- コンピューティングには大量のメモリが必要です。
アルゴリズムの場合
分類タスク
ここで Jupyter ノートブック環境を使用します。
ガイドパッケージ:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.neighbors import KNeighborsClassifier
データを生成します。
X, y = make_blobs(n_samples=400, centers=4, cluster_std=1.3, random_state=6)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='rainbow')
パッケージ化された分類関数を導入します。
def KneighborsClassifier(X, y, ax=None, n_neighbors=5, weights='uniform', algorithm='auto', cmap='rainbow'):
"""
采用K近邻算法进行分类
:param X:待处理的二维矩阵,其中(X[:, 0], X[:, 1])表示二维平面内的一个点
:param y:监督学习标签
:param ax:传入提前好的axis对象或默认为None
:param n_neighbors: 最重要的超参数k值
:param weights: 'uniform '表示每个点的权重都一样
:param algorithm: 采用分类的算法 默认为自动
:param cmap: 采用的颜色映射
:return:
"""
# 生成非None的ax对象
ax = ax or plt.gca()
# 画出训练数据以及ax对象的设置
ax.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap='rainbow')
ax.axis('tight')
ax.set_xlabel('x', fontsize=16)
ax.set_ylabel('y', fontsize=16)
ax.set_title('KNeighborsClassifier', fontsize=19)
# 获取坐标轴的范围
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 建立模型并配置超参数
# p=2表示采用欧式距离
model = KNeighborsClassifier(n_neighbors=n_neighbors, weights=weights,
algorithm=algorithm, leaf_size=30, p=2)
# 用评估器拟合数据
model.fit(X, y)
# 画出预测的二维网络
xx, yy = np.meshgrid(np.linspace(*xlim, num=200),
np.linspace(*ylim, num=200))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
# 为结果生成彩色图
n_classes = len(np.unique(y))
contours = ax.contourf(xx, yy, Z, alpha=0.3, cmap=cmap, zorder=1,
levels=np.arange(n_classes + 1) - 0.5)
# 设置图像边界
ax.set(xlim=xlim, ylim=ylim)
return model
分類結果を表示します。
KneighborsClassifier(X, y)
タスクを返す
ガイドパッケージ:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsRegressor
データを生成します。
rng = np.random.RandomState(42)
x = rng.rand(100) * 10
y = np.sin(x) + 0.2 * rng.randn(100)
plt.scatter(x, y)
カプセル化された関数をインポートします。
def plusNewAxis(x):
"""
给数组x增加一个维度的函数
:param x: 待处理的数组
:return: np.ndarray
"""
return x[:, np.newaxis]
def KneighborsRegression(x, y, k=5, ax=None):
"""
使用k近邻算法做回归分析
:param x: 回归数据的x坐标
:param y: 回归数据的y坐标
:param k: 近邻值的超参数
:param ax: 传入的ax对象
:return: model
"""
# 调整绘制的ax对象
ax = plt.gca() or ax
# 转化为机器学习可以利用的维度
if x.ndim == 1:
X = plusNewAxis(x)
else:
X = x
# 建立模型并完成拟合
model = KNeighborsRegressor(k)
model.fit(X, y)
# 评估模型得分
print('模型得分:', model.score(X, y))
# 生成测试数据
Min, Max = X.min() - 0.5, X.max() + 0.5
xfit = np.linspace(Min, Max, 1000)
Xfit = xfit[:, np.newaxis]
yfit = model.predict(Xfit)
# 绘制原始数据
ax.scatter(x, y, color='b')
# 绘制回归曲线
ax.plot(xfit, yfit, color='r')
# 设置标题与轴信息
ax.set_title('KNeighbors Regression', fontsize=19)
ax.set_xlabel('x', fontsize=16)
ax.set_ylabel('y', fontsize=16)
# 添加图例
ax.legend(['row data', 'Regression'], loc='best')
# 返回模型
return model
回帰当てはめを完了し、スコアを計算します。
KneighborsRegression(x, y)
16)
# 添加图例
ax.legend(['row data', 'Regression'], loc='best')
# 返回模型
return model
完成回归拟合并计算得分:
~~~python
KneighborsRegression(x, y)