数据分析师养成之路之python:从头学习机器学习(KNN_1)

实现kNN分类算法:
快速理解kNN分类算法:
这里写图片描述
如上图,绿色圆即为我们要预测的样本,K=3时,即距离绿色圆最近的3个样本(最内圈内)
中,2个红色三角,1个蓝色方框,2>1,所以我们判定绿色圆为红色三角
算法:[距离–排序–取k–求概率–选类别]
1.计算要预测的样本点 和 其他点的距离(已知类别)
2.得到的距离按照从小到大排序
3.选出最小的k个点
4.在这k个点中,计算其类别出现的概率
5.找到概率最高的类别,即作为我们要预测的样本点 的类别

from numpy import *
import operator
#训练数据集, group,labels
group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])
labels = ['A', 'A', 'B', 'B']
#预测数据
intX=[0.1,0.3]
# tile(intX,[4,1]) 为把预测数据变为和训练数据group一样的维度,便于进行计算 ,这里求差
# 4行2列,每一行是x,和y,这里每一列计算(x1-x2),(y1-y2)
diffMat=tile(intX,[4,1])-group
# 求平方 即 每一列计算 (x1-x2)**2,(y1-y2)**2
sqdistance=diffMat**2
# 取距离,即( (x1-x2)**2+(y1-y2)**2)--维度变为4行1列
distance=sqdistance.sum(axis=1)
# 开根号
distance=distance **0.5
# 从小到大排序,并取每个的位置( disArg中存放的是distance从小到大的位置)
disArg=distance.argsort()
classCount={}
# k取3,即找距离最近的3个样本点
for i in range(3):
# 这3个样本点的类别
    voteLabel=labels[disArg[i]]
# 对该样本点的类别数目进行统计
    classCount[voteLabel]=classCount.get(voteLabel,0)+1
# 对统计数目从大到小排序
sortedClasscount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
# 取最大的值所在的类别
print(sortedClasscount[0][0])

以上距离 使用欧式距离公式,计算两点间距离
sklearn的实现

from sklearn.neighbors import KNeighborsClassifier 
# k=3
knn=KNeighborsClassifier(n_neighbors=3) 
knn.fit(group,labels)
# 注意,这里的维度, expected 2D array 而intX是1D array,所以,需要[intX]变为2维
knn.predict([intX])

为便于理解,再实现一个栗子:

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
import operator
from numpy import *
import numpy as np

# load dataset
iris=datasets.load_iris()
data_X=iris.data
data_y=iris.target

# normalize  (oldValues-min)/(max-min)
minVals=data_X.min(0)
maxVals=data_X.max(0)
ranges=maxVals-minVals
# oldValues-min(同纬度相减)
normDataSet=data_X-tile(minVals,(m,1))
# normDataSet/(max-min)
normDataSet=normDataSet/tile(ranges,(m,1))

#数据集划分
index0=np.random.permutation(len(normDataSet))
train_data=normDataSet[index0[:-50]]
test_data=normDataSet[index0[-50:]]
y_train=data_y[index0[:-50]]
y_test=data_y[index0[-50:]]

# 用于分类 
def Classify(m,train_data,y_train):
    distance=(m-train_data)**2
    distance=distance.sum(axis=1)
    sdistance=distance**0.5
    sortDistance=sdistance.argsort()
    classCount={}
    for i in range(10):
        votelabel=y_train[sortDistance[i]]
        classCount[votelabel]=classCount.get(votelabel,0)+1
    sortClasscount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortClasscount[0][0]

# 对测试集数据进行分类并进行验证
errorCount=0
for x in range(len(test_data)):
    m=test_data[x,:]
    y_pre=Classify(m,train_data,y_train)

    if y_pre!=y_test[x]:
        errorCount+=1.0
print('错误率是:%f'%(errorCount/float(len(test_data))))


sklearn 实现以上操作

from sklearn.neighbors import KNeighborsClassifier 
# k=5
knn=KNeighborsClassifier(n_neighbors=5) 
knn.fit(train_data,y_train)
knn.score(test_data,y_test,sample_weight=None)

k-近邻算法小结:
优点:
- 精度高,对异常值不敏感
缺点:
-计算复杂度高,空间复杂度高
适用数据范围:
- 数值型,标称型

猜你喜欢

转载自blog.csdn.net/lulujiang1996/article/details/81172139