西瓜书第十章降维KNN算法(10邻居)代码复现

#encoding=utf-8
import pandas as pd
import numpy as np
import cv2
import time
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 数据处理
# 利用opencv获取图像hog特征 对数据进行处理
def get_hog_features(trainset):
    features = []
    # 使用这个HOGDescriptor类就可以直接提取图片的HOG特征
    # 定义完HOG描述子对象hog
    hog = cv2.HOGDescriptor('./hog.xml')
    for img in trainset:
        cv_img = np.reshape(img, (28, 28)).astype(np.uint8)# 对每行数据的处理
        hog_feature = hog.compute(cv_img) # compute来计算HOG特征描述子  n*1的矩阵(numpy-nparray)
        # hog_feature = np.transpose(hog_feature)
        features.append(hog_feature)
    features = np.array(features)
    features = np.reshape(features,(-1,324))
    return features

k = 10
def Predict(testset,trainset,train_labels):
    predict = []            # 预测结果 一个数组解决
    count = 0               # 坐标,没有太多意义,展示用
    for test_vec in testset:
        # 输出当前运行的测试用例坐标,用于测试
        count += 1
        knn_list = []       # 当前k个最近邻居,存放邻居(距离,标签)的数组
        # 记录最远邻居的(坐标和距离)
        max_index = -1      # 标当前k个最近邻居中距离最远点的坐标
        max_dist = 0        # 当前k个最近邻居中距离最远点的距离

        # 先将前k个点放入k个最近邻居中,填充满knn_list
        # 相当于初始化
        for i in range(k):
            label = train_labels[i]
            train_vec = trainset[i]
            dist = np.linalg.norm(train_vec - test_vec)         # 计算两个点的欧氏距离
            knn_list.append((dist,label))

        # 剩下的点
        for i in range(k,len(train_labels)):
            label = train_labels[i]
            train_vec = trainset[i]
            dist = np.linalg.norm(train_vec - test_vec)         # 计算两个点的欧氏距离

            # 寻找10个邻近点中距离最远的点
            # 为了将最远的点进行替换
            if max_index < 0:
                for j in range(k):
                    if max_dist < knn_list[j][0]:
                        max_index = j                            #记录它的坐标
                        max_dist = knn_list[max_index][0]

            # 如果当前k个最近邻居中存在点距离比当前点距离远,则替换
            if dist < max_dist:
                knn_list[max_index] = (dist,label)
                max_index = -1
                max_dist = 0

        # 统计选票(投票法)
        class_total = 10
        class_count = [0 for i in range(class_total)]
        for dist,label in knn_list:
            class_count[label] += 1

        # 找出最大选票标签
        predict.append(class_count.index(max(class_count)))
    return np.array(predict)

if __name__ == '__main__':
    print('Start read data')
    time_1 = time.time()
    raw_data = pd.read_csv('./train.csv', header=0)
    data = raw_data.values
    imgs = data[:300, 1:]
    #print(imgs.shape) #(42000, 324)
    labels = data[:300, 0]
    features = get_hog_features(imgs) #数据预处理
    print(features)
    #print(features.shape) #(42000, 324)
    train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33,
                                                                                random_state=23323)
    test_predict = Predict(test_features,train_features,train_labels)
    score = accuracy_score(test_labels,test_predict)
    print(score)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值