久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python實(shí)現(xiàn)KNN近鄰算法

瀏覽:3日期:2022-06-30 18:12:50
示例:《電影類型分類》

獲取數(shù)據(jù)來(lái)源

電影名稱 打斗次數(shù) 接吻次數(shù) 電影類型 California Man 3 104 Romance He’s Not Really into Dudes 8 95 Romance Beautiful Woman 1 81 Romance Kevin Longblade 111 15 Action Roob Slayer 3000 99 2 Action Amped II 88 10 Action Unknown 18 90 unknown

數(shù)據(jù)顯示:肉眼判斷電影類型unknown是什么

from matplotlib import pyplot as plt​# 用來(lái)正常顯示中文標(biāo)簽plt.rcParams['font.sans-serif'] = ['SimHei']# 電影名稱names = ['California Man', 'He’s Not Really into Dudes', 'Beautiful Woman', 'Kevin Longblade', 'Robo Slayer 3000', 'Amped II', 'Unknown']# 類型標(biāo)簽labels = ['Romance', 'Romance', 'Romance', 'Action', 'Action', 'Action', 'Unknown']colors = ['darkblue', 'red', 'green']colorDict = {label: color for (label, color) in zip(set(labels), colors)}print(colorDict)# 打斗次數(shù),接吻次數(shù)X = [3, 8, 1, 111, 99, 88, 18]Y = [104, 95, 81, 15, 2, 10, 88]​plt.title('通過打斗次數(shù)和接吻次數(shù)判斷電影類型', fontsize=18)plt.xlabel('電影中打斗鏡頭出現(xiàn)的次數(shù)', fontsize=16)plt.ylabel('電影中接吻鏡頭出現(xiàn)的次數(shù)', fontsize=16)​# 繪制數(shù)據(jù)for i in range(len(X)): # 散點(diǎn)圖繪制 plt.scatter(X[i], Y[i], color=colorDict[labels[i]])​# 每個(gè)點(diǎn)增加描述信息for i in range(0, 7): plt.text(X[i]+2, Y[i]-1, names[i], fontsize=14)​plt.show()問題分析:根據(jù)已知信息分析電影類型unknown是什么

核心思想:

未標(biāo)記樣本的類別由距離其最近的K個(gè)鄰居的類別決定

距離度量:

一般距離計(jì)算使用歐式距離(用勾股定理計(jì)算距離),也可以采用曼哈頓距離(水平上和垂直上的距離之和)、余弦值和相似度(這是距離的另一種表達(dá)方式)。相比于上述距離,馬氏距離更為精確,因?yàn)樗芸紤]很多因素,比如單位,由于在求協(xié)方差矩陣逆矩陣的過程中,可能不存在,而且若碰見3維及3維以上,求解過程中極其復(fù)雜,故可不使用馬氏距離

知識(shí)擴(kuò)展

馬氏距離概念:表示數(shù)據(jù)的協(xié)方差距離 方差:數(shù)據(jù)集中各個(gè)點(diǎn)到均值點(diǎn)的距離的平方的平均值 標(biāo)準(zhǔn)差:方差的開方 協(xié)方差cov(x, y):E表示均值,D表示方差,x,y表示不同的數(shù)據(jù)集,xy表示數(shù)據(jù)集元素對(duì)應(yīng)乘積組成數(shù)據(jù)集

cov(x, y) = E(xy) - E(x)*E(y)

cov(x, x) = D(x)

cov(x1+x2, y) = cov(x1, y) + cov(x2, y)

cov(ax, by) = abcov(x, y)

協(xié)方差矩陣:根據(jù)維度組成的矩陣,假設(shè)有三個(gè)維度,a,b,c

∑ij = [cov(a, a) cov(a, b) cov(a, c) cov(b, a) cov(b,b) cov(b, c) cov(c, a) cov(c, b) cov(c, c)]

算法實(shí)現(xiàn):歐氏距離

編碼實(shí)現(xiàn)

