k近邻在sonar数据集上的实现

"""
Created on Tue Oct 19 19:26:28 2021
直接近邻
@author: lj
"""
import numpy as np
import random
random.seed(2)
class k_near:
    def __init__(self):
        self.feature=[]
        
        self.dist=[]
        self.all_label=[]
        self.label=0
        
    def com_dist(self,data):
        [row,col]=data.shape
        diff=np.zeros_like(data)
        for i in range(len(data)):
            diff[i,:]=(self.feature[:]-data[i,:])**2
            self.dist.append(np.sqrt(sum(diff[i,:]))/col)
        
    def find_label(self,label,k):
        self.dist[np.argmin(self.dist)]=2#0*abs(np.max(self.dist))
        for i in range(k):
            self.all_label.append(label[np.argmin(self.dist)])
            self.dist[np.argmin(self.dist)]=2#0*abs(np.max(self.dist))
        num=np.zeros([3])
        num[0]=(self.all_label.count(1))
        num[1]=(self.all_label.count(2))
        num[2]=(self.all_label.count(3))
        
        self.label=np.argmax(num)+1
        
data = np.loadtxt('sonar.txt', delimiter=',')
[row,col]=data.shape
#全部数据集特征
feature=(data[:,0:-1]-np.min(data[:,0:-1]))/(np.max(data[:,0:-1],axis=0)-np.min(data[:,0:-1]))
label=data[:,-1]

list_test=range(data.shape[0])
test=random.sample(list_test, 100)
#test=range(0,200)
k=25#近邻数

x=k_near()
#x.feature=np.zeros([col-1])
#输入x的特征值
inputfeature=feature[test,:]
test_label=[]
right_label=label[test]
for i in range(inputfeature.shape[0]):
    x.feature=inputfeature[i,:]
    x.dist=[]
    x.all_label=[]
    x.com_dist(feature)
    x.find_label(label,k)   
    test_label.append(x.label)
    print("数据" + str(test[i])+ "的类别为:",x.label)
right_rate=1-np.sum(np.abs(test_label-right_label))/len(test_label)
print("数据正确率:",right_rate)

本文中作者使用了最为基础的K近邻算法对数据进行分类,其基本思路可以简单总结成以下流程图:

 但是,这种分类方法常常对于分布不均匀的数据有着较差的分类能力,如某些数据临近范围内仅有3、4个点,某些点临近范围内却有着更多的样本,这种情况下,我们需要对不同的点分别进行处理,于是采用了一种新的办法:尝试对搜索临近数据的邻域半径进行限制,将部分超出半径的临近数据剔除,从而有效保证K近邻算法的思想不因为数据分布不均而缺乏体现。

以下是邻域限制时K近邻的代码:

"""
Created on Tue Oct 19 19:26:28 2021
附加邻域k近邻
@author: lj
"""
import numpy as np
import random
random.seed(2)
class k_near:
    def __init__(self):
        self.feature=[]
        
        self.dist=[]
        self.all_label=[]
        self.label=0
        
    def com_dist(self,data):
        [row,col]=data.shape
        diff=np.zeros_like(data)
        for i in range(len(data)):
            diff[i,:]=(self.feature[:]-data[i,:])**2
            self.dist.append(np.sqrt(sum(diff[i,:]))/col)
        
    def find_label(self,label,k):
        self.dist[np.argmin(self.dist)]=20*abs(np.max(self.dist))
        limit=0.04*1
        for i in range(k):
            if np.min(self.dist)<limit:
                self.all_label.append(label[np.argmin(self.dist)])
                self.dist[np.argmin(self.dist)]=2#0*abs(np.max(self.dist))
            else:
                self.all_label.append(3)
                self.dist[np.argmin(self.dist)]=2#0*abs(np.max(self.dist))
        num=np.zeros([2])
        num[0]=(self.all_label.count(1))
        num[1]=(self.all_label.count(2))
        
        self.label=np.argmax(num)+1
        
