考缺掘敏虑任意个(伏枝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
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)