# 自定義實(shí)現(xiàn) mytest1.pyimport numpy as np​# 創(chuàng)建數(shù)據(jù)集def createDataSet(): features = np.array([[3, 104], [8, 95], [1, 81], [111, 15], [99, 2], [88, 10]]) labels = ['Romance', 'Romance', 'Romance', 'Action', 'Action', 'Action'] return features, labels​def knnClassify(testFeature, trainingSet, labels, k): ''' KNN算法實(shí)現(xiàn),采用歐式距離 :param testFeature: 測(cè)試數(shù)據(jù)集,ndarray類型,一維數(shù)組 :param trainingSet: 訓(xùn)練數(shù)據(jù)集,ndarray類型,二維數(shù)組 :param labels: 訓(xùn)練集對(duì)應(yīng)標(biāo)簽,ndarray類型,一維數(shù)組 :param k: k值,int類型 :return: 預(yù)測(cè)結(jié)果,類型與標(biāo)簽中元素一致 ''' dataSetsize = trainingSet.shape[0] ''' 構(gòu)建一個(gè)由dataSet[i] - testFeature的新的數(shù)據(jù)集diffMat diffMat中的每個(gè)元素都是dataSet中每個(gè)特征與testFeature的差值(歐式距離中差) ''' testFeatureArray = np.tile(testFeature, (dataSetsize, 1)) diffMat = testFeatureArray - trainingSet # 對(duì)每個(gè)差值求平方 sqDiffMat = diffMat ** 2 # 計(jì)算dataSet中每個(gè)屬性與testFeature的差的平方的和 sqDistances = sqDiffMat.sum(axis=1) # 計(jì)算每個(gè)feature與testFeature之間的歐式距離 distances = sqDistances ** 0.5​ ''' 排序,按照從小到大的順序記錄distances中各個(gè)數(shù)據(jù)的位置 如distance = [5, 9, 0, 2] 則sortedStance = [2, 3, 0, 1] ''' sortedDistances = distances.argsort()​ # 選擇距離最小的k個(gè)點(diǎn) classCount = {} for i in range(k): voteiLabel = labels[list(sortedDistances).index(i)] classCount[voteiLabel] = classCount.get(voteiLabel, 0) + 1 # 對(duì)k個(gè)結(jié)果進(jìn)行統(tǒng)計(jì)、排序,選取最終結(jié)果,將字典按照value值從大到小排序 sortedclassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True) return sortedclassCount[0][0]​testFeature = np.array([100, 200])features, labels = createDataSet()res = knnClassify(testFeature, features, labels, 3)print(res)# 使用python包實(shí)現(xiàn) mytest2.pyfrom sklearn.neighbors import KNeighborsClassifierfrom .mytest1 import createDataSet​features, labels = createDataSet()k = 5clf = KNeighborsClassifier(k_neighbors=k)clf.fit(features, labels)​# 樣本值my_sample = [[18, 90]]res = clf.predict(my_sample)print(res)示例:《交友網(wǎng)站匹配效果預(yù)測(cè)》

數(shù)據(jù)來(lái)源:略

數(shù)據(jù)顯示

import pandas as pdimport numpy as npfrom matplotlib import pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D​# 數(shù)據(jù)加載def loadDatingData(file): datingData = pd.read_table(file, header=None) datingData.columns = ['FlightDistance', 'PlaytimePreweek', 'IcecreamCostPreweek', 'label'] datingTrainData = np.array(datingData[['FlightDistance', 'PlaytimePreweek', 'IcecreamCostPreweek']]) datingTrainLabel = np.array(datingData['label']) return datingData, datingTrainData, datingTrainLabel​# 3D圖顯示數(shù)據(jù)def dataView3D(datingTrainData, datingTrainLabel): plt.figure(1, figsize=(8, 3)) plt.subplot(111, projection='3d') plt.scatter(np.array([datingTrainData[x][0] for x in range(len(datingTrainLabel)) if datingTrainLabel[x] == 'smallDoses']), np.array([datingTrainData[x][1] for x in range(len(datingTrainLabel)) if datingTrainLabel[x] == 'smallDoses']), np.array([datingTrainData[x][2] for x in range(len(datingTrainLabel)) if datingTrainLabel[x] == 'smallDoses']), c='red') plt.scatter(np.array([datingTrainData[x][0] for x in range(len(datingTrainLabel)) if datingTrainLabel[x] == 'didntLike']), np.array([datingTrainData[x][1] for x in range(len(datingTrainLabel)) if datingTrainLabel[x] == 'didntLike']), np.array([datingTrainData[x][2] for x in range(len(datingTrainLabel)) if datingTrainLabel[x] == 'didntLike']), c='green') plt.scatter(np.array([datingTrainData[x][0] for x in range(len(datingTrainLabel)) if datingTrainLabel[x] == 'largeDoses']), np.array([datingTrainData[x][1] for x in range(len(datingTrainLabel)) if datingTrainLabel[x] == 'largeDoses']), np.array([datingTrainData[x][2] for x in range(len(datingTrainLabel)) if datingTrainLabel[x] == 'largeDoses']), c='blue') plt.xlabel('飛行里程數(shù)', fontsize=16) plt.ylabel('視頻游戲耗時(shí)百分比', fontsize=16) plt.clabel('冰淇凌消耗', fontsize=16) plt.show() datingData, datingTrainData, datingTrainLabel = loadDatingData(FILEPATH1)datingView3D(datingTrainData, datingTrainLabel)問題分析:抽取數(shù)據(jù)集的前10%在數(shù)據(jù)集的后90%進(jìn)行測(cè)試

編碼實(shí)現(xiàn)