data = np.loadtxt('sonar.txt', delimiter=',')
[row,col]=data.shape
#全部数据集特征
feature=(data[:,0:-1]-np.min(data[:,0:-1]))/(np.max(data[:,0:-1],axis=0)-np.min(data[:,0:-1]))
label=data[:,-1]

list_test=range(data.shape[0])
test=random.sample(list_test, 100)
#test=range(0,200)
k=25
#近邻数

x=k_near()
#x.feature=np.zeros([col-1])
#输入x的特征值
inputfeature=feature[test,:]
test_label=[]
right_label=label[test]
for i in range(inputfeature.shape[0]):
    x.feature=inputfeature[i,:]
    x.dist=[]
    x.all_label=[]
    x.com_dist(feature)
    x.find_label(label,k)   
    test_label.append(x.label)
    print("数据" + str(test[i])+ "的类别为:",x.label)
right_rate=1-np.sum(np.abs(test_label-right_label))/len(test_label)
print("数据正确率:",right_rate)

 由于采用的数据分布较为均匀,两种算法的差距并不是特别明显。不过当K取值25时,附加邻域法的正确率要高出普通K近邻5%以上。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sonar数据集.mat文件是一个用于声纳目标识别的数据集文件。声纳是一种利用声波进行探测与检测的技术,常被应用于水下目标探测、海洋勘探等领域。sonar数据集.mat文件中包含了多组声纳回波信号数据,以及与这些数据对应的目标类型标签。 在声纳目标识别中,通过分析声纳探测到的回波信号特征,可以判断目标的存在与类型。sonar数据集.mat文件中的回波信号是通过声纳探测设备在特定环境下获取的真实数据,具有一定的噪声和复杂性。通过对这些数据进行处理和分析,可以提取出不同目标的特征信息,进而用于分类和识别。 sonar数据集.mat文件中的目标类型标签是对每个回波信号数据所对应目标的标识,常用0和1两种数字表示不同的目标类别。这些标签可以作为训练和测试模型的标记,用于模型的监督学习和性能评估。 通过对sonar数据集.mat文件的应用和研究,可以帮助我们深入了解声纳目标识别技术的有效性和性能。同时,也可以为声纳领域的研究人员和工程师们提供一个实践与验证算法的场景,从而改进和优化声纳目标识别的方法和算法。 总之,sonar数据集.mat文件是一个用于声纳目标识别研究与应用的重要数据集,通过分析该数据集,可以提高我们对声纳信号的理解,进一步推动声纳技术的发展和应用。 ### 回答2: sonar数据集.mat文件是一个包含声纳信号数据的文件。声纳技术是一种利用声波在水下传播的原理,通过接收和分析返回的声波信号来获取水下目标的信息的技术。sonar数据集.mat文件中存储了通过声纳技术获取的声波信号数据。 sonar数据集.mat文件通常包含两个主要的数据:声波信号数组和目标标签数组。声波信号数组包含了多个声波信号的数据,每个声波信号对应一个特定的时间段内接收到的声波信号。这些声波信号可以表示为一维数组或矩阵,其中每个元素表示声波信号的强度或振幅。 目标标签数组是一个与声波信号数组相对应的数组,用于表示每个声波信号所对应的水下目标的类别或属性信息。每个目标标签对应一个声波信号,可以是字符串或数字,用于标识该声波信号所对应的目标类型。 使用sonar数据集.mat文件可以进行各种信号处理和目标识别的分析和研究。通过分析声波信号的强度和频率等特征,可以提取出目标的关键信息,如目标的位置、形状和大小等。同时,通过对目标标签的分析,可以对不同类型的水下目标进行分类和识别。 sonar数据集.mat文件是声纳技术研究和应用中常用的数据集之一,可以被广泛应用于海洋勘探、水下目标探测与识别等领域的研究和实践中。通过对该数据集的分析,可以帮助人们更好地理解水下环境和水下目标的特性,从而提升声纳技术的应用水平和效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值