python機器學習之KNN算法


K鄰近算法(kNeighbrClassifier/KNN):原理為 歐幾里得距離+最近+投票(權重)+概率

  根據距離的遠近進行分類

  歐幾里得距離:多維空間中各點之間的距離

   

  缺點:時間復雜度和空間復雜度較大

  意:當訓練樣本數據少的時候,樣本比例一定要相同;訓練的數據不能是string

  KNN算法分類電影

 
import numpy import pandas   #導入Excel文件

from sklearn.neighbors import KNeighborsClassifier   #機器學習算法庫,沒有深度學習算法
 movie=pandas.read_excel(r"D:\Python\代碼\Machine-Learn\1-KNN\data\movie.xlsx",sheet_name=0) movie

 

 
  電影名稱 武打鏡頭 接吻鏡頭 分類情況
0 大話西游 36 1 動作片
1 殺破狼 43 2 動作片
2 前任3 0 10 愛情片
3 戰狼2 59 1 動作片
4 泰坦尼克號 1 15 愛情片
5 新余心願 2 19 愛情片
movie=pandas.read_excel(r"D:\Python\代碼\Machine-Learn\1-KNN\data\movie.xlsx",sheet_name=0) x=movie[["武打鏡頭","接吻鏡頭"]]    #取出訓練數據中的訓練數據
y=movie["分類情況"]                 #取出目標值
knn=KNeighborsClassifier(n_neighbors=5) knn.fit(x,y) #訓練數據 #預測電影《飛車》武打鏡頭50,接吻鏡頭2
x_text=pandas.DataFrame({"武打鏡頭":[50,3],"接吻鏡頭":[2,50]}) x_text
  武打鏡頭 接吻鏡頭
0 50 2
1 3 50
get_result=knn.predict(x_text) get_proba=knn.predict_proba(x_text) print("概率:{}".format(get_proba)) print("分類結果:{}".format(get_result))

概率:[[0.6 0.4] [0.4 0.6]] 分類結果:['動作片' '愛情片']

電影分類運行原理

s=((movie["武打鏡頭"]-50)**2+(movie["接吻鏡頭"]-2)**2)**0.5     #根據knn算法求距離
index=s.sort_values().index     #先將數據排序然后取出索引
fljg=movie["分類情況"][index[:5]] print("\n{}".format(index),"\n分類:\n{}".format(fljg))

Int64Index([1, 3, 0, 2, 4, 5], dtype='int64') 分類: 1 動作片 3 動作片 0 動作片 2 愛情片 4 愛情片 Name: 分類情況, dtype: object

識別梵文

import numpy import os import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsClassifier img=plt.imread(r"D:\Python\代碼\Machine-Learn\1-KNN\data\手寫字母測試與訓練\梵文識別學習\Test\character_1_ka\1339.png") plt.imshow(img,cmap=plt.cm.gray)

<matplotlib.image.AxesImage at 0x1af31dcc048>
      

 

#將讀取的圖片保存到數組data中
def img_read(dir_name,data): for filename in os.listdir(dir_name): img=plt.imread(dir_name+"\\"+filename) data.append(img) def readTain():      #獲取訓練數據
    data=[] dir_path=r"D:\Python\代碼\Machine-Learn\1-KNN\data\手寫字母測試與訓練\梵文識別學習\Train"
    for dir_name in os.listdir(dir_path)[36:]: dir_name=dir_path+"\\"+dir_name img_read(dir_name,data) return data def readTest():     #獲取測試數據
    data_test=[] dir_test_path=r"D:\Python\代碼\Machine-Learn\1-KNN\data\手寫字母測試與訓練\梵文識別學習\Test"
    for dir_name in os.listdir(dir_test_path)[36:]: dir_name=dir_test_path+"\\"+dir_name img_read(dir_name,data_test) return data_test x=readTain()        #訓練數據
train_x=numpy.array(x) train_x_shape={} train_x_shape["圖片數量"]=test_x.shape[0] train_x_shape["寬度"]=str(test_x.shape[1])+"px" train_x_shape["高度"]=str(test_x.shape[2])+"px" train_x_shape

 

{'圖片數量': 3000, '寬度': '32px', '高度': '32px'}

