KNN演算法之集美大學

  • 2022 年 10 月 31 日
  • 筆記

 在本篇文章中,我即將以在集美大學收集到的一些數據集為基礎,使用KNN演算法進行一系列的操作

一、KNN演算法

  首先,什麼是KNN演算法呢,這得用到老祖宗說的一句話「近朱者赤近墨者黑」,簡單來講就是,一個物體它靠近什麼,我們也可以認為它就是什麼。此演算法運用廣泛,生活中就有體現。比如,你是否發現,你好朋友刷到的抖音影片,你也可能提前刷到過,這就是KNN。

​  KNN也叫K近鄰(K-Nearest Neighbor, KNN)是一種最經典和最簡單的有監督學習方法之一。K-近鄰演算法是最簡單的分類器,沒有顯式的學習過程或訓練過程,是懶惰學習(Lazy Learning)。當對數據的分布只有很少或者沒有任何先驗知識時,K 近鄰演算法是一個不錯的選擇。

二、K自製數據集(基於集美大學)

  集美大學於1918年始建,這所大學的名字很有意思,單純從字面上看,這是一所集美麗於一身的大學。集美大學也正如名字所說,不僅學校美,周圍的環境也跟著美。因為這所大學所在的地區被當地叫做集美學村,這個集美學村是一個旅遊區,其中還包含了許多學府,從小學到大學一應俱全,集美大學就在其中,這裡給人的感覺很大很美,既適合出行旅遊觀光,又是學術氛圍濃厚之地。在集美大學讀書感覺猶如在旅遊一般,對於學生來說是一種美好的享受。

  眾所周知,航海是集美大學的特色專業,我運用Excel手動製作了一些數據,內容為航海學院和其他學院的學生數據差異。航海學院紀律嚴格,判斷一個學生是不是航海學院的學子可以從以下角度分析:clothes color(航海學院身穿制度,顏色較為統一),hair length,height。如果是航海學院則nautical college置為1。還有數據三維散點圖如下。

    

 

 

 

 

 

三、程式碼部分(主要運用了sklearn,pandas工具包)

 

 1.預測

    file = "sklearn/file/JMU.csv"
    data = pd.read_csv(file)
    lable = data.iloc[:, -1]
    feature = data.iloc[:, :3]
    # 2.劃分數據集
    x_train, x_test, y_train, y_test = train_test_split(feature, lable, test_size=0.2)
    #網格搜索和交叉驗證
    para_dic={"n_neighbors":[i for i in range(1,20)]}
    estimator=KNeighborsClassifier()
    estimator=GridSearchCV(estimator,param_grid=para_dic)
    estimator.fit(x_train,y_train)
    # 模型評估
    #1.比對真實值與預測值
    # y_pre=estimator.predict(x_test)
    # print("y_pre:\n",y_pre)
    # print(y_pre==y_test)
    #2.計算準確率
    score=estimator.score(x_test,y_test)
    print("準確率:\n",score)

    # 最佳參數
    print("最佳參數:\n",estimator.best_params_)
    # 最佳結果
    print("最佳結果:\n",estimator.best_score_)
    # 最佳估計器
    print("最佳估計器:\n",estimator.best_estimator_)

準確率:
0.9166666666666666
最佳參數:
{'n_neighbors': 1}
最佳結果:
0.8936170212765957
最佳估計器:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=1, p=2,
weights='uniform')

Process finished with exit code 0

2.作圖

    x = data.iloc[:, 0]
    y = data.iloc[:, 1]
    z = data.iloc[:, 2]
    # 繪製散點圖
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.scatter(x, y, z, color='r')

    # 添加坐標軸(順序是Z, Y, X)
    ax.set_zlabel('height', fontdict={'size': 15, 'color': 'red'})
    ax.set_ylabel('hair length', fontdict={'size': 15, 'color': 'red'})
    ax.set_xlabel('clothes color', fontdict={'size': 15, 'color': 'red'})
    plt.show()

3.結果分析

通過網格搜索1到20的K值結果可知,最優K取值為1。也就是說找最近的一位同學是否屬於航海學院,就能大概率判斷這位未知同學是否也為海院學子。

思考,為什麼會是K=1呢,通過散點圖可以清楚看出,海院學子特徵比較集中,所以只要距離海院學子特徵最近,就大概率為海院學子。

Tags: