暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

K-近邻 示例

云南高校数据化运营管理工程中心 2019-05-19
230

目录






(一)示例

(二)使用scikit-learn包实现






编辑:

校对:

版本:

Jiangnan

Jiangnan

python3

示例


      使用K-近邻算法改进约会网站的配对效果,我们将进行下面几个过程:

(1) 准备数据:从文本文件中读取数据

(2) 分析数据:使用matplotlib 画散点图

(3) 准备数据:归一化处理

(4) 测试算法:判断分类效果


  1. from numpy import * #将函数库中的所有模块导入

  2. import operator #导入运算符模块


  3. #读取路径下文件

  4. def file2matrix(filename):

  5. fr = open(filename)

  6. numberOfLines = len(fr.readlines())

  7. returnMat = zeros((numberOfLines,3))

  8. classLabelVector = []

  9. fr = open(filename)

  10. index = 0

  11. for line in fr.readlines():

  12. line = line.strip()

  13. listFromLine = line.split('\t')

  14. returnMat[index,:] = listFromLine[0:3]

  15. classLabelVector.append(

  16. int(listFromLine[-1]))

  17. index += 1

  18. return returnMat,classLabelVector


  19. #对数据进行归一化处理

  20. def autoNorm(dataSet):

  21. minVals = dataSet.min(0)

  22. maxVals = dataSet.max(0)

  23. ranges = maxVals - minVals

  24. normDataSet = zeros(shape(dataSet))

  25. m = dataSet.shape[0]

  26. normDataSet = dataSet - tile(minVals, (m,1))

  27. normDataSet = normDataSet/tile(ranges, (m,1))

  28. return normDataSet, ranges, minVals


  29. #分类函数

  30. def classify0(inX, dataSet, labels, k):

  31. dataSetSize = dataSet.shape[0]

  32. diffMat = tile(inX, (dataSetSize,1)) - dataSet

  33. sqDiffMat = diffMat**2

  34. sqDistances = sqDiffMat.sum(axis=1)

  35. distances = sqDistances**0.5

  36. sortedDistIndicies = distances.argsort()

  37. classCount={}

  38. for i in range(k):

  39. voteIlabel = labels[sortedDistIndicies[i]]

  40. classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1

  41. sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)

  42. return sortedClassCount[0][0]


  43. #测试算法

  44. def datingClassTest():

  45. hoRatio = 0.50

  46. datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')

  47. normMat, ranges, minVals = autoNorm(datingDataMat)

  48. m = normMat.shape[0]

  49. numTestVecs = int(m*hoRatio)

  50. errorCount = 0.0

  51. for i in range(numTestVecs):

  52. classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)

  53. print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))

  54. if (classifierResult != datingLabels[i]): errorCount += 1.0

  55. print("the total error rate is: %f" % (errorCount/float(numTestVecs)))

  56. print(errorCount)

  57. #画散点图

  58. import matplotlib

  59. import matplotlib.pyplot as plt

  60. fig = plt.figure()

  61. ax = fig.add_subplot(111)

  62. ax.scatter(returnMat[:,1],returnMat[:,2])

  63. plt.show()

复制
复制

使用scikit-learn包实现


       我们可以用上面的代码读取数据和归一化之后用下面的代码进行预测和测试。

代码:

  1. from sklearn.neighbors import KNeighborsClassifier

  2. import numpy as np


  3. np.random.seed(0)

  4. indices = np.random.permutation(len(returnMat))

  5. x_train = returnMat[indices[:-10]]

  6. y_train = array(classLabelVector)[indices[:-10]]

  7. x_test = returnMat[indices[-10:]]

  8. y_test = array(classLabelVector)[indices[-10:]]



  9. knn = KNeighborsClassifier(n_neighbors=3)

  10. knn.fit(x_train,y_train)

  11. y_predict = knn.predict(x_test)

  12. # 调用该对象的测试方法,主要接收一个参数:测试数据集

  13. probility = knn.predict_proba(x_test)

  14. # 计算各测试样本基于概率的预测

  15. neighborpoint = knn.kneighbors([x_test[-1]], 5, False)

  16. # 计算与最后一个测试样本距离在最近的5个点,返回的是这些样本的序号组成的数组

  17. score = knn.score(x_test, y_test, sample_weight=None)

  18. # 调用该对象的打分方法,计算出准确率


  19. print('y_predict = ')

  20. print(y_predict)

  21. # 输出测试的结果


  22. print('y_test = ')

  23. print(y_test)

  24. # 输出原始测试数据集的正确标签,以方便对比

  25. print('Accuracy:', score)

  26. # 输出准确率计算结果

  27. print('neighborpoint of last test sample:', neighborpoint)


  28. print('probility:')

  29. print(probility)

复制



思考——学而不思则罔

(1)当数据含有非常多的特征时如何运用sklearn 中的K-近邻算法快速的得到分类结果?

(2)如何更加合理的确定K的取值?


理解编程语言,探索数据奥秘

每日练习|干货分享|新闻资讯|公益平台。

每天学习一点点,你将会见到全新的自己。

长按识别二维码关注


文章转载自云南高校数据化运营管理工程中心,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论