x=readTest()       #測試數據
ndarray_x=numpy.array(x) # 隨機抽樣測試數據
index=numpy.random.randint(0,3000,size=1000) test_x=ndarray_x[index] test_x_shape={} test_x_shape["圖片數量"]=test_x.shape[0] test_x_shape["寬度"]=str(test_x.shape[1])+"px" test_x_shape["高度"]=str(test_x.shape[2])+"px" test_x_shape

 

{'圖片數量': 1000, '寬度': '32px', '高度': '32px'}

# 對應的數字
num=[0,1,2,3,4,5,6,7,8,9]*300 test_y=numpy.array(num) test_y.sort() test_y=test_y[index] test_y

 

array([0, 9, 8, 0, 3, 3, 0, 6, 6, 2, 1, 0, 2, 9, 0, 5, 5, 1, 7, 3, 1, 9,
       7, 3, 0, 8, 8, 4, 0, 5, 7, 7, 4, 3, 3, 1, 8, 2, 6, 1, 5, 0, 8, 6,
       0, 2, 7, 4, 3, 1, 9, 8, 9, 4, 2, 7, 5, 3, 0, 5, 9, 4, 1, 8, 5, 7,
       6, 5, 0, 9, 9, 1, 4, 9, 9, 5, 2, 6, 4, 6, 2, 2, 2, 6, 7, 7, 4, 3,
       8, 7, 2, 5, 4, 2, 6, 0, 9, 9, 5, 8, 4, 3, 7, 5, 0, 1, 5, 7, 1, 3,
       3, 9, 5, 8, 6, 6, 7, 5, 6, 5, 1, 6, 0, 3, 6, 3, 5, 3, 4, 5, 8, 9,
       7, 2, 3, 9, 5, 6, 6, 0, 3, 2, 3, 5, 8, 8, 8, 2, 3, 0, 7, 9, 6, 0,
       9, 8, 8, 6, 6, 6, 9, 2, 8, 6, 6, 7, 4, 6, 1, 7, 2, 4, 2, 6, 6, 7,
       9, 4, 9, 0, 7, 6, 6, 7, 9, 9, 5, 3, 1, 1, 8, 1, 0, 6, 6, 3, 5, 4,
       7, 3, 3, 5, 0, 3, 1, 9, 2, 9, 7, 0, 6, 1, 2, 6, 4, 2, 3, 0, 4, 3,
       4, 9, 2, 6, 8, 4, 2, 1, 5, 1, 0, 7, 9, 2, 4, 8, 4, 4, 5, 0, 4, 1,
       1, 5, 0, 4, 4, 7, 4, 1, 2, 1, 0, 1, 2, 5, 6, 6, 1, 7, 6, 7, 6, 5,
       0, 2, 4, 8, 7, 7, 9, 8, 1, 7, 9, 8, 5, 0, 2, 9, 7, 8, 2, 0, 5, 4,
       3, 3, 6, 1, 4, 5, 9, 9, 5, 4, 0, 9, 9, 4, 3, 9, 8, 2, 3, 5, 6, 4,
       8, 5, 0, 2, 6, 5, 5, 7, 2, 1, 8, 6, 4, 7, 9, 7, 2, 6, 4, 4, 3, 9,
       5, 4, 4, 0, 5, 1, 5, 8, 9, 6, 5, 3, 2, 3, 4, 1, 6, 0, 0, 8, 1, 3,
       0, 4, 0, 6, 5, 9, 0, 8, 7, 5, 4, 2, 0, 3, 8, 4, 3, 2, 0, 5, 0, 8,
       3, 1, 2, 5, 6, 3, 6, 0, 5, 9, 9, 8, 2, 3, 2, 1, 4, 6, 1, 7, 9, 2,
       1, 5, 4, 1, 3, 3, 9, 5, 1, 4, 0, 1, 7, 2, 4, 3, 4, 0, 0, 0, 3, 5,
       0, 4, 3, 5, 3, 0, 7, 7, 5, 1, 7, 2, 5, 8, 0, 0, 5, 1, 9, 5, 8, 8,
       5, 4, 9, 7, 4, 2, 9, 2, 9, 5, 8, 8, 4, 9, 7, 1, 5, 1, 1, 0, 6, 9,
       1, 6, 3, 3, 7, 1, 6, 0, 7, 8, 7, 3, 6, 7, 9, 1, 1, 1, 8, 8, 8, 9,
       1, 4, 5, 1, 0, 7, 3, 2, 9, 3, 7, 7, 1, 7, 6, 8, 3, 8, 3, 0, 4, 3,
       1, 0, 3, 3, 2, 5, 6, 6, 6, 2, 9, 4, 6, 3, 7, 6, 1, 8, 8, 4, 2, 6,
       3, 7, 8, 0, 6, 4, 4, 9, 9, 2, 3, 5, 9, 2, 1, 4, 3, 9, 5, 8, 9, 5,
       5, 2, 2, 7, 4, 5, 4, 6, 4, 0, 5, 9, 6, 4, 6, 9, 2, 0, 4, 6, 6, 7,
       5, 8, 8, 8, 5, 8, 9, 0, 0, 3, 2, 7, 7, 3, 3, 4, 5, 2, 3, 3, 1, 0,
       9, 1, 1, 8, 1, 3, 9, 8, 7, 1, 6, 9, 1, 7, 8, 4, 9, 5, 6, 4, 2, 3,
       8, 3, 4, 8, 3, 8, 7, 5, 5, 0, 6, 2, 9, 8, 6, 6, 6, 5, 2, 9, 0, 1,
       8, 1, 2, 6, 6, 6, 5, 4, 3, 2, 0, 6, 6, 3, 4, 5, 3, 8, 6, 4, 5, 4,
       7, 6, 5, 4, 5, 8, 9, 4, 5, 5, 2, 5, 1, 5, 6, 4, 4, 1, 4, 1, 9, 8,
       8, 7, 1, 9, 3, 5, 2, 5, 8, 0, 2, 7, 2, 2, 7, 5, 8, 0, 6, 0, 7, 0,
       4, 2, 8, 6, 3, 3, 3, 8, 3, 6, 7, 5, 3, 9, 3, 8, 5, 8, 6, 2, 2, 0,
       1, 9, 2, 6, 2, 8, 6, 0, 7, 0, 3, 4, 9, 4, 1, 2, 2, 3, 5, 5, 7, 9,
       9, 7, 0, 6, 5, 8, 3, 1, 6, 8, 4, 1, 6, 7, 3, 9, 5, 1, 4, 5, 7, 1,
       0, 5, 9, 4, 9, 5, 3, 6, 2, 2, 2, 3, 9, 0, 0, 2, 3, 2, 9, 9, 1, 8,
       4, 7, 1, 1, 2, 4, 3, 4, 9, 7, 4, 7, 8, 6, 0, 4, 8, 7, 0, 6, 0, 5,
       4, 0, 9, 7, 2, 9, 4, 0, 3, 0, 8, 4, 3, 5, 4, 5, 2, 2, 2, 7, 9, 0,
       7, 2, 1, 5, 3, 6, 5, 3, 3, 1, 3, 4, 6, 4, 1, 5, 7, 7, 0, 7, 0, 3,
       1, 2, 2, 3, 6, 1, 8, 3, 9, 5, 9, 7, 7, 8, 4, 3, 0, 1, 5, 1, 7, 5,
       8, 5, 8, 5, 1, 7, 4, 8, 0, 2, 8, 8, 3, 2, 8, 6, 2, 1, 0, 2, 7, 3,
       4, 2, 6, 3, 3, 9, 9, 1, 8, 9, 7, 4, 9, 8, 4, 4, 7, 0, 7, 0, 2, 0,
       0, 2, 8, 7, 3, 6, 6, 2, 4, 2, 0, 4, 9, 0, 4, 3, 7, 5, 7, 7, 2, 6,
       9, 3, 1, 0, 4, 1, 7, 8, 4, 5, 1, 4, 1, 0, 9, 3, 9, 3, 7, 1, 9, 2,
       0, 2, 5, 2, 9, 1, 6, 0, 2, 1, 8, 5, 0, 1, 8, 2, 0, 0, 8, 3, 1, 1,
       9, 5, 9, 7, 5, 6, 5, 7, 1, 1])

