Python实现KNN算法--iris数据集

在本文中,通过python实现KNN算法,而非简单的调用sklearn库,并通过iris鸢尾花数据集进行训练和测试。
详情参见以下代码:

if __name__ == '__main__':
    trainX, trainY, testX, testY=loadSplitDataSet()
    preY=KNN(testX)
    evaluateKNN()
 
#下载iris鸢尾花数据集
# 和切分数据集为训练集和测试集
# 训练集:trainX、trainY;
# 测试集:testX、testY;
def loadSplitDataSet():
    #随机生成训练集和测试集 不能确定比例
    iris = datasets.load_iris()
    randArray=np.random.randint(2,size=len(iris.data))
    print(len(randArray))
    trainX = iris.data[randArray==0]
    trainY=iris.target[randArray==0]
    testX = iris.data[randArray == 1]
    testY=iris.target[randArray == 1]
    return trainX, trainY, testX, testY

def loadSplitDataSet(rate=0.8):
    iris = datasets.load_iris()
    #确定训练集和测试集的比例
    shuffleIndex=np.random.permutation(len(iris.data))
    trainSize=int(rate * len(iris.data))
    trainX= iris.data[shuffleIndex[:trainSize]]
    trainY=iris.target[shuffleIndex[:trainSize]]
    testX= iris.data[shuffleIndex[trainSize:]]
    testY = iris.target[shuffleIndex[trainSize:]]
    return trainX, trainY, testX, testY
 
#KNN算法实现
#testX为测试样本及
# k为邻近的样本点数量
def KNN(testX,k=5):
    predY = []
    for x in testX:
        # 计算样本点训练集的欧氏距离
        distance = [np.sqrt(np.sum(np.power(x_train - x, 2))) for x_train in trainX]
        # 从小到大排序,每个数的索引位置
        indexSort = np.argsort(distance)
        # 获得距离样本点最近的K个点的标记值y
        nearK_y = [trainY[i] for i in indexSort[:k]]
        # 统计邻近K个点标记值的数量
        cntY = Counter(nearK_y)
        # 返回标记值最多的那个标记
        y_predict = cntY.most_common(1)[0][0]
        predY.append(y_predict)
    return predY
#计算测试的准确率
def evaluateKNN():
    cnt = np.sum(preY == testY)
    acc=np.divide(cnt,len(testX))
    print("the accurate of knn:",round(acc,4))


  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值