机器学习实战算法学习心得
本文记录作者在机器学习实战书籍中,个人学习笔记,以及各类算法的个人理解。
kNN邻近算法
kNN算法核心代码
def classify0(inX,dataSet,labels,k): #kNN
dataSetSize = dataSet.shape[0]
diffMat = np.tile(inX,(dataSetSize,1)) - dataSet #将当前输入数据集复制成和已知数据集相同矩阵
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort() #返回排序后的索引值
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #获取排序后前面k个的类别
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #检测字典中是否存在某标签,若没有则初始化并复制为0,然后遍历过程中不断累加某类出现的次数
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #按字典中的次数排序,并返回排序后的二维列表
return sortedClassCount[0][0]
算法过程:
- 通过文本中解析出数据,获取特征值矩阵和标签分类矩阵
def file2matrix(filename):
fr = open(filename,'r')
arrayOlines = fr.readlines()
numberOfLines = len(arrayOlines)
returnMat = np.zeros((numberOfLines,3))
classLabelVector = []
index = 0
for line in arrayOlines:
line = line.strip() #默认去除字符串开头和结尾的空格或换行字符
listFromLine = line.split('\t') #已空格分割此行数据
returnMat [index,:] = listFromLine[0:3] #读取特征矩阵
classLabelVector.append(listFromLine[-1]) #标签列表赋值
index += 1
return returnMat,classLabelVector
- 将上一步得出的矩阵经过归一化处理后得到新的矩阵,经过归一化处理后,各特征值的取值范围在0到1或者-1到1之间,归一化处理公式如下
newValue = (oldValue-min) / (max-min)
def autoNorm(dataSet): #归一化特征值
minVals = dataSet.min(0) #返回dataSet中每一列最小值
maxVals = dataSet.max(0) #返回dataSet中每一列最大值
ranges = maxVals - minVals #数据集中每一个特征值的最大最小差值
normDataSet = np.zeros(np.shape(dataSet)) #初始化0矩阵和原数据集维度相同
m = dataSet.shape[0] #得到原数据集的行数
normDataSet = dataSet - np.tile(minVals,(m,1)) #将原数据集中每个特征减去此特征中最小值
normDataSet = normDataSet / np.tile(ranges,(m,1)) #得到归一化后的特征值矩阵
return normDataSet, ranges, minVals
- 测试算法的分类效果:通过在数据集上取一定比例的样本,测试kNN算法的正确性,此项用来验证算法的分类性能
def datingClassTest():
hoRatio = 0.10 #设置测试比例
datingDataMat,datingLabels = file2matrix('datingTestSet.txt') #分出文本中的特征值和标签结果
normMat,ranges,minVals = autoNorm(datingDataMat) #得到归一化后数据
m = normMat.shape[0] #得到样本数量
numTestVecs = int(m * hoRatio) #由比例得出测试个数
errCount = 0.0
for i in range(numTestVecs):
classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) #得到测试集中依据训练集得出的分类结果
print("the classifier came back with: %s,the real answer is: %s" % (classifierResult,datingLabels[i])) #输出分类结果
if (classifierResult != datingLabels[i]): #统计分类错误个数
errCount += 1.0
print("the total error rate is: %f" %(errCount/float(numTestVecs))) #打印出错误率
本文在机器学习学习实战书籍的原有代码的基础上在修改在python3环境下实现,加上在学习过程中对于每一个代码段的注释理解,希望能够共同学习的人。