# 對應的數字
num=[0,1,2,3,4,5,6,7,8,9]*1700 train_y=numpy.array(num) train_y.sort() train_y

 

array([0, 0, 0, ..., 9, 9, 9])

# 將三維數據變為二維,fit訓練數據不支持二維以上數據
train_x.reshape(17000,1024) test_x.reshape(1000,1024)

 

array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]], dtype=float32)

# %%time # 訓練數據
knn=KNeighborsClassifier(n_neighbors=5) knn.fit(train_x.reshape(17000,-1),train_y)

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=5, p=2, weights='uniform')

# %%time # 獲得結果
y_result=knn.predict(test_x.reshape(1000,1024)) print("預測結果:\n{}".format(y_result[500:700]),"\n實際結果:\n{}".format(test_y[500:700]))

 

預測結果:
[6 3 2 8 5 0 2 8 4 3 7 2 7 7 9 1 5 3 4 0 9 5 2 0 5 2 0 0 0 8 0 9 0 4 9 9 4
 1 3 6 0 8 6 4 6 8 2 0 7 3 2 5 6 1 4 7 7 4 5 9 7 9 0 7 0 2 1 8 7 5 4 9 2 4
 7 9 8 2 6 7 3 1 6 9 6 8 7 0 1 0 2 2 0 3 3 0 5 9 5 2 2 8 2 9 7 9 8 3 9 8 9
 0 7 4 2 4 9 0 3 4 3 8 6 2 2 9 5 3 1 8 2 5 1 3 7 2 7 3 2 8 1 3 5 2 1 7 9 4
 4 6 9 2 9 8 9 4 5 2 2 9 1 4 9 1 9 4 1 7 2 1 2 0 3 1 8 3 5 9 0 8 3 6 6 8 1
 6 1 2 0 0 0 2 1 0 5 7 9 2 7 9] 
