使用K近邻对iris数据集进行分类

听了好几年的K近邻算法 今天终于接触到了

原理很简单 讲样本映射为多维空间中的点

无标签新样本 由空间中与其最近的K个点中数量最多的标签来定义

以下为暴力实现 高效算法留坑

from sklearn import datasets

def cmp(elem):
    return elem[0]

iris=datasets.load_iris()

data=iris.data
target=iris.target
num_data,num_feature=data.shape
num_target=len(iris.target_names)

data_train,target_train=[],[]#训练集大小为120
data_test,target_test=[],[]#测试集大小为30
for i in range(num_data):
    if i%5!=0:
        data_train.append(data[i])
        target_train.append(target[i])
    else:
        data_test.append(data[i])
        target_test.append(target[i])
num_train,num_test=len(data_train),len(data_test)

K=int(10)#只考虑最近的10个邻居
#P=2
count=int(0)

for i in range(num_test):
    list=[]
    for j in range(num_train):

        val=0.0
        for k in range(num_feature):
            val+=(data_test[i][k]-data_train[j][k])*(data_test[i][k]-data_train[j][k])
        val=val**0.5

        """
        for k in range(num_feature):
            val+=abs(data_test[i][k]-data_train[j][k])
        """

        tmp=[]
        tmp.append(val)
        tmp.append(target_train[j])
        list.append(tmp)
    list.sort(key=cmp)

    vote=[]
    for j in range(num_target):
        vote.append(int(0))
    for j in range(K):
        id=int(list[j][1])
        vote[id]=vote[id]+1

    maxx,ans=int(-1),int(-1)
    for j in range(num_target):
        if maxx<vote[j]:
            maxx,ans=vote[j],j

    if ans==target_test[i]:
        count=count+1

print(count,num_test)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值