最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

純python實(shí)現(xiàn)機(jī)器學(xué)習(xí)之kNN算法示例

 更新時(shí)間:2018年03月01日 09:32:47   作者:swensun  
本篇文章主要介紹了純python實(shí)現(xiàn)機(jī)器學(xué)習(xí)之kNN算法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

k-近鄰算法(kNN,k-NearestNeighbor),是最簡(jiǎn)單的機(jī)器學(xué)習(xí)分類(lèi)算法之一,其核心思想在于用距離目標(biāo)最近的k個(gè)樣本數(shù)據(jù)的分類(lèi)來(lái)代表目標(biāo)的分類(lèi)(這k個(gè)樣本數(shù)據(jù)和目標(biāo)數(shù)據(jù)最為相似)。

原理

kNN算法的核心思想是用距離最近(多種衡量距離的方式)的k個(gè)樣本數(shù)據(jù)來(lái)代表目標(biāo)數(shù)據(jù)的分類(lèi)。

具體講,存在訓(xùn)練樣本集, 每個(gè)樣本都包含數(shù)據(jù)特征和所屬分類(lèi)值。

輸入新的數(shù)據(jù),將該數(shù)據(jù)和訓(xùn)練樣本集匯中每一個(gè)樣本比較,找到距離最近的k個(gè),在k個(gè)數(shù)據(jù)中,出現(xiàn)次數(shù)做多的那個(gè)分類(lèi),即可作為新數(shù)據(jù)的分類(lèi)。

如上圖:

需要判斷綠色是什么形狀。當(dāng)k等于3時(shí),屬于三角。當(dāng)k等于5是,屬于方形。

因此該方法具有一下特點(diǎn):

  1. 監(jiān)督學(xué)習(xí):訓(xùn)練樣本集中含有分類(lèi)信息
  2. 算法簡(jiǎn)單, 易于理解實(shí)現(xiàn)
  3. 結(jié)果收到k值的影響,k一般不超過(guò)20.
  4. 計(jì)算量大,需要計(jì)算與樣本集中每個(gè)樣本的距離。
  5. 訓(xùn)練樣本集不平衡導(dǎo)致結(jié)果不準(zhǔn)確問(wèn)題

接下來(lái)用oython 做個(gè)簡(jiǎn)單實(shí)現(xiàn), 并且嘗試用于約會(huì)網(wǎng)站配對(duì)。

python簡(jiǎn)單實(shí)現(xiàn)

def classify(inX, dataSet, labels, k):
  """
  定義knn算法分類(lèi)器函數(shù)
  :param inX: 測(cè)試數(shù)據(jù)
  :param dataSet: 訓(xùn)練數(shù)據(jù)
  :param labels: 分類(lèi)類(lèi)別
  :param k: k值
  :return: 所屬分類(lèi)
  """

  dataSetSize = dataSet.shape[0] #shape(m, n)m列n個(gè)特征
  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]

算法的步驟上面有詳細(xì)的介紹,上面的計(jì)算是矩陣運(yùn)算,下面一個(gè)函數(shù)是代數(shù)運(yùn)算,做個(gè)比較理解。

def classify_two(inX, dataSet, labels, k):
  m, n = dataSet.shape  # shape(m, n)m列n個(gè)特征
  # 計(jì)算測(cè)試數(shù)據(jù)到每個(gè)點(diǎ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 個(gè)最近的值所屬的類(lèi)別
  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]

有了上面的分類(lèi)器,下面進(jìn)行最簡(jiǎn)單的實(shí)驗(yàn)來(lái)預(yù)測(cè)一下:

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

上面是一個(gè)簡(jiǎn)單的訓(xùn)練樣本集。

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

執(zhí)行上述函數(shù):可以看到輸出B, [0 ,0.2]應(yīng)該歸入b類(lèi)。

上面就是一個(gè)最簡(jiǎn)單的kNN分類(lèi)器,下面有個(gè)例子。

kNN用于判斷婚戀網(wǎng)站中人的受歡迎程度

訓(xùn)練樣本集中部分?jǐn)?shù)據(jù)如下:

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

第一列表示每年獲得的飛行??屠锍虜?shù), 第二列表示玩視頻游戲所耗時(shí)間百分比, 第三類(lèi)表示每周消費(fèi)的冰淇淋公升數(shù)。第四列表示分類(lèi)結(jié)果,1, 2, 3 分別是 不喜歡,魅力一般,極具魅力。

將數(shù)據(jù)轉(zhuǎn)換成numpy。

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

首先對(duì)數(shù)據(jù)有個(gè)感知,知道是哪些特征影響分類(lèi),進(jìn)行可視化數(shù)據(jù)分析。

# 2, 3列數(shù)據(jù)進(jìn)行分析
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()

如上圖可以看到并無(wú)明顯的分類(lèi)。

可以看到不同的人根據(jù)特征有明顯的區(qū)分。因此可以使用kNN算法來(lái)進(jìn)行分類(lèi)和預(yù)測(cè)。

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

# 數(shù)據(jù)歸一化
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

衡量算法的準(zhǔn)確性

knn算法可以用正確率或者錯(cuò)誤率來(lái)衡量。錯(cuò)誤率為0,表示分類(lèi)很好。

因此可以將訓(xùn)練樣本中的10%用于測(cè)試,90%用于訓(xùn)練。

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


  # 用前10%的數(shù)據(jù)做測(cè)試
  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)))

調(diào)整不同的測(cè)試比例,對(duì)比結(jié)果。

使用knn進(jìn)行預(yù)測(cè)。

