Python机器学习基础(一)K-近邻算法
算法简介
K近邻算法是一种有监督的分类算法,利用有标签的数据集(带有不同的标签),在样本空间预先生成一些样本点,在进行测试时,新输入的样本点根据它所在周围的k个样本点,标签数出现次数最多的,作为新输入的样本点的标签类别,以此对输入的数据进行分类。
算法实现
在这里通过定义K近邻的类来实现整体的算法
# -*- coding: utf-8 -*-
"""
Created on keke tang 28 18:00:18 2020
@author: 5066
"""
import numpy as np
import matplotlib.pyplot as plt
from math import *
class Knn:
#类的初始化参数,这里定义四个标签数据集
def __init__(self,data_x0,data_x1,data_x2,data_x3):
self.x = data_x0
self.y = data_x1
self.z = data_x2
self.w = data_x3
pass
#训练过程也比较简单,就是显示最初的标签参数空间
def train(self):
plt.scatter(self.x[:,0],self.x[:,1],100,'r')
plt.scatter(self.y[:,0],self.y[:,1],100,'b')
plt.scatter(self.z[:,0],self.z[:,1],100,'y')
plt.scatter(self.w[:,0],self.w[:,1],100,'g')
plt.grid(b=1)
pass
'''
算法的核心部分,将输入的测试集按K近邻算法,完成分类
test_data为输入测试数据(方便起见这里仅设置一个点),k为最近点的个数
'''
def nearest(self,test_data,k):
self.train()
#得到输入点与空间样本所有点的“距离”
x_distances = ([sqrt(np.sum((x_train - test_data)**2)) for x_train in self.x])
y_distances = ([sqrt(np.sum((y_train - test_data)**2)) for y_train in self.y])
z_distances = ([sqrt(np.sum((z_train - test_data)**2)) for z_train in self.z])
w_distances = ([sqrt(np.sum((w_train - test_data)**2)) for w_train in self.w])
#整合所有点的距离
full_distance = np.hstack((x_distances,y_distances,z_distances,w_distances))
x_y_z_w0 = ['r','b','y','g']
x_y_z_w = [0,0,0,0]
'''
以距离排序(从小到大)的前 k+1 个点作为参考样本集
寻找其中种类最多的点,以它的标签作为测试数据
'''
for i in np.argsort(full_distance)[:k+1]:
x_y_z_w[int((i)/len(x_distances))] = x_y_z_w[int((i)/len(x_distances))] + 1
#在样本空间中得将新的点绘制出来
plt.scatter(test_data[0],test_data[1],160,x_y_z_w0[np.argsort(x_y_z_w)[-1]],'s')
plt.grid(b=1)
生成训练集
'''
形成训练集,在这里为了方便,将直角平面第一象限的
|(100,0) (100,100)|
|(0,0) (0,100) |
划分出四块区域
'''
#单个数据集的样本点个数
train_num = 50
left = np.random.randint(1,40,(train_num,1)).astype(np.float32)
right = np.random.randint(60,100,(train_num,1)).astype(np.float32)
up = np.random.randint(60,100,(train_num,1)).astype(np.float32)
down = np.random.randint(1,40,(train_num,1)).astype(np.float32)
def getdata(data_x,data_y):
return np.hstack((data_x,data_y))
red = getdata(left, up)
blue = getdata(left, down)
yellow = getdata(right, up)
green = getdata(right, down)
生成数据集
#测试数据集样本点个数
test_num = 50
mindle = np.random.randint(40,60,(test_num,1)).astype(np.float32)
cross = np.random.randint(1,100,(test_num,1)).astype(np.float32)
test0 = getdata(mindle,cross)
test1 = getdata(cross,mindle)
显示训练集以及测试数据集
a = Knn(red,blue,yellow,green)
plt.show()
for i in range(test_num):
a.nearest(test0[i],4)
a.nearest(test1[i],4)
plt.show()
训练数据集显示
训练数据集
加入测试数据集,测试数据集为方块