KNN 알고리즘은 일반적으로 전체 예측 프로세스에 대해 뭔가 말
첫 번째 단계
우리는 데이터의 다수의 라벨 우리의 텍스트 처리, 데이터 분리 클러 터 많은 데이터를 설정 구해야하고, 불필요한 쓸모 심볼 라벨과 매트릭스 형성 데이타 행렬의 제거
# 解析文本
from numpy import *
def file2matrix(filename): # 将文本记录转换为Numpy的解析程序
fr = open(filename)
arrayOLines = fr.readlines() # 读取文件每行数据包括换行符转换为字符串,返回一个列表类似['123\n','siz']
numberOfLines = len(arrayOLines) # 得到这个列表的长度,也就是文件的行数
returnMat = zeros((numberOfLines, 3)) # zeros函数创建数组numberoflines行3列的元素为0的numpy数组,其实是矩阵
classLabelVector = []
index = 0
for line in arrayOLines: # 列表从头遍历到尾
line = line.strip() # 默认头尾删除空白符(包括'\n', '\r', '\t', ' '),strip函数里有的话删除头尾指定字符
listFromLine = line.split('\t') # 根据\t划分元素,返回列表
returnMat[index, :] = listFromLine[0:3]
# 从0+1列到第3列数据赋值给returnMat矩阵的index列,因为这次数据的样本只有3个特征
classLabelVector.append(int(listFromLine[-1])) # 数据已经列好了,前3项为数据,最后一项为标签
# classLabelVector新增最后一列
# 将最后一列的数据添加到classLabelVector的最后一列
index += 1
return returnMat, classLabelVector
두번째 단계
데이터의 데이터 매트릭스는 모두 0-1 사이 특성치가 통합 가중치
가중치, 어디까지의 Unify 가중치 균일하지 될 수
# 归一化特征值
def autoNorm(dataSet): # 输入数据集
minVals = dataSet.min(0)
# min(0)返回该矩阵中每一列的最小值 min(1)返回该矩阵中每一行的最小值
maxVals = dataSet.max(0)
# max(0)返回该矩阵中每一列的最大值 max(1)返回该矩阵中每一行的最大值
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet)) # 构造和dataSet一样大小的矩阵
# shape 输出第一个为矩阵的行数,第二个为矩阵的列数
m = dataSet.shape[0] # 将矩阵行数输出,shape[1]将矩阵的列数输出
normDataSet = dataSet - tile(minVals, (m, 1)) # 补全矩阵m行,列数不补,minvals自己自带列数
normDataSet = normDataSet / tile(ranges, (m, 1)) # 数据集与最小值的差值除以最大值与最小值的差值
# 将数字特征转化到0到1的区间
return normDataSet, ranges, minVals
세 번째 단계
KNN 알고리즘의 원리는, (보려면 여기 맨해튼 거리 식) 제 K 개의 요소 중 가장 작은 중량의 가중 평균의 세 가지 고유 값들을 찾을 수
있지만, 예측 된 현장 학습 스폿이 박 서평 분류 학습 게으름 사용이 다른 방법으로 매우 일반적인, 그러나 좋은 단순, 쉽게 이해합니다.
PS : classify0 함수 파라미터는 인 사용자 입력 데이터를 예측하는 것 및 이미 처리 된 데이터 매트릭스 및 데이터 매트릭스 라벨 , k 값은 상위 k의 최대 비 중력 선택한
def classify0(inX, dataSet, labels, k):
# inX是输入的需要判断的分量
# dataSet为学习器的训练样本,
# labels给上每个分量的标签,label数量与dataset的行数相同
# k是离inX参数最近的参数数目
dataSetSize = dataSet.shape[0] # 返回dataset这个矩阵的行数
diffMat = tile(inX, (dataSetSize, 1)) - dataSet # diff一般是指差分的意思,前后做差
# tile 可以把inX这个向量补成和dataset一样大小的矩阵,如果inX是[1,2]tile(inX,3)就变成([1,2,1,2,1,2])
# tile这里是在行填充datasetsize次,在列不填充
sqDiffMat = diffMat ** 2 # sq所得差值平方
sqDistances = sqDiffMat.sum(axis=1) # 将所有矩阵差值平方的数值相加起来
# axis = 0为矩阵列求和 ,, =1 为矩阵行求和
# 分别对训练集每列不同的特征值与inX这个相应分量的特征值做差之后平方相加在开根号
distances = sqDistances ** 0.5 # 再开方使用欧式距离公式,即根号下两点差值的平方之和
# 得到的Distances是n个特征值的权值测量矩阵
sortedDistIndicies = distances.argsort() # argsort返回从小到大的数组元素的数组号 arg可以理解为arguments参数
# indicies其实indices(index的复数)不知道为什么书上打错了,
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] # 将前k个权值最小的元素序号的标签记录在voteIlabel
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
# get是返回字典键值指定的值,votelabel如果美丽对应的0,就get得到0,
# 这里加1重新赋给字典是 因为原本是0到k-1个点变成1到k个点,将序号规范化
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
# 将前k个点排序
return sortedClassCount[0][0]
네 번째 단계
데이트 사이트 예측 기능, 사용자 사이의 인터페이스, 자신의 데이터를 입력하는 사용자의 요구는
, 세 개의 데이터 값은 특성이 있습니다 :
1, 연간 항공 마일리지
2 시간의 비율 재생 비디오 게임
3 주 소비 당 아이스크림 리터의 수
def classifyPerson():
resultList = ['not at all', 'in small doses', 'in large doses']
percentTats = float(input("percentage of time spent playing video games?"))
ffMiles = float(input("frequent flier miles earned per year?"))
iceCream = float(input("liters of ice cream consumed per year?"))
datingDataMat, datingLabels = file2matrix('E:/machinelearingdatas/machinelearninginaction-master/Ch02'
'/datingTestSet2.txt')
normMat, ranges, minVals = autoNorm(datingDataMat)
inArr = array([ffMiles, percentTats, iceCream])
classifierResult = classify0((inArr - minVals) / ranges, normMat, datingLabels, 3)
print("You will probably like this person : ", resultList[classifierResult - 1])
이 함수를 호출 할 수 있습니다 그래서 결국,이 기능은 모든 이전의 기능 모듈을 포함
추가 이미지
또한 데이터 매트릭스와 매트릭스 처리 용 데이터 태그 처리 될 수
산포도로 표시 태그 데이터 세트 및 데이터 분포를
# 分析数据用Matplotlib创建散点图
import matplotlib
import matplotlib.pyplot as plt
datingDataMat, datingLabels = file2matrix('E:/machinelearingdatas/machinelearninginaction-master/Ch02'
'/datingTestSet2.txt')
fig = plt.figure()
# figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
# num:图像编号或名称,数字为编号 ,字符串为名称
# figsize:指定figure的宽和高,单位为英寸;
# dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
# facecolor:背景颜色
# edgecolor:边框颜色
# frameon:是否显示边框
ax = fig.add_subplot(111) # 1*1的网格,第一子图,每subplot命令会创建一个子图
ax.scatter(datingDataMat[:, 0], datingDataMat[:, 1], 15 * array(datingLabels), array(datingLabels))
# 将二列的数据作为横坐标,第三列的数据作为纵坐标,第三个参数是大小,第四个参数是颜色,详见技术文档
plt.show()