from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
from sklearn.metrics import accuracy_score
iris=datasets.load_iris()
x=iris.data
y=iris.target
#print(iris)
#print(x[1],y)
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=2003)
clf=KNeighborsClassifier(n_neighbors=3)
clf.fit(x_train,y_train)
#print(clf.predict(np.array([5.1, 3.5, 1.4, 0.2]).reshape(1,-1))) 预测值
'''
直接引用库进行 准确率的计算
y_pred=clf.predict(x_test)
acc=accuracy_score(y_test,y_pred)
print('准确率:',acc)
'''
current =np.count_nonzero((clf.predict(x_test)==y_test)==True) # 准确的个数
print('准确率=%.3f'%(current/len(x_test)))
#----------------------------上面是引用的库 这里直接进行实现-----------
#----------------------------上面是引用的库 这里直接进行实现-----------
#----------------------------上面是引用的库 这里直接进行实现-----------
#----------------------------上面是引用的库 这里直接进行实现-----------
#----------------------------上面是引用的库 这里直接进行实现-----------
from sklearn import datasets
from collections import Counter # 为了做投票
from sklearn.model_selection import train_test_split
import numpy as np
#c = Counter('abracadabra') # 测试Counter
#print(c.most_common()) #[('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1)]
iris=datasets.load_iris()
x=iris.data
y=iris.target
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=2003)
def ecu_dis(ins_1,ins_2):
'''
计算欧氏距离
:param ins_1: array
:param ins_2: array
:return:
'''
return np.sqrt(sum((ins_1-ins_2)**2)) # sum() 用于array 类型
def knn_cay(x,y,test,k):
'''
给定一个测试数据test 通过knn算法来预测他的计算值
:param x: 训练数据的特征
:param y: 训练数据的标签
:param tstInstance: 测试数据 假定 array类型
:param k: n_neighbors的数量
:return:
'''
dis=[ecu_dis(x_i,test) for x_i in x ] # 计算距离(test 与各点的距离)
kneighbors=np.argsort(dis)[:k] # 倒序取 前k名对应的索引值 [6,5,9] 排序->[5,6,9] 对应的索引->[1,0,2]
count=Counter(y[kneighbors]) # 根据索引值 可以得到y值
return count.most_common()[0][0] # 返回数量最大的y 类似词频分析. 返回数量对多的那个词
#预测结果
pre_value=[knn_cay(x_train,y_train,data,3) for data in x_test]
correct=np.count_nonzero((pre_value==y_test)==True)
print('准确率%.3f'% (correct/len(x_test)))