【埃尔法哥哥】kNN分类算法及其python实现( 二 )
那么 , 我与训练集的A类样本的相似度就是:
1.5可以升级的地方
1.4提出的分类器可以升级的地方很多:(1)特征工程 , 我们可以用PCA之类的方法搞一个降维、把特征里重要的信息突出一下 , 这样分类器的效果会提升一些;(2)选取合适的距离计算方式 , 特征目前是有量纲的 , 要特别注意特征的绝对值大小对欧氏距离影响很大 , 可以尝试一下余弦距离之类的;(3)资源允许的情况下再加一点训练样本 。
2kNN的python实现
importnumpyasnp
#一个最简单的KNN
classKNN():
def__init__(self):
self.model={}#存储各个类别的训练样本的特征 , key为类别标签 , value是一个list , 元素为样本的特征向量
self.training_sample_num={}#存储训练数据中 , 各个类别的数量
#训练模型 , 输入是标签列表 , 和对应的输入数据列表
deffit(self,X,Y):
foriinrange(len(Y)):
#将训练数据按照类别分组
ifY[i]inself.model:
self.model[Y[i]].append(X[i])
else:
self.model[Y[i]]=[X[i]]
#各个类别的样本总数
self.training_sample_num[Y[i]]=self.training_sample_num.get(Y[i],0)+1
#预测/判断一个样本的类别 。 这里模仿sklearn的风格 , 允许输入单个样本 , 也允许输入多个样本
defpredict(self,X):
result=None
iftype(X[0])==list:
forxinX:
result.append(self.predict_one(x))
else:
result=self.predict_one(X)
returnresult
#判断单个样本的类别
defpredict_one(self,x):
label=None#类别标签
min_d=None#目前为止 , 待分类样本与各类代表性样本的最小平均距离
forclass_labelinself.model:#遍历每个类别的代表性样本
sum_d=0#待分类样本与本类别的代表性样本的距离之和
forsampleinself.model[class_label]:#遍历这个类别下所有的代表性样本
sum_d+=self.distance(x,sample)#累计
mean_d=sum_d/self.training_sample_num[class_label]#待分类样本与本类别的代表性样本的平均距离
ifmin_d==Noneormean_d<=min_d:#如果遍历到第一个类别 , 或者待分类样本与当前类别的平均距离比之前的更低 , 更新类标签与最小距离
label=class_label
min_d=mean_d
returnlabel
#计算两个样本之间的距离
defdistance(self,x1,x2,type="eu"):
d=None
iftype=="eu":d=np.sum((x1-x2)**2)#欧氏距离
returnd
#评估模型效果
defeveluate(self,X,Y):
pass
#制造训练数据
defgenerate_training_data(self):
data_str="""类别样本唯一标识身高(cm)体重(kg)尾巴长度(cm)
A高秀敏160600
A赵本山170700
A范伟170700
A宋丹丹160600
B孙悟空12040100
B大熊猫10010010
B大象300300050
B老鼠100.110"""
print(data_str)
data_list=data_str.split('')
X=[]
Y=[]
forlineindata_list[1:]:
data=https://pcff.toutiao.jxnews.com.cn/p/20200506/line.split("")
Y.append(data[0])
X.append(list(map(lambdax:float(x),data[2:])))
returnX,Y
if__name__=='__main__':
M=KNN()
train_X,train_Y=M.generate_training_data()
print(train_X)
M.fit(train_X,train_Y)
xiao_li_zi=np.array([175,75,0])
res=M.predict(xiao_li_zi)
print(res)
3结束语
KNN是我们学数据挖掘或者机器学习时 , 最早接触的分类算法 。 比起SVM之类的算法 , KNN显得有些简陋 , 不过如果通过数据探查和分析 , 如果可以确定样本非常容易分类 , 使用简单的算法还是挺节省资源的 。
- 三生石哥哥多家快递公司宣布会提高快递运送费用
- 埃尔法哥哥互联网空间会被用完吗?2025年全世界数据总量将会超过16万EB
- 埃尔法哥哥 人工智能与科技传播领域的融合
- 埃尔法哥哥■区块链技术迎风而上,ETX公链解决行业痛点,信息时代安全为王
- 埃尔法哥哥@Spark 数据倾斜的 8 大实用方法,解决
- 『埃尔法哥哥』为什么你写的代码别人看不懂?
- 「埃尔法哥哥」ICCV2019:DeepFill一个用于生成图像修复任务的开源框架
- 『埃尔法哥哥』每一个程序员的必经之事
- 埃尔法哥哥■假装网络工程师-TCP/IP与静态路由
- 埃尔法哥哥▲需求侧响应又准又赚,AI加持