机器学习实战2.2

#2-2 将文本记录转换为NumPy的解析程序
def file2matrix(filename):
    fr = open(filename)
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)
    returnMat = zeros((numberOfLines,3))#三列数据
    classLabelVector = []
    index = 0
    for line in arrayOLines:
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1]))#这里必须加整型,不然会被当做字符串来处理
        index += 1
    return returnMat,classLabelVector
file2matrix('datingTestSet2.txt')

open()函数,打开文件,这个文件如果不写路径必须在.py一个子文件夹里。

read()、readline()、readlines()区别:read:读出全文、readline每次读出一行,readlines读取整个文件所有行,保存在一个列表(list)变量,读取这个矩阵的长度,并创建一个新的矩阵。

strip()去除掉数据中的空格、回车等特殊字符串。split()每个字符串加个TAB,选取前3个元素,将它们储存到特征矩阵中。

索引值-1表示列表的最后一列元素,这里将这些元素储存到classLabelVector中。

2.2.2使用Matplotlib创建散点图

fig = plt.figure()
ax = fig.add_subplot(111) #参数111:将画布分割成1行1列,图像画在从左到右,从上到下第一块
ax.scatter(datingDataMat[:1],datingDataMat[:2])
plt.show()
#2.2.3归一化数值,准备数据阶段
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

#2.24测试算法的错误率
def datingClassTest():  
    hoRatio = 0.10
    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)))

为什么需要归一化数据?

我的理解:因为数据大小有大有小,不同类别的数据,相互之间的数据数量级可能差别特别大,所以需要统计进行归一化处理。

用公式:newValue = (oldValue-min)/(max-min)进行归一化

min(0):返回每一列的最小值  min(1):返回每一行的最小值

这里特征值矩阵有1000*3个值,而最小值minVals和range的值都为1*3。所以这里要有tile()函数来将变量内容复制成输入矩阵同样大小的矩阵。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值