實際結果:
[6 3 2 8 5 0 2 8 4 3 7 2 7 7 9 1 5 3 4 6 9 5 2 0 3 2 0 0 0 8 0 9 0 4 9 9 4
 1 3 6 0 8 6 4 6 8 2 0 7 3 2 5 6 1 4 7 7 4 5 9 7 9 0 7 0 2 1 8 7 5 4 9 2 4
 7 9 8 2 6 7 3 1 6 9 6 8 7 0 1 0 2 2 0 3 3 0 5 9 5 2 2 8 2 9 7 9 8 3 9 8 9
 0 7 4 2 4 9 0 3 4 3 8 6 2 2 9 3 3 1 8 2 5 1 3 7 2 7 3 2 8 1 3 5 2 1 7 9 4
 4 6 9 2 9 8 9 4 5 5 2 9 1 4 9 1 9 4 1 7 2 1 2 0 3 1 8 3 5 9 0 8 3 6 6 8 1
 6 1 2 0 0 0 2 1 0 5 7 9 2 7 9]


# 准確率
acc=(test_y==y_result).mean() print("准確率為:{}".format(acc))

准確率為:0.984

提高准確率

# 准確率與鄰居數無關
knn=KNeighborsClassifier(n_neighbors=10) knn.fit(train_x.reshape(17000,-1),train_y) # score()方法既可以預測還可以求出准確率
knn.score(test_x.reshape(1000,1024),test_y)
0.974

# 改變權重為鄰居數距離越近權重越高,距離越遠權重越低;有的時候可以提高,有的時候不能提高
knn=KNeighborsClassifier(n_neighbors=5,weights="distance") knn.fit(train_x.reshape(17000,-1),train_y) # score()方法既可以預測還可以求出准確率
knn.score(test_x.reshape(1000,1024),test_y)
0.981
# p=1,使用曼哈頓距離為算法核心 # n_jobs是進程數,當=-1時,CPU有幾個核就開啟幾個進程,提高運行速度
knn=KNeighborsClassifier(n_neighbors=5,weights="distance",n_jobs=-1) knn.fit(train_x.reshape(17000,-1),train_y) # score()方法既可以預測還可以求出准確率
knn.score(test_x.reshape(1000,1024),test_y)
0.981


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM