k近邻法
1 模型
最近邻法要求的仅仅是:
• 某种距离的概念
• 一种彼此接近的点具有相似性质的假设
2 案例:最喜欢的编程语言
# 每一条记录都是([longitude, latitude], favorite_language)的形式
cities = [([-122.3 , 47.53], "Python"), # 西雅图
([-96.85, 32.85], "Java"), # 奥斯汀
([ -89.33, 43.13], "R"), # 麦迪逊
# ……还有很多记录
]
第一步最好是先根据数据作图
# 键是语言,值是成对数据(longitudes, latitudes)
plots = { "Java" : ([], []), "Python" : ([], []), "R" : ([], []) }
# 我们希望每种语言都能有不同的记号和颜色
markers = { "Java" : "o", "Python" : "s", "R" : "^" }
colors = { "Java" : "r", "Python" : "b", "R" : "g" }
for (longitude, latitude), language in cities:
plots[language][0].append(longitude)
plots[language][1].append(latitude)
# 对每种语言创建一个散点序列
for language, (x, y) in plots.iteritems():
plt.scatter(x, y, color=colors[language],
marker=markers[language],
label=language, zorder=10)
plot_state_borders(plt) # 假设我们有一个实现这一步的函数
plt.legend(loc=0) # 让matplotlib选择一个位置
plt.axis([-130,-60,20,55]) # 设置轴
plt.title("最受欢迎的编程语言")
plt.show()
3 维数灾难
在更高的维度上,k 近邻法会因为“维数灾难”而遇到麻烦,其根源在于高维空间过于巨大。高维空间内的点根本不会表现得彼此邻近。
思考这个问题的一个不同的方法涉及更高维空间的稀疏性。(原谅我数学太差了 难,这块我也没看懂)
4 延伸学习
scikit-learn 里有许多最近邻模型(http://scikit-learn.org/stable/modules/neighbors.html)。