Python机器学习基础(一)K-近邻算法

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()

训练数据集显示
在这里插入图片描述
训练数据集
加入测试数据集,测试数据集为方块
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45083791/article/details/105403534
今日推荐