1. 程式人生 > >NLP自然語言處理例項:預測天氣冷暖

NLP自然語言處理例項:預測天氣冷暖

NLP:自然語言處理(Natural Language Processing)是人工智慧和語言學領域的分支學科。主要包括自然語言理解和生成,自然語言理解系統把自然語言轉化為計算機程式更易於處理的形式即讓電腦懂人類的語言。自然語言生成系統把計算機資料轉化自然語言。

處理過程:形式化描述->數學模型演算法化->程式化->實用化

使用Python語言,首先需要安裝numpy、matplotlib庫(也可以安裝Anaconda實現)

KNN演算法實現預測功能

KNN(K-nearest Neighbor)鄰近演算法,或者說K最近鄰(kNN,k-NearestNeighbor)分類演算法是

資料探勘分類技術中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。

KNN演算法思想

  1. 計算一直類別中資料集的點與當前點的距離
  2. 計算樣本距離並排序
  3. 選取距離樣本最近的K個點
  4. 確定K個點所在類別的出現頻率
  5. 返回K個點出現頻率最高的類別作為預測結果

KNN演算法模型流程與實現

1. 蒐集資料:資料採集過程,分為非結構化資料和結構化資料,如網路爬蟲,資料庫,檔案等

2.準備資料:格式化處理,對不同類別的資料進行處理,如轉為統一csv格式

3.分析資料:主要看資料特點,有沒有缺失,資料離散性還是連續性,進而選擇不同模型

跟著網上視訊敲的程式碼,完整如下

# coding:utf-8
"""
NLP 自然語言學習
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import math,operator
# 中文亂碼
myfont =fm.FontProperties(fname='C:\Windows\Fonts\simsunb.ttf') #只支援字尾ttc
plt.rcParams['font.sans-serif']=['SimHei']

"資料儲存到檔案中"
def create_dataset():
    datasets = np.array([[8,4,2],[7,1,1,],[1,4,4],[3,0,5]]) # 資料集
    labels = ['非常熱','非常熱','一般熱','一般熱']                     # 類標籤
    return datasets,labels

def create_datasets():
    datasets = np.array([[8,4,2],[7,1,1,],[1,4,4],[3,0,5],[3,0,4],[5,2,1],[5,3,2]]) # 資料集
    labels = [0,0,1,1,0,0,1] #['非常熱','非常熱','一般熱','一般熱','一般熱']                     # 類標籤
    return datasets,labels

"視覺化分析資料"
def analyze_data_plot(x,y):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(x,y)
    # plt.scatter(x,y)
    #設定散點圖示題和橫座標
    # plt.title('冷熱感知圖',fontsize=25,fontproperties=myfont)
    plt.title('冷熱感知圖',fontsize=25)
    # plt.xlabel('冰淇淋',fontsize=15,fontproperties=myfont)
    plt.xlabel('冰淇淋',fontsize=15)
    # plt.ylabel('喝水', fontsize=15, fontproperties=myfont)
    plt.ylabel('喝水',fontsize=15)
    # 自動儲存
    plt.savefig('result.png',bbox_inches='tight')
    plt.show()
"構造KNN分類器"
def knn_classifier(newV, datasets, labels, k):
    # 1.計算樣本資料和樣本庫資料的距離
    sqrtDist = EuclideanDis3(newV,datasets)
    # 2.根據距離排序,按照列向量排序
    sortedDistIndexs = sqrtDist.argsort(axis=0)

    # 3.針對k個值,統計各個類別的數量
    classCount = {}
    for i in range(k):
        # 根據距離排序,索引值找到類標籤
        votelabel = labels[sortedDistIndexs[i]]
        # 統計類標籤的鍵值對
        classCount[votelabel] = classCount.get(votelabel,0)+1

    # 4.投票機制,少數服從多數原則
    # 對各個分類字典進行排序,降序,按照值
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    # print('結果預測:',sortedClassCount[0][0])
    return sortedClassCount[0][0]


"歐式距離計算 d2=(x1-x2)2+(y1-y2)2"
def computeEuclideanDis(x1,x2,y1,y2):
    d = math.sqrt(math.pow(x1-x2,2)+math.pow(y1-y2,2))
    return d
"歐式距離計算優化公式"
def EuclideanDis(instance1,instance2):
    d = 0
    length = len(instance1)
    for x in range(length):
        d += math.pow(instance1[x]-instance2[x],2)

    return math.sqrt(d)
"歐式距離計算3:大量資料計算"
def EuclideanDis3(newV,datasets):
    # 獲取向量維度
    rowsize,colsize = datasets.shape
    # 各特徵向量間做差值
    diffMat = np.tile(newV,(rowsize,1))-datasets
    # 差值平方
    sqDiffMat = diffMat ** 2
    # 差值開方求和
    sqrtDist = sqDiffMat.sum(axis=1) ** 0.5

    return sqrtDist

"利用KNN隨機預測訪客天氣感知度"
def predict_temperature():
    # 建立資料集和類標籤
    datasets, labels = create_dataset()
    newV = [2, 4, 4]
    iceCream = float(input("Q:請問你今天吃了幾個冰淇淋?\n"))
    drinkWater = float(input("Q:請問你今天喝了幾瓶水?\n"))
    playHours = float(input("Q:請問你今天在戶外玩了幾個小時?\n"))
    newV = np.array([iceCream, drinkWater, playHours])

    # vecs = np.array([[2, 4, 4], [3, 0, 0], [5, 7, 2]])
    # for i in vecs:
    res = knn_classifier(newV, datasets, labels, 3)
    print('KNN天氣預測結果', res)

"使用機器學習庫sklearn實現預測"

from sklearn import neighbors
def knn_sklearn_predict():

    # 呼叫機器學習庫knn分類器演算法
    knn = neighbors.KNeighborsClassifier()
    datasets,labels = create_datasets()
    # 傳入引數,特徵資料和分類標籤
    print(datasets)
    knn.fit(datasets,labels)
    # knn預測
    predictRes = knn.predict([[2,4,0]])
    print("天氣:\t","非常熱" if predictRes[0]==0 else '一般熱')

    return predictRes

if __name__ == '__main__':

    # predict_temperature()
    knn_sklearn_predict()