亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

純python實現機器學習之kNN算法示例

發布時間:2020-09-24 01:10:37 來源:腳本之家 閱讀:207 作者:swensun 欄目:開發技術

前面文章分別簡單介紹了線性回歸,邏輯回歸,貝葉斯分類,并且用python簡單實現。這篇文章介紹更簡單的 knn, k-近鄰算法(kNN,k-NearestNeighbor)。

k-近鄰算法(kNN,k-NearestNeighbor),是最簡單的機器學習分類算法之一,其核心思想在于用距離目標最近的k個樣本數據的分類來代表目標的分類(這k個樣本數據和目標數據最為相似)。

原理

kNN算法的核心思想是用距離最近(多種衡量距離的方式)的k個樣本數據來代表目標數據的分類。

具體講,存在訓練樣本集, 每個樣本都包含數據特征和所屬分類值。

輸入新的數據,將該數據和訓練樣本集匯中每一個樣本比較,找到距離最近的k個,在k個數據中,出現次數做多的那個分類,即可作為新數據的分類。

純python實現機器學習之kNN算法示例

如上圖:

需要判斷綠色是什么形狀。當k等于3時,屬于三角。當k等于5是,屬于方形。

因此該方法具有一下特點:

  1. 監督學習:訓練樣本集中含有分類信息
  2. 算法簡單, 易于理解實現
  3. 結果收到k值的影響,k一般不超過20.
  4. 計算量大,需要計算與樣本集中每個樣本的距離。
  5. 訓練樣本集不平衡導致結果不準確問題

接下來用oython 做個簡單實現, 并且嘗試用于約會網站配對。

python簡單實現

def classify(inX, dataSet, labels, k):
  """
  定義knn算法分類器函數
  :param inX: 測試數據
  :param dataSet: 訓練數據
  :param labels: 分類類別
  :param k: k值
  :return: 所屬分類
  """

  dataSetSize = dataSet.shape[0] #shape(m, n)m列n個特征
  diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
  sqDiffMat = diffMat ** 2
  sqDistances = sqDiffMat.sum(axis=1)
  distances = sqDistances ** 0.5 #歐式距離
  sortedDistIndicies = distances.argsort() #排序并返回index

  classCount = {}
  for i in range(k):
    voteIlabel = labels[sortedDistIndicies[i]]
    classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 #default 0

  sortedClassCount = sorted(classCount.items(), key=lambda d:d[1], reverse=True)
  return sortedClassCount[0][0]

算法的步驟上面有詳細的介紹,上面的計算是矩陣運算,下面一個函數是代數運算,做個比較理解。

def classify_two(inX, dataSet, labels, k):
  m, n = dataSet.shape  # shape(m, n)m列n個特征
  # 計算測試數據到每個點的歐式距離
  distances = []
  for i in range(m):
    sum = 0
    for j in range(n):
      sum += (inX[j] - dataSet[i][j]) ** 2
    distances.append(sum ** 0.5)

  sortDist = sorted(distances)

  # k 個最近的值所屬的類別
  classCount = {}
  for i in range(k):
    voteLabel = labels[ distances.index(sortDist[i])]
    classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 # 0:map default
  sortedClass = sorted(classCount.items(), key=lambda d:d[1], reverse=True)
  return sortedClass[0][0]

有了上面的分類器,下面進行最簡單的實驗來預測一下:

def createDataSet():
  group = np.array([[1, 1.1], [1, 1], [0, 0], [0, 0.1]])
  labels = ['A', 'A', 'B', 'B']
  return group, labels

上面是一個簡單的訓練樣本集。

if __name__ == '__main__':
  dataSet, labels = createDataSet()
  r = classify_two([0, 0.2], dataSet, labels, 3)
  print(r)

執行上述函數:可以看到輸出B, [0 ,0.2]應該歸入b類。

上面就是一個最簡單的kNN分類器,下面有個例子。

kNN用于判斷婚戀網站中人的受歡迎程度

訓練樣本集中部分數據如下:

40920 8.326976 0.953952 3
14488 7.153469 1.673904 2
26052 1.441871 0.805124 1
75136 13.147394 0.428964 1
38344 1.669788 0.134296 1

