1. 程式人生 > >使用KNN對MNIST資料集進行實驗

使用KNN對MNIST資料集進行實驗

之前使用SVM對MNIST資料集進行了分類實驗,得到了98.46%的分類正確率(見:使用libsvm對MNIST資料集進行實驗)。

今天用python寫了個小程式,來測試一下KNN的分類效果。

由於KNN的計算量太大,還沒有使用KD-tree進行優化,所以對於60000訓練集,10000測試集的資料計算比較慢。這裡只是想測試觀察一下KNN的效果而已,不調參。

K選擇之前看過貌似最好不要超過20,因此,此處選擇了K=10,距離為歐式距離。如果需要改進,可以再調整K來選擇最好的成績。

先跑了一遍不經過scale的,也就是直接使用畫素灰度值來計算歐式距離進行比較。發現開始基本穩定在95%的正確率上,嚇了一跳。因為本來覺得KNN算是沒有怎麼“學習”的機器學習演算法了,猜測它的特點可能會是在任何情況下都可以用,但都表現的不是最好。所以估計在60%~80%都可以接受。沒想到能基本穩定在95%上,確定演算法和程式碼沒什麼問題後,突然覺得是不是這個資料集比較沒挑戰性。。。

去MNIST官網(http://yann.lecun.com/exdb/mnist/),上面掛了以該資料集為資料的演算法的結果比較。查看了一下KNN,發現有好多,而且錯誤率基本都在5%以內,甚至能做到1%以內。唔。

跑的結果是,正確率:96.687%。也就是說,錯誤率error rate為3.31%左右。

再跑一下經過scale的資料,即對灰度資料歸一化到[0,1]範圍內。看看效果是否有所提升。

經過scale,最終跑的結果是,正確率:竟然也是96.687%! 也就是說,對於該資料集下,對KNN的資料是否進行歸一化並無效果!

在跑scale之前,個人猜測:由於一般對資料進行處理之前都進行歸一化,防止高維詛咒(在784維空間中很容易受到高維詛咒)。因此,預測scale後會比前者要好一些的。但是,現在看來二者結果相同。也就是說,對於K=10的KNN演算法中,對MNIST的預測一樣的。

對scale前後的正確率相同的猜測:由於在訓練集合中有60000個數據點,因此0-9每個分類平均都有6000個數據點,在這樣的情況下,對於測試資料集中的資料點,相臨近的10個點中大部分都是其他分類而導致分類錯誤的概率會比較地(畢竟10相對與6000來說很小),所以,此時,KNN不僅可以取得較好的分類效果,而且對於是否scale並不敏感,效果相同。

程式碼如下:

#KNN for MNIST
from numpy import *
import operator

def line2Mat(line):
	line = line.strip().split(' ')
	label = line[0]
	mat = []
	for pixel in line[1:]:
		pixel = pixel.split(':')[1]
		mat.append(float(pixel))
	return mat, label

#matrix should be type: array. Or classify() will get error.
def file2Mat(fileName):
	f = open(fileName)
	lines = f.readlines()
	matrix = []
	labels = []
	for line in lines:
		mat, label = line2Mat(line)
		matrix.append(mat)
		labels.append(label)
	print 'Read file '+str(fileName) + ' to matrix done!'
	return array(matrix), labels

#classify mat with trained data: matrix and labels. With KNN's K set.
def classify(mat, matrix, labels, k):
	diffMat = tile(mat, (shape(matrix)[0], 1)) - matrix
	#diffMat = array(diffMat)
	sqDiffMat = diffMat ** 2
	sqDistances = sqDiffMat.sum(axis=1)
	distances = sqDistances ** 0.5
	sortedDistanceIndex = distances.argsort()
	classCount = {}
	for i in range(k):
		voteLabel = labels[sortedDistanceIndex[i]]
		classCount[voteLabel] = classCount.get(voteLabel,0) + 1
	sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),reverse=True)
	return sortedClassCount[0][0]
	
def classifyFiles(trainMatrix, trainLabels, testMatrix, testLabels, K):
	rightCnt = 0
	for i in range(len(testMatrix)):
		if i % 100 == 0:
			print 'num '+str(i)+'. ratio: '+ str(float(rightCnt)/(i+1))
		label = testLabels[i]
		predictLabel = classify(testMatrix[i], trainMatrix, trainLabels, K)
		if label == predictLabel:
			rightCnt += 1
	return float(rightCnt)/len(testMatrix)

trainFile = 'train_60k.txt'
testFile = 'test_10k.txt'
trainMatrix, trainLabels = file2Mat(trainFile)
testMatrix, testLabels = file2Mat(testFile)
K = 10
rightRatio = classifyFiles(trainMatrix, trainLabels, testMatrix, testLabels, K)
print 'classify right ratio:' +str(right)


相關推薦

使用KNNMNIST資料進行實驗

之前使用SVM對MNIST資料集進行了分類實驗,得到了98.46%的分類正確率(見:使用libsvm對MNIST資料集進行實驗)。 今天用python寫了個小程式,來測試一下KNN的分類效果。 由於KNN的計算量太大,還沒有使用KD-tree進行優化,所以對於60000訓練

使用libsvmMNIST資料進行實驗

svm_type c_svc kernel_type linear 使用線性分類器 nr_class 2二分類 total_sv 15支援向量個數 rho 0.307309 label 1 -1 nr_sv 8 7正負類的支援向量(SV)個數 SV 1 1:7.213038 2:0.198066  1 1:-

使用Decision TreeMNIST資料進行實驗

之前已經對MNIST使用過SVM和KNN的方法進行分類,效果看起來還不錯。今天使用決策樹來實驗,看看結果如何。 使用的Decision Tree中,對MNIST中的灰度值進行了0/1處理,方便來進行分類和計算熵。 使用較少的測試資料測試了在對灰度值進行多分類的情況下,分類結

