#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)
西瓜书第十章降维KNN算法(10邻居)代码复现
最新推荐文章于 2024-10-12 12:26:23 发布