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:
- Distancia entre el punto y el cálculo del punto de corriente conocida conjunto de datos de clase;
- Clasificación en orden ascendente de acuerdo a la distancia;
- K puntos seleccionados distancia mínima desde el punto actual;
- La determinación de la frecuencia de ocurrencia de las clases primera k se localiza el punto;
- 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%