Tensorflow學習教程------利用卷積神經網路mnist資料進行分類_利用訓練好的模型進行分類

#coding:utf-8 import tensorflow as tf from PIL import Image,ImageFilter from tensorflow.examples.tutorials.mnist import input_data def imageprepare(ar

Bobo老師機器學習筆記第七課-使用PCAMNIST資料進行降噪

問題1:什麼是MNIST資料集?   MNIST 資料集來自美國國家標準與技術研究所, National Institute of Standards and Technology (NIST). 訓練集 (training set) 由來自 250 個不同人手寫的數字構成

TensorFlow深度學習實戰(一):AlexNetMNIST資料進行分類

概要 進來一段時間在看深度學習中經典的CNN模型相關論文。同時,為了督促自己學習TensorFlow,通讀論文之後開始,利用TensorFlow實現各個模型,復現相關實驗。這是第一篇論文講解的是AlexNet,論文下載網址為:ImageNet Classific

Tensorflow(五)使用CNNMNIST資料進行分類

在tensorflow(二)中對MNIST資料集進行分類使用單層神經網路,梯度下降法以0.2的學習因子迭代了100次取得了92%的準確率,這個網路很簡單,使用較大的學習因子也不會出現梯度爆炸或者梯度消失的情況,但是在複雜些的網路,比如這裡用到的三層CNN網路使用0.2的學習因

深度學習入門教程UFLDL學習實驗筆記二:使用向量化MNIST資料做稀疏自編碼

今天來做UFLDL的第二個實驗,向量化。我們都知道,在matlab裡面基本上如果使用for迴圈,程式是會慢的一逼的(可以說基本就執行不下去)所以在這呢,我們需要對程式進行向量化的處理,所謂向量化就是將matlab裡面所有的for迴圈用矩陣運算的方法實現,在這裡呢,因為之前的實驗我已經是按照向量化的形式編寫的程

R_Studio(關聯)Groceries資料進行關聯分析

          RGui的arules程式包裡含有Groceries資料集,該資料集是某個雜貨店一個月真實的交易記錄,共有9835條消費記錄,169個商品     #install.packages("arules") libra

[譯]使用 Pandas Kaggle 資料進行統計資料分析

原文地址:EXPLORATORY STATISTICAL DATA ANALYSIS WITH A KAGGLE DATASET USING PANDAS 原文作者:Strikingloo 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold-m…

keras RNN、LSTMIMDB資料進行分類

本文介紹如何基於keras採用RNN和LSTM對IMDB資料集進行分類。 示例程式碼: from keras.layers import SimpleRNN from keras.models import Sequential from keras.layers import Embedd

利用softmax函式mnist資料簡單分類

mnist資料集的特點 每一張圖片包含28**28個畫素,我們把這一個陣列展開成一個向量,長度是28*28=784。因此在 MNIST訓練資料集中mnist.train.images 是一個形狀為 [60000, 784] 的張量,第一個維度數字用 來索引圖片

[PyTorch小試牛刀]實戰三·DNN實現邏輯迴歸FashionMNIST資料進行分類

[PyTorch小試牛刀]實戰三·DNN實現邏輯迴歸對FashionMNIST資料集進行分類 內容還包括了網路模型引數的保存於載入。 資料集 下載地址 程式碼部分 import torch as t import torchvision as tv import numpy as n

樸素貝葉斯鳶尾花資料進行分類

注:本人純粹為了練手熟悉各個方法的用法 使用高斯樸素貝葉斯對鳶尾花資料進行分類 程式碼: 1 # 通過樸素貝葉斯對鳶尾花資料進行分類 2 3 from sklearn import datasets 4 from sklearn.model_selection import train_

LSTMMNIST資料做分類

https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-08-RNN2/ 1.設定 RNN 的引數 RNN 從每張圖片的第一行畫素讀到最後一行, 然後再進行分類判斷. (1)匯入 MN

Unigram 和bigram yelp資料進行垃圾評論識別分類 python

依舊是對yelp資料集處理,之前效果不理想,後來仔細看了論文,用的是SVMlight分類器…(使用方法見上一篇文章),效果就差不多了。。。。 過程就是對英文進行處理(去停用,去高頻和低頻),化為詞袋模型,處理成SVMlight的格式,進行分類。貼部分程式碼。

R語言MNIST資料分析:探索手寫數字分類

資料科學和機器學習之間區別的定義:資料科學專注於提取洞察力,而機器學習對預測有興趣。我還注意到這兩個領域大相徑庭:我在我的工作中同時使用了機器學習和資料科學:我可能會使用堆疊溢位流量資料的模型來確定哪些使用者可能正在尋找工作(機器學習),但是會構建摘要和視覺化來檢查為什麼(資

利用mnist資料進行深度神經網路

初始神經網路 這裡要解決的問題是,將手寫數字的灰度影象(28 畫素 x28 畫素)劃分到 10 個類別中(0~9)。我們將使用 MINST 資料集,它是機器學習領域的一個經典資料集,其歷史幾乎和這個領域一樣長,而且已被人們深入研究。這個資料集包含 60000 張訓練影象和 10000 張測試影象,由美國國家

TensorFlow學習筆記(1):使用softmax手寫體數字(MNIST資料進行識別

使用softmax實現手寫體數字識別完整程式碼如下: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input

使用PCA資料進行降維

使用PCA對資料集進行降維 一、實驗準備 1、實驗內容和目的 使用主成分分析(PCA)對鳶尾花資料集進行降維操作,其中要求繪製出降維後的資料分佈散點圖並說明降維後的維度,提取的主成分的特徵值 其中資料集檔案為iris.data.txt。