# 自定義方法實(shí)現(xiàn)import pandas as pdimport numpy as np​# 數(shù)據(jù)加載def loadDatingData(file): datingData = pd.read_table(file, header=None) datingData.columns = ['FlightDistance', 'PlaytimePreweek', 'IcecreamCostPreweek', 'label'] datingTrainData = np.array(datingData[['FlightDistance', 'PlaytimePreweek', 'IcecreamCostPreweek']]) datingTrainLabel = np.array(datingData['label']) return datingData, datingTrainData, datingTrainLabel​# 數(shù)據(jù)歸一化def autoNorm(datingTrainData): # 獲取數(shù)據(jù)集每一列的最值 minValues, maxValues = datingTrainData.min(0), datingTrainData.max(0) diffValues = maxValues - minValues # 定義形狀和datingTrainData相似的最小值矩陣和差值矩陣 m = datingTrainData.shape(0) minValuesData = np.tile(minValues, (m, 1)) diffValuesData = np.tile(diffValues, (m, 1)) normValuesData = (datingTrainData-minValuesData)/diffValuesData return normValuesData​# 核心算法實(shí)現(xiàn)def KNNClassifier(testData, trainData, trainLabel, k): m = trainData.shape(0) testDataArray = np.tile(testData, (m, 1)) diffDataArray = (testDataArray - trainData) ** 2 sumDataArray = diffDataArray.sum(axis=1) ** 0.5 # 對(duì)結(jié)果進(jìn)行排序 sumDataSortedArray = sumDataArray.argsort() classCount = {} for i in range(k): labelName = trainLabel[list(sumDataSortedArray).index(i)] classCount[labelName] = classCount.get(labelName, 0)+1 classCount = sorted(classCount.items(), key=lambda x: x[1], reversed=True) return classCount[0][0] ​# 數(shù)據(jù)測(cè)試def datingTest(file): datingData, datingTrainData, datingTrainLabel = loadDatingData(file) normValuesData = autoNorm(datingTrainData) errorCount = 0 ratio = 0.10 total = datingTrainData.shape(0) numberTest = int(total * ratio) for i in range(numberTest): res = KNNClassifier(normValuesData[i], normValuesData[numberTest:m], datingTrainLabel, 5) if res != datingTrainLabel[i]: errorCount += 1 print('The total error rate is : {}n'.format(error/float(numberTest)))​if __name__ == '__main__': FILEPATH = './datingTestSet1.txt' datingTest(FILEPATH)# python 第三方包實(shí)現(xiàn)import pandas as pdimport numpy as npfrom sklearn.neighbors import KNeighborsClassifier​if __name__ == '__main__': FILEPATH = './datingTestSet1.txt' datingData, datingTrainData, datingTrainLabel = loadDatingData(FILEPATH) normValuesData = autoNorm(datingTrainData) errorCount = 0 ratio = 0.10 total = normValuesData.shape[0] numberTest = int(total * ratio) k = 5 clf = KNeighborsClassifier(n_neighbors=k) clf.fit(normValuesData[numberTest:total], datingTrainLabel[numberTest:total]) for i in range(numberTest): res = clf.predict(normValuesData[i].reshape(1, -1)) if res != datingTrainLabel[i]: errorCount += 1 print('The total error rate is : {}n'.format(errorCount/float(numberTest)))

以上就是python實(shí)現(xiàn)KNN近鄰算法的詳細(xì)內(nèi)容,更多關(guān)于python實(shí)現(xiàn)KNN近鄰算法的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 亚洲欧美激情精品一区二区 | 成人黄页在线观看 | 亚洲h视频在线观看 | 久久69精品久久久久久久电影好 | 亚洲毛片在线 | 在线观看的av | 成人一区二区三区在线观看 | 精品久久香蕉国产线看观看亚洲 | 日韩欧美二区 | 精品视频在线免费观看 | 久章操 | 成人免费视频观看 | 亚洲成成品网站 | 91久久精品国产91久久性色tv | 亚洲一区中文 | 三级成人片 | 成人在线免费 | 涩涩操 | 国产成人精品在线观看 | 日韩精品中文字幕一区二区三区 | 97久久久| 国产免费一区二区 | 狠狠综合久久av一区二区老牛 | 欧美精品一区在线发布 | 黄色在线免费观看 | 亚洲毛片网站 | 亚洲这里只有精品 | 亚洲91精品 | 久久久免费视频播放 | 日韩午夜影院 | 午夜精品久久久久久99热软件 | 亚洲欧美国产毛片在线 | 日韩视频在线观看视频 | 在线播放一区二区三区 | 在线国产一区二区 | 国产成人精品在线 | 在线视频一区二区三区 | 免费黄色在线观看 | 久久久久一区二区 | 久久久一二三 | www.天天操.com|