1.目前技能状态
主要做web开发,有一定的服务器项目部署经验,使用的数据库有:mysql/sqlite/redis
2.优点
精度高
对异常值不敏感
无数据输入假定
3.缺点
计算复杂度高
空间复杂度高
4.算法公式
此算法的要点就是测量不同特征之间的距离(上面的公式是两个维度的计算公式,特征可以是多个维度)
通用公式应该这样写,
5.计算流程
收集数据 -> 准备数据 -> 分析数据 -> 测试算法 -> 使用算法
拿到分析数据后,要明确有几个特征,即几个维度,就是上述公式的n
根据算法公式,使用一条测试数据,如果分析数据有1000条,会有1000个距离结果集,由小到大排序
确定一组数据的k-临近算法,就是确定一个数,即取结果集前几个数,取出的这几个数,出现频率最高的结果即为这个测试数据预测的结果。
比如结果集为[A,A,C,A,A,A,A,C,C,C,C,C,C,C,C,C,CB,C,C,B,B,B,...]
现在如果确定这个数为5,则结果A的频率为80%,结果C的频率为20%,故预测结果为A
如果这个数为15时,结果A的频率为6/15,结果C的频率为9/15,此时预测结果就会不同,变为C
(其中,k就是上文提到的这个数)
6.注意
因为不同数据间的极差不同,不处理直接使用的话,极差大的特征对结果赢下很大,
此时,对数据做归一化处理就是很有必要的。
归一化,就是特征数据的值是0-1之间,就是取特征集的每一个值前去最小值,再除以最大值减去最小值的结果,就是它的归一化的值。
7.示例
from numpy import *
import operator
from os import listdir
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
sortedDistIndicies = distances.argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
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()
a = classify0([0,0.3], group, labels, 2)
print(a)