有了訓(xùn)練樣本和分類(lèi)器,對(duì)新數(shù)據(jù)可以進(jìn)行預(yù)測(cè)。模擬數(shù)據(jù)并進(jìn)行預(yù)測(cè)如下:

# 簡(jiǎn)單進(jìn)行預(yù)測(cè)
def classifypersion():
  resultList = ["none", 'not at all','in small doses','in large doses']
  # 模擬數(shù)據(jù)
  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])
  # 預(yù)測(cè)數(shù)據(jù)歸一化
  inArr = (inArr - minVals) / ranges
  classifierResult = classify(inArr, normMat, datingLabels, 3)
  print(resultList[int(classifierResult)])

可以看到基本的得到所屬的分類(lèi)。

完成代碼和數(shù)據(jù)請(qǐng)參考:

github:kNN

總結(jié)

  1. kNN
  2. 監(jiān)督學(xué)習(xí)
  3. 數(shù)據(jù)可視化
  4. 數(shù)據(jù)歸一化,不影響計(jì)算

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python 類(lèi)的繼承實(shí)例詳解

    Python 類(lèi)的繼承實(shí)例詳解

    這篇文章主要介紹了Python 類(lèi)的繼承實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 使用numpy實(shí)現(xiàn)矩陣的翻轉(zhuǎn)(flip)與旋轉(zhuǎn)

    使用numpy實(shí)現(xiàn)矩陣的翻轉(zhuǎn)(flip)與旋轉(zhuǎn)

    這篇文章主要介紹了使用numpy實(shí)現(xiàn)矩陣的翻轉(zhuǎn)(flip)與旋轉(zhuǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用Python進(jìn)行數(shù)獨(dú)求解詳解(二)

    使用Python進(jìn)行數(shù)獨(dú)求解詳解(二)

    對(duì)于利用Python求解數(shù)獨(dú),我們可以采用回溯算法實(shí)現(xiàn)一個(gè)簡(jiǎn)單的版本。本文將此基礎(chǔ)上,通過(guò)改進(jìn)來(lái)提升數(shù)獨(dú)問(wèn)題求解算法的性能。需要的可以參考一下
    2022-02-02
  • M1芯片安裝python3.9.1的實(shí)現(xiàn)

    M1芯片安裝python3.9.1的實(shí)現(xiàn)

    這篇文章主要介紹了M1芯片安裝python3.9.1的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python中的繼承機(jī)制super()函數(shù)詳解

    python中的繼承機(jī)制super()函數(shù)詳解

    這篇文章主要介紹了python中的繼承機(jī)制super()函數(shù)詳解,super 是用來(lái)解決多重繼承問(wèn)題的,直接用類(lèi)名調(diào)用父類(lèi)方法在使用單繼承的時(shí)候沒(méi)問(wèn)題,但是如果使用多繼承,會(huì)涉及到查找順序、重復(fù)調(diào)用等問(wèn)題,需要的朋友可以參考下
    2023-08-08
  • 關(guān)于tensorflow中tf.keras.models.Sequential()的用法

    關(guān)于tensorflow中tf.keras.models.Sequential()的用法

    這篇文章主要介紹了關(guān)于tensorflow中tf.keras.models.Sequential()的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • python深度學(xué)習(xí)人工智能BackPropagation鏈?zhǔn)椒▌t

    python深度學(xué)習(xí)人工智能BackPropagation鏈?zhǔn)椒▌t

    這篇文章主要為大家介紹了python深度學(xué)習(xí)人工智能BackPropagation鏈?zhǔn)椒▌t的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Python生產(chǎn)者與消費(fèi)者模型中的優(yōu)勢(shì)介紹

    Python生產(chǎn)者與消費(fèi)者模型中的優(yōu)勢(shì)介紹

    這篇文章主要介紹了python多進(jìn)程中的生產(chǎn)者和消費(fèi)者模型優(yōu)勢(shì),生產(chǎn)者是指生產(chǎn)數(shù)據(jù)的任務(wù),消費(fèi)者是指消費(fèi)數(shù)據(jù)的任務(wù)。當(dāng)生產(chǎn)者的生產(chǎn)能力遠(yuǎn)大于消費(fèi)者的消費(fèi)能力,生產(chǎn)者就需要等消費(fèi)者消費(fèi)完才能繼續(xù)生產(chǎn)新的數(shù)據(jù)
    2023-03-03
  • Python如何訪問(wèn)字符串中的值

    Python如何訪問(wèn)字符串中的值

    這篇文章主要介紹了Python如何訪問(wèn)字符串中的值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python網(wǎng)絡(luò)編程:socketserver的基本使用方法實(shí)例分析

    python網(wǎng)絡(luò)編程:socketserver的基本使用方法實(shí)例分析

    這篇文章主要介紹了python網(wǎng)絡(luò)編程:socketserver的基本使用方法,結(jié)合實(shí)例形式分析了python網(wǎng)絡(luò)編程中socketserver的基本功能、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04

最新評(píng)論

湟源县| 信丰县| 英吉沙县| 宁安市| 湖南省| 保亭| 宝坻区| 遂昌县| 徐闻县| 台南市| 勃利县| 仙居县| 集贤县| 云霄县| 大庆市| 孝义市| 藁城市| 榆中县| 天柱县| 项城市| 滁州市| 马边| 略阳县| 延庆县| 泰宁县| 利辛县| 定兴县| 丹寨县| 五华县| 长岭县| 昂仁县| 即墨市| 宜兰市| 成武县| 平陆县| 沾益县| 虹口区| 文山县| 裕民县| 泰顺县| 来宾市|