您的位置:首页 > 运维架构

机器学习——OpenCV实现K-NN

2019-02-26 21:57 211 查看

k-NN是最简单的机器学习算法之一,简单而言k-NN算法认为一个数据点很可能与它近邻点同属于一类,sklearn实现k-NN算法后面再复习一下,这次先学习OpenCV当中cv2.ml.KNearest_create()实现k-NN。

步骤:

  1. 得到一些训练数据
  2. 指定K值,创建对象
  3. 找到想要分类的新数据点的k个最近邻的点
  4. 使用多数投票来分配新数据点的类标签
  5. 画出结果图

特别注意:OpenCV当中必须要求吧数据点的类型转换成np.float32!

问题背景:一个古老的问题,小镇熵红蓝球迷们的分类问题。

先看代码:

[code]# ——创建时间:2019.2.26——
# OpenCV实现kNN
# 问题背景:区分小镇红蓝不同的球迷

import numpy as np
import cv2
import matplotlib.pyplot as plt

# 设置绘图属性
plt.style.use('ggplot')

# 生成训练数据
# 输入:每个点的个数和每个数据点的特征数
def generate_data(num_samples, num_features):
data_size = (num_samples, num_features)
data = np.random.randint(0, 100, size=data_size)

labels_size = (num_samples, 1)
labels = np.random.randint(0, 2, size=labels_size)

return data.astype(np.float32), labels  # 确保将数据转换成np.float32

train_data, labels = generate_data(11, 2)

# 分红和蓝色分别作图
def plot_data(all_blue,all_red):
plt.scatter(all_blue[:,0],all_blue[:,1],c='b',marker='s',s=180)
plt.scatter(all_red[:, 0], all_red[:, 1], c='r', marker='^', s=180)
plt.xlabel('x coordinate (feature 1)')
plt.ylabel('y coordinate (feature 2)')

print("train_data:",train_data)  # 观察数据集

# 平面化数据
bule = train_data[labels.ravel()== 0]
red = train_data[labels.ravel() == 1]
plot_data(bule,red)
plt.show()

# 训练分类器
knn = cv2.ml.KNearest_create()  # 实例化
knn.train(train_data, cv2.ml.ROW_SAMPLE,labels)
# 利用findNearest发现新的数据点
newcomer,_ = generate_data(1,2)
plot_data(bule,red)
plt.plot(newcomer[0,0],newcomer[0,1],'go',markersize=14)
plt.show()

看输出:

train_data:

train_data: [[23.  2.]
 [24. 49.]
 [61. 48.]
 [55.  0.]
 [17. 10.]
 [82. 32.]
 [17.  2.]
 [16. 69.]
 [52.  6.]
 [ 5.  6.]
 [62. 77.]]

 原图:

KNN分类后的图:

 

绿色点是距离红点、蓝点距离相同的点,即为KNN预测值

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: