pythonknn
給樣本數據集T={2,4,10,12,3,20,22,21,11,24} t={18},K=4 1. N={2,4,10,12},d1=16,d2=14,d3=8,d4=6 2.d={3},比較,N={4,10,12,3},d1=14,d2=8,d3=6,d4=15 3.d={20},比較,N={4,10,12,20},d1=14,d2=8,d3=6,d4=2 4.d={22},比較,N={10,12,20,22},
B. 誰可以提供Python環境中用KNN手寫識別數據MNIST的讀取代碼
其實就是python怎麼讀取binnary
file
mnist的結構如下,選取train-images
TRAINING
SET
IMAGE
FILE
(train-images-idx3-ubyte):
[offset]
[type]
[value]
[description]
0000
32
bit
integer
0x00000803(2051)
magic
number
0004
32
bit
integer
60000
number
of
images
0008
32
bit
integer
28
number
of
rows
0012
32
bit
integer
28
number
of
columns
0016
unsigned
byte
??
pixel
0017
unsigned
byte
??
pixel
........
xxxx
unsigned
byte
??
pixel
也就是之前我們要讀取4個
32
bit
integer
試過很多方法,覺得最方便的,至少對我來說還是使用
struct.unpack_from()
filename
=
'train-images.idx3-ubyte'binfile
=
open(filename
,
'rb')buf
=
binfile.read()
先使用二進制方式把文件都讀進來
index
=
0magic,
numImages
,
numRows
,
numColumns
=
struct.unpack_from('>IIII'
,
buf
,
index)index
+=
struct.calcsize('>IIII')
然後使用struc.unpack_from
'>IIII'是說使用大端法讀取4個unsinged
int32
然後讀取一個圖片測試是否讀取成功
im
=
struct.unpack_from('>784B'
,buf,
index)index
+=
struct.calcsize('>784B')
im
=
np.array(im)im
=
im.reshape(28,28)
fig
=
plt.figure()plotwindow
=
fig.add_subplot(111)plt.imshow(im
,
cmap='gray')plt.show()
'>784B'的意思就是用大端法讀取784個unsigned
byte
完整代碼如下
import
numpy
as
npimport
structimport
matplotlib.pyplot
as
plt
filename
=
'train-images.idx3-ubyte'binfile
=
open(filename
,
'rb')buf
=
binfile.read()
index
=
0magic,
numImages
,
numRows
,
numColumns
=
struct.unpack_from('>IIII'
,
buf
,
index)index
+=
struct.calcsize('>IIII')
im
=
struct.unpack_from('>784B'
,buf,
index)index
+=
struct.calcsize('>784B')
im
=
np.array(im)im
=
im.reshape(28,28)
fig
=
plt.figure()plotwindow
=
fig.add_subplot(111)plt.imshow(im
,
cmap='gray')plt.show()
只是為了測試是否成功所以只讀了一張圖片
C. python knn能夠用來干嗎
如果你是在校生,你可以加入相關實驗室。如果不是的話,有些python論壇或者編程論壇你可以進去看看,有相關項目練手。像碼雲,github上有很多python項目,你可以申請加入,當然要求較高。也可以把python2的程序用python3寫(網上大多是用2寫的爬...
D. knn演算法算是一種python模型嗎
「演算法」不能算是「模型」,更不能說是「python模型」,因為python能實現的,c++、java等通用語言也能實現。
E. python 如何畫出KD數
簡單的KNN演算法在為每個數據點預測類別時都需要遍歷整個訓練數據集來求解距離,這樣的做法在訓練數據集特別大的時候並不高效,一種改進的方法就是使用kd樹來存儲訓練數據集,這樣可以使KNN分類器更高效。
KD樹的主要思想跟二叉樹類似,我們先來回憶一下二叉樹的結構,二叉樹中每個節點可以看成是一個數,當前節點總是比左子樹中每個節點大,比右子樹中每個節點小。而KD樹中每個節點是一個向量(也可能是多個向量),和二叉樹總是按照數的大小劃分不同的是,KD樹每層需要選定向量中的某一維,然後根據這一維按左小右大的方式劃分數據。在構建KD樹時,關鍵需要解決2個問題:(1)選擇向量的哪一維進行劃分(2)如何劃分數據。第一個問題簡單的解決方法可以是選擇隨機選擇某一維或按順序選擇,但是更好的方法應該是在數據比較分散的那一維進行劃分(分散的程度可以根據方差來衡量)。好的劃分方法可以使構建的樹比較平衡,可以每次選擇中位數來進行劃分,這樣問題2也得到了解決。下面是建立KD樹的Python代碼:
def build_tree(data, dim, depth):
"""
建立KD樹
Parameters
----------
data:numpy.array
需要建樹的數據集
dim:int
數據集特徵的維數
depth:int
當前樹的深度
Returns
-------
tree_node:tree_node namedtuple
樹的跟節點
"""
size = data.shape[0]
if size == 0:
return None
# 確定本層劃分參照的特徵
split_dim = depth % dim
mid = size / 2
# 按照參照的特徵劃分數據集
r_indx = np.argpartition(data[:, split_dim], mid)
data = data[r_indx, :]
left = data[0: mid]
right = data[mid + 1: size]
mid_data = data[mid]
# 分別遞歸建立左右子樹
left = build_tree(left, dim, depth + 1)
right = build_tree(right, dim, depth + 1)
# 返回樹的根節點
return Tree_Node(left=left,
right=right,
data=mid_data,
split_dim=split_dim)
對於一個新來的數據點x,我們需要查找KD樹中距離它最近的節點。KD樹的查找演算法還是和二叉樹查找的演算法類似,但是因為KD樹每次是按照某一特定的維來劃分,所以當從跟節點沿著邊查找到葉節點時候並不能保證當前的葉節點就離x最近,我們還需要回溯並在每個父節點上判斷另一個未查找的子樹是否有可能存在離x更近的點(如何確定的方法我們可以思考二維的時候,以x為原點,當前最小的距離為半徑畫園,看是否與劃分的直線相交,相交則另一個子樹中可能存在更近的點),如果存在就進入子樹查找。
當我們需要查找K個距離x最近的節點時,我們只需要維護一個長度為K的優先隊列保持當前距離x最近的K個點。在回溯時,每次都使用第K短距離來判斷另一個子節點中是否存在更近的節點即可。下面是具體實現的python代碼:
def search_n(cur_node, data, queue, k):
"""
查找K近鄰,最後queue中的k各值就是k近鄰
Parameters
----------
cur_node:tree_node namedtuple
當前樹的跟節點
data:numpy.array
數據
queue:Queue.PriorityQueue
記錄當前k個近鄰,距離大的先輸出
k:int
查找的近鄰個數
"""
# 當前節點為空,直接返回上層節點
if cur_node is None:
return None
if type(data) is not np.array:
data = np.asarray(data)
cur_data = cur_node.data
# 得到左右子節點
left = cur_node.left
right = cur_node.right
# 計算當前節點與數據點的距離
distance = np.sum((data - cur_data) ** 2) ** .5
cur_split_dim = cur_node.split_dim
flag = False # 標記在回溯時是否需要進入另一個子樹查找
# 根據參照的特徵來判斷是先進入左子樹還是右子樹
if data[cur_split_dim] > cur_data[cur_split_dim]:
tmp = right
right = left
left = tmp
# 進入子樹查找
search_n(left, data, queue, k)
# 下面是回溯過程
# 當隊列中沒有k個近鄰時,直接將當前節點入隊,並進入另一個子樹開始查找
if len(queue) < k:
neg_distance = -1 * distance
heapq.heappush(queue, (neg_distance, cur_node))
flag = True
else:
# 得到當前距離數據點第K遠的節點
top_neg_distance, top_node = heapq.heappop(queue)
# 如果當前節點與數據點的距離更小,則更新隊列(當前節點入隊,原第k遠的節點出隊)
if - 1 * top_neg_distance > distance:
top_neg_distance, top_node = -1 * distance, cur_node
heapq.heappush(queue, (top_neg_distance, top_node))
# 判斷另一個子樹內是否可能存在跟數據點的距離比當前第K遠的距離更小的節點
top_neg_distance, top_node = heapq.heappop(queue)
if abs(data[cur_split_dim] - cur_data[cur_split_dim]) < -1 * top_neg_distance:
flag = True
heapq.heappush(queue, (top_neg_distance, top_node))
# 進入另一個子樹搜索
if flag:
search_n(right, data, queue, k)525354555657
以上就是KD樹的Python實踐的全部內容,由於本人剛接觸python不久,可能實現上並不優雅,也可能在演算法理解上存在偏差,如果有任何的錯誤或不足,希望各位賜教。
F. 常用Python機器學習庫有哪些
Python作為一門理想的集成語言,將各種技術綁定在一起,除了為用戶提供更方便的功能之外,還是一個理想的粘合平台,在開發人員與外部庫的低層次集成人員之間搭建連接,以便用C、C++實現更高效的演算法。
使用Python編程可以快速遷移代碼並進行改動,無須花費過多的精力在修改代碼與代碼規范上。開發者在Python中封裝了很多優秀的依賴庫,可以直接拿來使用,常見的機器學習庫如下:
1、Scikit-Learn
Scikit-Learn基於Numpy和Scipy,是專門為機器學習建造的一個Python模塊,提供了大量用於數據挖掘和分析的工具,包括數據預處理、交叉驗證、演算法與可視化演算法等一系列介面。
Scikit-Learn基本功能可分為六個部分:分類、回歸、聚類、數據降維、模型選擇、數據預處理。其中集成了大量分類、回歸、聚類功能,包括支持向量機、邏輯回歸、隨機森林、樸素貝葉斯等。
2、Orange3
Orange3是一個基於組件的數據挖掘和機器學習軟體套裝,支持Python進行腳本開發。它包含一系列的數據可視化、檢索、預處理和建模技術,具有一個良好的用戶界面,同時也可以作為Python的一個模塊使用。
用戶可通過數據可視化進行數據分析,包含統計分布圖、柱狀圖、散點圖,以及更深層次的決策樹、分層聚簇、熱點圖、MDS等,並可使用它自帶的各類附加功能組件進行NLP、文本挖掘、構建網路分析等。
3、XGBoost
XGBoost是專注於梯度提升演算法的機器學習函數庫,因其優良的學習效果及高效的訓練速度而獲得廣泛的關注。XGBoost支持並行處理,比起同樣實現了梯度提升演算法的Scikit-Learn庫,其性能提升10倍以上。XGBoost可以處理回歸、分類和排序等多種任務。
4、NuPIC
NuPIC是專注於時間序列的一個機器學習平台,其核心演算法為HTM演算法,相比於深度學習,其更為接近人類大腦的運行結構。HTM演算法的理論依據主要是人腦中處理高級認知功能的新皮質部分的運行原理。NuPIC可用於預測以及異常檢測,使用面非常廣,僅要求輸入時間序列即可。
5、Milk
Milk是Python中的一個機器學習工具包。Milk注重提升運行速度與降低內存佔用,因此大部分對性能敏感的代碼都是使用C++編寫的,為了便利性在此基礎上提供Python介面。重點提供監督分類方法,如SVMs、KNN、隨機森林和決策樹等。
G. python,knn演算法的筆跡識別,總有地方報錯,求大神幫忙
你想把這個參數的值列印出來,但參數並不存在,最簡單的方法,把這句列印的語句注釋掉
H. 如何用python實現knn演算法
1. 數據分類:離散型標簽 2. 數據回歸:連續型標簽 近鄰演算法的准則是:尋找接近新數據點的訓練樣本的數目,根據訓練樣本的信息來預測新數據點的某些信息。
I. 新手學習PYTHON中KNN演算法的手寫識別出現問題 求助
參考了其他博主的代碼 想試著運行 然後去理解。結果一直報錯,希望大神幫幫忙。
import numpy as np
import os
import kNN
def img2vector(filename):
"""函數將以文本格式出現的32*32的0-1圖片,轉變成一維特徵數組,返回一維數組
Keyword argument:
filename -- 文本格式的圖片文件
"""
imgvect = np.zeros((1, 1024))
fr = open(filename)
for i in range(32):
linestr = fr.readline()
for j in range(32):
imgvect[0, 32*i + j] = int(linestr[j])
return imgvect
def handwriteClassfiy(testfile, trainfile, k):
"""函數將trainfile中的文本圖片轉換成樣本特徵集和樣本類型集,用testfile中的測試樣本測試,無返回值
Keyword argument:
testfile -- 測試圖片目錄
trainfile -- 樣本圖片目錄
"""
trainFileList = os.listdir(trainfile)
trainFileSize = len(trainFileList)
labels = []
trainDataSet = np.zeros((trainFileSize, 1024))
for i in range(trainFileSize):
filenameStr = trainFileList[i]
digitnameStr = filenameStr.split('.')[0]
digitLabels = digitnameStr.split('_')[0]
labels.append(digitLabels)
trainDataSet[i, :] = img2vector(trainfile + '/' + filenameStr)
testFileList = os.listdir(testfile)
testNumber = len(testFileList)
errorcount = 0.0
for testname in testFileList:
testdigit = img2vector(testfile + '/' + testname)
classifyresult = kNN.classfiy(testdigit, trainDataSet, labels, k)
testStr = testname.split('.')[0]
testDigitLabel = testStr.split('_')[0]
if classifyresult != testDigitLabel:
errorcount += 1.0
#print('this test real digit is:%s, and the result is: %s' % (testDigitLabel, classifyresult))
print('k = %d, errorRatio is: %f' % (k, errorcount/float(testNumber)))
return
if __name__ == '__main__':
filename = 'C:/Users/lx/Desktop/MachineLearning-master/kNN/use Python and NumPy/testDigits/0_1.txt'
traindir= 'C:/Users/lx/Desktop/MachineLearning-master/kNN/use Python and NumPy/trainingDigits'
testdir = 'C:/Users/lx/Desktop/MachineLearning-master/kNN/use Python and NumPy/testDigits'
handwriteClassfiy(testdir, traindir, 3)
錯誤提示Traceback (most recent call last):
File "kNN.py", line 56, in <mole>
handwriteClassfiy(testdir, traindir, 3)
File "kNN.py", line 43, in handwriteClassfiy
classifyresult = kNN.classfiy(testdigit, trainDataSet, labels, k)
AttributeError: mole 'kNN' has no attribute 'classfiy'
你這個文件是不是就叫 kNN.py ?如果是的話那你這個裡面根本就沒有 classfiy 這個屬性,當然會報錯。
另外,import kNN 是 import 自己?