1、knn的原理html
K-近邻算法采用测量不一样特征值之间的距离方法进行分类。python
问题是求某点的最近 K 个点。求两点间距离公式,此外还可能须要增长权重
算法
优势:精度高、对异常值不敏感、无数据输入假定。网络
缺点:时间复杂度高、空间复杂度高。学习
一、当样本不平衡时,好比一个类的样本容量很大,其余类的样本容量很小,输入一个样本的时候,K个临近值中大多数都是大样本容量的那个类,这时可能就会致使分类错误。能够对K临近点进行加权,也就是距离近的点的权值大,距离远的点权值小。测试
二、计算量较大,每一个待分类的样本都要计算它到所有点的距离,根据距离排序才能求得K个临近点,能够先对已知样本点进行剪辑,事先去除对分类做用不大的样本。编码
适用数据范围:数值型和标称型spa
2、python实现knncode
参考连接:https://www.cnblogs.com/lyuzt/p/10471617.htmlhtm
''' trainData - 训练集 testData - 测试集 labels - 分类 ''' def knn(trainData, testData, labels, k): # 计算训练样本的行数 rowSize = trainData.shape[0] # 计算训练样本和测试样本的差值 diff = np.tile(testData, (rowSize, 1)) - trainData # 计算差值的平方和 sqrDiff = diff ** 2 sqrDiffSum = sqrDiff.sum(axis=1) # 计算距离 distances = sqrDiffSum ** 0.5 # 对所得的距离从低到高进行排序 sortDistance = distances.argsort() count = {} for i in range(k): vote = labels[sortDistance[i]] count[vote] = count.get(vote, 0) + 1 # 对类别出现的频数从高到低进行排序 sortCount = sorted(count.items(), key=operator.itemgetter(1), reverse=True) # 返回出现频数最高的类别 return sortCount[0][0]
python调用
from sklearn.neighbors import KNeighborsClassifier neigh = KNeighborsClassifier(n_neighbors=3) #根据数据判别性别 #身高、体重、鞋的尺寸 X = np.array([[181,80,44],[177,70,43],[160,60,38],[154,54,37], [166,65,40],[190,90,47],[175,64,39],[177,70,40], [159,55,37],[171,75,42],[181,85,43]]) display(X) y = ['male','male','female','female','male','male','female','female','female','male','male'] # 第1步:训练数据 neigh.fit(X,y) # 第2步:预测数据 Z = neigh.predict(np.array([[190,70,43],[168,55,37]])) display(Z)
3、监督学习和非监督学习
通俗的说无监督的学习,就是事先不知道类别,自动将类似的对象归到同一个簇中。监督学习是指数据集的正确输出已知状况下的一类学习算法。由于输入和输出已知,意味着输入和输出之间有一个关系,监督学习算法就是要发现和总结这种“关系”。
监督学习常见算法有:线性回归、神经网络、决策树、支持向量机、KNN、朴素贝叶斯算法等
无监督学习常见算法有:主成分分析法(PCA)、异常检测法、自编码算法等。