第一列表示每年獲得的飛行常客里程數, 第二列表示玩視頻游戲所耗時間百分比, 第三類表示每周消費的冰淇淋公升數。第四列表示分類結果,1, 2, 3 分別是 不喜歡,魅力一般,極具魅力。

將數據轉換成numpy。

# 文本轉換成numpy
def file2matrix(filepath="datingSet.csv"):
  dataSet = np.loadtxt(filepath)
  returnMat = dataSet[:, 0:-1]
  classlabelVector = dataSet[:, -1:]
  return returnMat, classlabelVector

首先對數據有個感知,知道是哪些特征影響分類,進行可視化數據分析。

# 2, 3列數據進行分析
def show_2_3_fig():
  data, cls = file2matrix()
  fig = plt.figure()
  ax = fig.add_subplot(111)
  ax.scatter(data[:, 1], data[: ,2], c=cls)
  plt.xlabel("playing game")
  plt.ylabel("Icm Cream")
  plt.show()

純python實現機器學習之kNN算法示例

如上圖可以看到并無明顯的分類。

純python實現機器學習之kNN算法示例

純python實現機器學習之kNN算法示例

可以看到不同的人根據特征有明顯的區分。因此可以使用kNN算法來進行分類和預測。

由于后面要用到距離比較,因此數據之前的影響較大, 比如飛機里程和冰淇淋數目之間的差距太大。因此需要對數據進行歸一化處理。

# 數據歸一化
def autoNorm(dataSet):
  minVal = dataSet.min(0)
  maxVal = dataSet.max(0)
  ranges = maxVal - minVal

  normDataSet = np.zeros(dataSet.shape)
  m, n = dataSet.shape # 行, 特征
  normDataSet = dataSet - minVal
  normDataSet = normDataSet / ranges
  return normDataSet, ranges, minVal

衡量算法的準確性

knn算法可以用正確率或者錯誤率來衡量。錯誤率為0,表示分類很好。

因此可以將訓練樣本中的10%用于測試,90%用于訓練。

# 定義測試算法的函數
def datingClassTest(h=0.1):
  hoRatio = h
  datingDataMat, datingLabels = file2matrix()
  normMat, ranges, minVals = autoNorm(datingDataMat)
  m, n = normMat.shape
  numTestVecs = int(m * hoRatio) #測試數據行數
  errorCount = 0 # 錯誤分類數


  # 用前10%的數據做測試
  for i in range(numTestVecs):
    classifierResult = classify(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)
    # print('the classifier came back with: %d,the real answer is: %d' % (int(classifierResult), int(datingLabels[i])))
    if classifierResult != datingLabels[i]:
      errorCount += 1
  print("the total error rate is: %f" % (errorCount / float(numTestVecs)))

調整不同的測試比例,對比結果。

使用knn進行預測。

有了訓練樣本和分類器,對新數據可以進行預測。模擬數據并進行預測如下:

# 簡單進行預測
def classifypersion():
  resultList = ["none", 'not at all','in small doses','in large doses']
  # 模擬數據
  ffmiles = 15360
  playing_game = 8.545204
  ice_name = 1.340429

  datingDataMat, datingLabels = file2matrix()
  normMat, ranges, minVals = autoNorm(datingDataMat)
  inArr = np.array([ffmiles, playing_game, ice_name])
  # 預測數據歸一化
  inArr = (inArr - minVals) / ranges
  classifierResult = classify(inArr, normMat, datingLabels, 3)
  print(resultList[int(classifierResult)])

可以看到基本的得到所屬的分類。

完成代碼和數據請參考:

github:kNN

總結

  1. kNN
  2. 監督學習
  3. 數據可視化
  4. 數據歸一化,不影響計算

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陆川县| 防城港市| 雷山县| 永安市| 桑植县| 清涧县| 和平县| 屏南县| 华阴市| 江川县| 南康市| 高邮市| 凯里市| 闽清县| 盐城市| 盐源县| 兴隆县| 玉溪市| 镇原县| 凤台县| 苏尼特左旗| 绍兴市| 郴州市| 三亚市| 安图县| 阿勒泰市| 赞皇县| 平安县| 建平县| 砀山县| 阜平县| 哈密市| 赤壁市| 奉新县| 四平市| 甘德县| 甘孜县| 九台市| 通城县| 祁连县| 丰台区|