ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

机器学习实战之k-近邻算法

2021-11-19 22:02:24  阅读:189  来源: 互联网

标签:实战 datingLabels group 近邻 labels dataSet 算法 minVals datingDataMat


在这里插入图片描述
python算法实例

#The first machine learning algorithm--kNN

'''
    导入科学计算包Numpy和运算符模块
'''
from numpy import *
import operator

def creatDataSet():
    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels=['A','A','B','B']
    return group,labels

'''
inX是用于分类的输入向量,dataSet输入的训练样本集,
labels标签向量,k确定选择最近邻居的数目
'''
def classify0(inX,dataSet,labels,k):
    #计算距离
    dataSetSize=dataSet.shape[0] #数据集的行
    diffMat=tile(inX,(dataSetSize,1))-dataSet
    sqDiffMat=diffMat**2
    sqDistance=sqDiffMat.sum(axis=1)
    distances=sqDistance**0.5
    sortedDistanceIndicies=distances.argsort()
    classCount={}
    #选择距离最小的K个点
    for i in range(k):
        voteIlabel=labels[sortedDistanceIndicies[i]]
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    #排序
    sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

# group,labels=creatDataSet()
# classify0([0,0],group,labels,3)
# print(classify0([0,0],group,labels,3))

'''
准备数据:从文本文件中解析数据,将文本记录转为numpy的解析程序
'''
def file2matrix(filename):
    fr=open(filename)
    arrayOLines=fr.readlines()
    numberOfLines=len(arrayOLines)  #得到文件行数
    returnMat=zeros((numberOfLines,3)) #创建0矩阵,用作返回的numpy矩阵
    classLabelVector=[]
    index=0
    #解析文件数据到列表
    for line in arrayOLines:
        line=line.strip()  #去掉所有回车字符
        listFromLine=line.split('\t') #使用tab字符将上一步得到的整行数据分割为一个元素列表
        returnMat[index,:]=listFromLine[0:3] #选取前三个元素,存到特征矩阵中
        classLabelVector.append(int(listFromLine[-1]))  #-1代表最后一列元素
        index+=1
    return returnMat,classLabelVector

datingDataMat,datingLabels=file2matrix('datingTestSet.txt')

'''
分析数据:使用matplotlib创建散点图
'''
import matplotlib
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],
           15.0*array(datingLabels),15.0*array(datingLabels)) #使用datingDataMat矩阵第二列和第三列的数据
plt.show
'''
准备数据:归一化数据,将数据的取值范围处理为0到1或者-1到1
autoNorm()函数可以自动将数字特征值转化为0到1的区间
tile(x,(2))函数将x将函数沿着X轴扩大两倍,tile(x,(1,2))将x向Y轴扩大1倍,向X轴扩大2倍
'''
def autoNorm(dataSet):
    minVals=dataSet.min(0)  #使得函数可以从列中选取最小值,列!!!
    maxVals=dataSet.max(0) #最大特征值
    ranges=maxVals-minVals
    normDataSet=zeros(shape(dataSet))
    m=dataSet.shape[0]  #1000,和前面特征矩阵的行数相同
    normDataSet=dataSet-tile(minVals,(m,1))  #统一特征矩阵1000x3和minVals、range(1x3)的大小
    normDataSet=normDataSet/tile(ranges,(m,1))  #特征值相除
    return normDataSet,ranges,minVals

normMat,ranges,minVals=autoNorm(datingDataMat)

'''
测试算法:作为完整程序验证分类器
'''
def datingClassTest():
    hoRatio=0.1
    datingDataMat,datingLabels=file2matrix('datingTestSet.txt')
    normMat,ranges,minVals=autoNorm(datingDataMat)
    m=normMat.shape[0]
    numTestVecs=int(m*hoRatio)
    errorCount=0.0
    for i in range(numTestVecs):
        classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,:],
                                   datingLabels[numTestVecs:m],3)
        print("the classifier came back with: %d, the real answer is: %d" \
              % (classifierResult,datingLabels[i]))
        if (classifierResult !=datingLabels[i]):
            errorCount+=1.0
    print("the total error rate is %f" %(errorCount/float(numTestVecs)))

标签:实战,datingLabels,group,近邻,labels,dataSet,算法,minVals,datingDataMat
来源: https://blog.csdn.net/weixin_42368982/article/details/121431703

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有