algoritmos de aprendizaje automático mejoran los sitios de citas vecino efecto emparejamiento de combate --k

declaración

        Esta referencia a "la máquina de aprendizaje real" libro de códigos, junto con el libro de explicar, y además de su propia comprensión y exposición

 

Descripción del problema

        amiga Helen ha estado utilizando los sitios de citas en línea para encontrar su propio citas. Aunque los sitios de citas le recomendará un candidato diferente, pero ella no era como todos. Después de un resumen, se encontró que la gente ha salido de tres tipos:

  • No me gusta
  • El encanto de la persona promedio
  •  persona carismática

        Con el fin de hacer que el software candidatos mejor recomendado a Helen, Helen recoger una gran cantidad de datos de citas, se puso estos datos se almacenan en un archivo de texto datingTestSet.txt, cada
muestra de datos en una sola línea, un total de 1.000 líneas. Helen muestra incluye, principalmente, las tres características siguientes:

  • millas de viajero frecuente todos los años disponibles
  • El porcentaje de tiempo dedicado a jugar juegos de video
  • Consumo semanal de helado de varios litros

        La siguiente tarea es determinar si una persona atractiva para Helen

K-vecino más cercano algoritmo

        El algoritmo se encuentra en una pila de datos con el punto más corriente similar hasta el punto K, y luego decidir el punto del punto actual K pertenece a qué categoría cada punto del conjunto de datos categoría atributo desconocido con el fin de hacer lo siguiente:

  1. Distancia entre el punto y el cálculo del punto de corriente conocida conjunto de datos de clase;
  2. Clasificación en orden ascendente de acuerdo a la distancia;
  3. K puntos seleccionados distancia mínima desde el punto actual;
  4. La determinación de la frecuencia de ocurrencia de las clases primera k se localiza el punto;
  5. Volver a los k puntos anteriores aparece con más frecuencia como una clasificación categoría predictor del punto actual.
     

la implementación del código

def classify0(inX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]
    #当前点与数据集做差
    diffMat = tile(inX,(dataSetSize,1))-dataSet
    # 求距离
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndices = distances.argsort()
    classCount = {}
    #选取最近的K个点
    for i in range(k):
        voteIlabel = labels[sortedDistIndices[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #返回相似度最高的标签
    return sortedClassCount[0][0]

sitios de citas optimización

        Helen leyó por primera vez la información recopilada

def file2matrix(filename):
    fr = open(filename)
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)
    returnMat = zeros((numberOfLines,3))
    classLabelVector = []
    index = 0
    for line in arrayOLines:
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1]))
        index += 1
    return returnMat,classLabelVector

        A continuación, vamos a ver la relación entre las visuales tres dimensiones

returnMat,classLabelVector = file2matrix("datingTestSet.txt")
fig = plt.figure()
ax = fig.add_subplot(111)
#第1维与第2维
ax.scatter(returnMat[:,1],returnMat[:,2],15.0*array(classLabelVector),15.0*array(classLabelVector))
plt.show()

        A continuación, verá la imagen como se muestra a continuación, está claro que no hay distinción entre la información sobre la vertical, horizontal allí, significa que puede haber una primera información de dimensiones de una distinción de

        Vistazo a la primera y segunda dimensión cero como imagen unidimensional, mejor se distinguen encontrado

        Por supuesto, podemos mirar a la primera dimensión cero y bidimensionales

        Por lo que podemos ver en la imagen en la parte superior de la misma, la discriminación segunda dimensión es de hecho muy pequeña, por supuesto, pero juzgar estos datos para realizar el análisis artificial, de hecho, el algoritmo real puede no considerar estos como información irrelevante no afecta a la final resultados.

Para que el siguiente normalización de datos

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

entonces verificado

def datingClassTest():
    hoRatio = 0.10
    datingDataMat,datingLabels = file2matrix("datingTestSet.txt")
    normMat,ranges,minVals = autoNorm(datingDataMat)
    m = normMat.shape[0]
    #选取前numTestVecs做测试,训练集就是numTestVecs+1到最后的数据
    numTestVecs = int(m*hoRatio)
    errorCount = 0.0
    for i in range(numTestVecs):
        classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],
                                     datingLabels[numTestVecs:m],7)
        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)))

Los resultados muestran

        Donde k = 7, k = 3 utilizado en la tasa de errores original de sólo el 2,4%, pero he encontrado sólo cuando k toma sólo 7 tasa de error más bajo hasta el 4%

 

Publicado 55 artículos originales · ganado elogios 80 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/qq_41685265/article/details/105196240
Recomendado
Clasificación