상세 KNN 알고리즘 - (예측 데이트 사이트) 내 작은 의견의 일부

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()

결과 산점도에서 pycharm

결과 산점도에서 pycharm
게시 19 개 원래 기사 · 원 찬양 4 · 조회수 (503)

추천

출처blog.csdn.net/qq_35050438/article/details/103086794