一、机器学习基础
1、机器学习的主要任务是分类,另一项任务是回归
2、目标变量是机器学习算法的预测结果
分类 算法: 目标变量–标称型
回归算法: 目标变量–连续性
3、两套独立的样本集:训练数据和测试数据
二、K-近邻算法(KNN)
- 工作原理:
- 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))