K 近邻算法

K 近邻算法,第1张

考缺掘敏虑任意个(伏枝K 个)邻居,采用“投票法”来指定标签。

多个近邻时候,预测结果为这些散岩邻居的平均值

使用更少的邻居对应更高的模型复杂度,而使用更多的邻居对应更低的模型复杂度

随着邻居个数的增多,模型变得更简单,训练集精度也随之下降

上文借用了numpy和pandas等模块自编了k-近邻算法 python之k-近邻算法(非sklearn版) ,这次借用sklearn轮子来实现一下

数据还是用上篇文章的数据来 https://pan.baidu.com/s/1zIGz6GtEU20UeT6hemP4MQ

上篇文章我们是利用KNN.py中的自编函数panduan在读取数据的过程中来实现的,而这种转变在sklearn中已经有轮子调用了

这里再补充一点:烂悉对于类别数据(对于特征值也是适用的),可以分为 标称特征(nominal feature) 有序特征(ordinal feature) .

对于我们这里的数据largeDoses,smallDoses,didntLike应该是对应着有序特征

如果在这里'喜欢的类别'本身不带有有序的含义的话,即largeDoses,smallDoses,didntLike三个类别没有序别之分,可以借用sklearn里的功能扰敏

可以看到借用sklearn是比较方便的

但是。。。。。但是。。。。以上的0,1,2在算法看来依然是有顺序的,所以我们可以利用 独热编码(one-hot encoding) ,即创建一个新的虚拟特征(dummy feature)

也可以利用pandas里的功能

—————————————————————————缓历枝———————————

特征缩放(feature scaling)对于除了决策树和随机森林两个算法没用以外,对其他算法和优化算法来讲都是必不可少的

即上篇文章所涉及到的

对于线性模型来讲,标准化更加好,一是符合线性模型对权重的处理,二是保留了异常值的信息

———————————————————————————————————

上篇文章对于此类问题的处理见 datingClassTest 函数

K-近邻算法被称之为 惰性算法 ,和其他机器学习算法不一样,因为他仅仅是对训练数据集有记忆功能,而不是从训练集中通过学习得到一个判别函数,即不需要训练,看过上篇文章的小伙伴应该会有体会。 缺点是计算复杂度会随着样本数量的增长而呈线性增长,除非数据集中特征数量有限

大奎!哥来要铅则旦分!盯扮

发个算法吧,以免口舌,VS2008C#算法代码,刚学C#,代码有些粗糙,绝对好使,想要槐扰全部代码与本人联系。呵呵~: )

public void knnsf(float PH,float JD,float NH4,float COD,float BOD,float SS,float XTD)

{

double[,] kn = new double[81, 2]

int a = 0, b = 0, c = 0

//计算欧氏距离

for (int i = 0i <27i++ )

{

kn[i, 0] = Math.Sqrt( Math.Pow(class1[i, 1] - PH, 2) + Math.Pow(class1[i, 2] - JD, 2) + Math.Pow(class1[i, 3] - NH4, 2) +

Math.Pow(class1[i, 4] - COD, 2) + Math.Pow(class1[i, 5] - BOD, 2) + Math.Pow(class1[i, 6] - SS, 2) +

Math.Pow(class1[i, 7] - XTD, 2))

kn[i, 1] = 1

kn[i+27,0] = Math.Sqrt(Math.Pow(class2[i, 1] - PH, 2) + Math.Pow(class2[i, 2] - JD, 2) + Math.Pow(class2[i, 3] - NH4, 2) +

Math.Pow(class2[i, 4] - COD, 2) + Math.Pow(class2[i, 5] - BOD, 2) + Math.Pow(class2[i, 6] - SS, 2) +

Math.Pow(class2[i, 7] - XTD, 2))

kn[i+27, 1] = 2

kn[i+54,0] = Math.Sqrt(Math.Pow(class3[i, 1] - PH, 2) + Math.Pow(class3[i, 2] - JD, 2) + Math.Pow(class3[i, 3] - NH4, 2) +

Math.Pow(class3[i, 4] - COD, 2) + Math.Pow(class3[i, 5] - BOD, 2) + Math.Pow(class3[i, 6] - SS, 2) +

Math.Pow(class3[i, 7] - XTD, 2))

kn[i+54, 1] = 3

}

//选择排序法

for (int i = 0i <81i++ )

{

int k = 0

double mintmp = kn[i, 0],clas=kn[i,1]

for (int j = i+1j <81j++)

{

if (mintmp >kn[j, 0])

{

mintmp = kn[j, 0]

clas = kn[j, 1]

k = j

}

}

kn[k, 0] = kn[i, 0]

kn[k, 1] = kn[i, 1]

kn[i, 0] = mintmp

kn[i, 1] = clas

}

//选择K=30个近邻

for (int k = 0k <3k++)

{

if (kn[k, 1] == 1) a++

if (kn[k, 1] == 2) b++

if (kn[k, 1] == 3) c++

}

//统计近邻类别

if (a >b &&a >c)

{

classes = 1

}

if (b >a &&b >c)

{

classes = 2

}

if (c >b &&c >a)

{

classes = 3

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12223517.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存