机器学习实践——KNN算法

K近邻算法,只选择样本数据集中前K个最相似的数据,然后根据这K个最相似的数据中出现次数最多的分类,作为新数据的分类。
一下是Python中用KNN算法对sklearn中的鸢尾花数据进行分类。将K值设置为6.可以得到相对平滑的决策边界。
代码如下:

import numpy as np
from matplotlib.colors import ListedColormap #画图函数
import matplotlib.pyplot as plt
def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])  # 通过ListedColormap来定义一些颜色和标记号,并通过颜色列表生成了颜色示例图
    # 对两个特征的最大值最小值做了限定(使用两个特征来训练感知器)
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    # 利用meshgrid函数,将最大值、最小值向量生成二维数组xx1和xx2
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
    # 创建一个与数据训练集中列数相同的矩阵,以预测多维数组中所有对应点的类标z
    z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = z.reshape(xx1.shape)  # 将z变换为与xx1和xx2相同维度
    # 使用contourf函数,对于网格数组中每个预测的类以不同的颜色绘制出预测得到的决策区域
    plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())

    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0],
                    y=X[y == cl, 1],
                    alpha=0.8,
                    c=colors[idx],
                    marker=markers[idx],
                    label=cl,
                    edgecolor='black')


###############################################################################
# 训练集与测试集的获取,采用鸢尾花数据集
from sklearn import datasets
iris = datasets.load_iris()
x = iris.data[:, [2, 3]]
y = iris.target
from sklearn.cross_validation import train_test_split #对数据进行处理
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
# 为了优化性能,对特征进行标准化处理
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(x_train)  # 通过fit方法,可以计算训练数据中每个特征的样本均值和方差
x_train_std = sc.transform(x_train)  # 通过调用transform方法,可以使用前面获得的样本均值和方差来对数据做标准化处理
x_test_std = sc.transform(x_test)

from sklearn.neighbors import KNeighborsClassifier #KNN分类器
knn = KNeighborsClassifier(n_neighbors=6, p=2, metric='minkowski')  # 输入参数为,k值;欧拉距离;指定距离度量('minkowski'距离.闵可夫斯基距离)
knn.fit(x_train_std, y_train)
print("训练准确率:%f" % knn.score(x_train_std, y_train))  # 返回在(X_train,y_train)上的准确率
print("测试准确率:%f" % knn.score(x_test_std, y_test))  # 返回在(X_test,y_test)上的准确率
x_combined_std = np.vstack((x_train_std, x_test_std))  # 将数组垂直排列成多个子数组的列表。
y_combined = np.hstack((y_train, y_test))  # 按水平顺序(列)顺序堆栈数组。
plot_decision_regions(X=x_combined_std, y=y_combined, classifier=knn, test_idx=range(105, 150))
plt.title('result')
plt.legend(loc='upper left')
plt.show()

结果如下:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值