from numpy import*#科学计数包
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
#group,labels = createDataSet()
#分类器1
def classify0(inX,dataset,labels,k):
#inX:用于分类的输入变量,dataSet:训练的样本集,标签向量:labels,k:选择最近邻居的数目
dataset_size = dataset.shape[0]#获取数据集的行数
m,n = dataset.shape#获取数据集的行和列数
diffmat = tile(inX,(dataset_size,1)) - dataset #输入变量与数据集分别相减,此时为m*n数组
sqdiffmat = diffmat**2
sqdistances = sqdiffmat.sum(axis = 1)#按列相加,此时为m*1数组
distance = sqdistances**0.5
sorteddistindicies = distance.argsort()#argsort()函数逆序排序,按元素大小从小到大排序并返回index(索引)
classcount = {}#创建一个空字典
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]#求出第i个标签
classcount[voteilabel] = classcount.get(voteilabel,0) + 1#访问到字典中的voteilabel标签时,其对应的数值加1
#将获取的k个近邻的标签按照发生的频率从高到低排序
sortedclasscount = sorted(classcount.items(),key = operator.itemgetter(1),reverse = True)
#items() 方法把字典中每对 key 和 value 组成一个元组,并把这些元组放在列表中返回
#operator.itemgetter(1):按照第二维的数据来排序,reverse:True从大到小,False从小到大
return sortedclasscount[0][0]
#k近邻算法改进约会网站的配对效果
#将文本记录转化为NumPy的解析程序
def file2matrix(filename):
fr = open(filename)
arrayolines = fr.readlines()#将文本的每一行(包含行前的空格,行末加一个\n)作为一个元素,存储在list中
numberoflines = len(arrayolines)#获取arrayolines这一列表的行数
returnmat = zeros((numberoflines,3))#生成一个numberoflines*3的numpy矩阵,这里的可以根据具体数据具体调整
classlabelvector = []
index = 0
for line in arrayolines:
line = line.strip()#截掉所有的回车字符
listfromline = line.split('\t')#将上一步得到的line中的整行数据分割成一个元素列表
returnmat[index,:] = listfromline[0:3]#选取前3个元素,将其存储在特征矩阵当中
classlabelvector.append(int(listfromline[-1]))
index +=1
# print(datingdatamat) #ndarray
# print(datinglabels) #list
return returnmat,classlabelvector
#代码测试
# datingdatamat,datinglabels = file2matrix('datingTestSet2.txt')
#归一化特征值
def autonorm(dataset):
minvals = dataset.min(0)#1*3矩阵
maxvals = dataset.max(0)#1*3矩阵
ranges = maxvals - minvals#1*3矩阵
normdataset = zeros(shape(dataset))
m = dataset.shape[0]#数据集的行数
normdataset = dataset - tile(minvals,(m,1))
normdataset = normdataset/tile(ranges,(m,1))
return normdataset,range,minvals
#调用sklearn中的MinMaxScaler,同样可以将数据归一化
# from sklearn.preprocessing import MinMaxScaler
# data = datingdatamat
# scaler = MinMaxScaler() #实例化
# scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x)
# result = scaler.transform(data) #通过接口导出结果
# result
#分类器针对约会网站的测试代码
def datingclasstset():
horatio = 0.2#划分测试集和训练集,范围(0,1)
datingdatamat,datinglabels = file2matrix('datingTestSet2.txt')
normmat,range,minvals = autonorm(datingdatamat)
m = normmat.shape[0]
numtestvecs = int(m*horatio)
errorcount = 0.0
n = 0
for i in range(numtestvecs):
n +=1
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)))
print("一共迭代%d次"%n)
日常复习KNN近邻算法(第一部分)
最新推荐文章于 2024-09-03 17:22:28 发布