loveliyifeng
2021-06-29 09:09
采纳率: 100%
浏览 55

KNN--K近邻算法

在二维平面上,分别定义中心点(均值)和离散程度(方差)不同,且符合正态分布的两个集合(5000个离散点),利用K-近邻算法进行分类。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • 天元浪子 2021-06-29 10:24
    已采纳

    设两个集合的中心点分别为p0和p1表示二元组,方差分别为v0和v1(开方得到标准差),借助于numpy的随机化抽样子模块random很容易得到两个集合,合并为一个样本集。与之对应的标签集也不难制作。之后按10%的比例抽取测试集,其余作为训练集(事实上,k-近邻分类无需训练,训练集仅作为经验数据)。演示代码如下。

    >>> import numpy as np
    >>> from sklearn.neighbors import KNeighborsClassifier # 导入K-近邻分类器
    >>> from sklearn.model_selection import train_test_split as tsplit
    >>> p0, p1 = (-1,-1), (1,1)
    >>> v0, v1 = 0.8, 1.2
    >>> xs_0 = np.random.normal(loc=p0[0], scale=pow(v0,0.5), size=5000)
    >>> ys_0 = np.random.normal(loc=p0[1], scale=pow(v0,0.5), size=5000)
    >>> label_0 = np.zeros(5000, dtype=np.int32)
    >>> xs_1 = np.random.normal(loc=p1[0], scale=pow(v1,0.5), size=5000)
    >>> ys_1 = np.random.normal(loc=p1[1], scale=pow(v1,0.5), size=5000)
    >>> label_1 = np.ones(5000, dtype=np.int32)
    >>> X = np.vstack((np.stack((xs_0, ys_0), axis=1), np.stack((xs_1, ys_1), axis=1)))
    >>> y = np.hstack((label_0, label_0))
    >>> X.shape, y.shape
    ((10000, 2), (10000,))
    >>> X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.1) # 拆分
    >>> m = KNeighborsClassifier() # 实例化模型。n_neighbors参数指定k值,默认k=5
    >>> m.fit(X_train, y_train) # 模型训练
    KNeighborsClassifier()
    >>> score = m.score(X_test, y_test) # 模型测试精度(介于0~1之间)
    >>> score
    1.0

    两个集合距离远,方差小,没有重合区域,所以测试结果100%正确。题主可以选择不同的中心点和方差,让数据点适度重合,就可以看到模型精度不会是100%。

    点赞 1 打赏 评论
  • CSDN专家-AlanMax 2021-06-29 09:54

    使用sklearn可以完成

    点赞 打赏 评论

相关推荐 更多相似问题