1.2机器学习实战第一课(KNN)

本文介绍了一个基于KNN算法的示例程序,通过Python实现,并详细解释了如何使用该算法进行分类预测。文中提供了完整的代码实现,包括数据读取、归一化处理、分类测试等步骤。

本博文主要参考机器学习KNN中第二个例程实现,若有不当之处,请指教,谢谢!

import numpy as np
import operator
from os import listdir
import matplotlib
import matplotlib.pyplot as plt


def classify(inX,dataSet,labels,k):
    """
    inX:测试样本
    dataSet:训练集
    labels:训练集标签
    k:选择最近邻的数目
    """
    
    #数据集的样本数
    m = dataSet.shape[0]
    
    #测试样本与训练集样本做差
    diffMat = np.tile(inX,(m,1)) - dataSet
    #取平方
    sqDiffMat = diffMat ** 2
    #对矩阵的每一行进行相加
    sqDistance = sqDiffMat.sum(axis = 1)
    #开方
    distances = sqDistance ** 0.5
    #将距离从小到大排序
    sortedDistIndicies = distances.argsort()
    
    #选择距离最小的k个点
    classCount = {}
    for i in range(k):
        votelabel = labels[sortedDistIndicies[i]]
        classCount[votelabel] = classCount.get(votelabel,0) + 1
        
    #排序并返回出现频率最高的类型
    sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
    return sortedClassCount[0][0]

def file2matrix(filename):
    """
    导入数据
    """
    fr = open(filename)
    #获得文件中的数据行的行数
    numberOfLines = len(fr.readlines())
    #生成对应的空矩阵
    returnMat = np.zeros((numberOfLines,3))
    classLabelVector = []
    fr = open(filename)
    index = 0
    for line in fr.readlines():
        line = line.strip()
        #以'\t'切割字符串
        listFromLine = line.split('\t')
        #每列的属性数据
        returnMat[index,:] = listFromLine[0:3]
        #每列的类别数据,就是label标签数据
        classLabelVector.append(int(listFromLine[-1]))
        index += 1
        
        if index < 10:
            print "line = ",line
            print "listFromLine = ",listFromLine
        
    #返回数据矩阵returnMat和对应的类别classLabelVector
    return returnMat,classLabelVector
    
    

def autoNorm(dataSet):
    """
    归一化数据
    Y = (X - Xmin) / (Xmax - Xmin)
    """
    #计算每种属性的最大值,最小值,范围
    minVals = dataSet.min(0) #min(0)返回每一列的最小值
    maxVals = dataSet.max(0)
    m = dataSet.shape[0]  #返回数据的行
    #极差
    ranges = maxVals - minVals
    normDataSet = np.zeros(np.shape(dataSet))
    #将原始数据与最小值做差
    normDataSet = dataSet - np.tile(minVals,(m,1))
    #将与最小值之差除以范围组成矩阵
    normDataSet = normDataSet / np.tile(ranges,(m,1))
    
    return normDataSet,ranges,minVals


    
def datingClassTest():
    """
    对约会网站的测试方法
    """
    #设置测试数据的一个比例
    hoRatio = 0.1
    #从文件中加载数据
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
    #归一化数据
    normMat,ranges,minVals = autoNorm(datingDataMat)
    #m为数据的行数,即样本数
    m = normMat.shape[0]
    #设置测试样本的数量
    numTestVecs = int(m * hoRatio)
    print 'numTestVecs = ',numTestVecs
    errorCount = 0.0
    
    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"%(classifierResult,
                                                                            datingLabels[i])
        if(classifierResult != datingLabels[i]):
            errorCount += 1.0
    print "the total error rate is: %f" %(errorCount / float(numTestVecs))
    print errorCount



if __name__=='__main__':
    datingClassTest()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值