机器学习算法----KNN K近邻

16 篇文章 6 订阅
10 篇文章 0 订阅

一、机器学习基础

1、机器学习的主要任务是分类,另一项任务是回归
2、目标变量是机器学习算法的预测结果
分类 算法: 目标变量–标称型
回归算法: 目标变量–连续性
3、两套独立的样本集:训练数据和测试数据

二、K-近邻算法(KNN)

  1. 工作原理:
    这里写图片描述
  2. python代码
# -*- coding: cp936 -*-
"""
Created on Sun Jul 31 11:13:13 2016

@author: Serana
"""
#导入科学计算包Numpy
from numpy import *
#导入经典python函数库,运算符模块
import operator
#创建数据集和标签函数
def CreateDataSet():
   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:标签向量
def classify0(inX,dataSet,labels,k):
    #距离计算
    dataSetSize =dataSet.shape[0]#得到数组的行数。即知道有几个训练数据
    diffMat     =tile(inX,(dataSetSize,1))-dataSet#tile:numpy中的函数。tile将原来的一个数组,扩充成了4个一样的数组。diffMat得到了目标与训练数值之间的差值。
    sqDiffMat   =diffMat**2#各个元素分别平方
    sqDistances =sqDiffMat.sum(axis=1)#行元素相加,即得到了每一个距离的平方
    distances   =sqDistances**0.5#开方,得到距离。
    sortedDistIndicies=distances.argsort()#升序排列
    #选择距离最小的k个点。
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    #排序
    sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

#将文本记录到转换NumPy的解析程序
 def file2matrix(filename):
    arrayOLines=fr.readlines()
    numberOfLines=len(arrayOLines) #得到文件行数
    returnMat=zeros((numberOfLines,3)) #创建爱你返回的NumPy矩阵
    classLabelVector=[]
    index=0
    for line in arrayOLines:   #解析文件数据到列表
        line=line.strip() #截去所有回车字符
        listFromLine=line.split('\t') #使用tab字符\t将上一步得到的整行数据分割成一个元素列表
        returnMat[index,:]=listFromLine[0:3] #选取前三个字符,存储到特征矩阵中
        classLabelVector.append(int(ListFromLine[-1])) #-1表示存储最后一列
        index+=1 
    return returnMat,classLabelVector
#归一化特征值
def autoNorm(dataSet):
   minVals=dataSet.min(0)
   maxVals=dataSet.max(0)
   ranges=maxVals-minVals
   normDataSet=zeros(shape(dataSet))
   m=dataSet.shape[0]
   normDataSet=dataSet-tile(minVals,(m,1))
   normDataSet=normDataSet/tile(ranges,(m,1))
   return normDataSet,ranges,minVals

#分类器针对约会网站的测试代码

    def datingClassTest():
   hoRatio=0.10
   datingDateMat,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[1,:],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))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值