【python实战】k-近邻算法(1)
来源:互联网 发布:mac怎么添加qq邮箱 编辑:程序博客网 时间:2024/05/20 21:21
一、k-近邻算法的简单实现
代码:
12345678910111213141516171819202122232425262728293031from numpy
import
*
import
operator
#已有数据,以及对应的标签
group=array([[
1.0
,
1.1
],[
1.0
,
1.0
],[
0
,
0
],[
0
,
0.1
]])
labels=[
'a'
,
'a'
,
'b'
,
'b'
]
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[
0
] #获取数据集的行数
#计算距离
diffMat = tile(inX, (dataSetSize,
1
)) - dataSet
sqDiffMat = diffMat**
2
#对上述差值求平方
sqDistances = sqDiffMat.sum(axis=
1
) #对于每一行数据求和
distances = sqDistances**
0.5
sortedDistIndicies = distances.argsort() #对开方结果建立索引 按
从小到大顺序0--(k-1)
#计算距离最小的k个点的Lable
classCount={} #建立空字典,类别字典,保存各类别的数目
for
i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #先找出开方结果索引表中第i个值对应的Label值
classCount[voteIlabel] = classCount.get(voteIlabel,
0
) +
1
# 存入当前label以及对应的类别值(数个数)
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(
1
), reverse=True)
#对类别字典进行逆排序,级别数目多的往前放(py3用items(),)
#返回结果
return
sortedClassCount[
0
][
0
] #返回级别字典中(频率最高的)的第一个值,也就是最有可能的Label值
#进行分类
print(classify0([
1.0
,
0.8
],group,labels,
3
))
print(classify0([
0.5
,
0.5
],group,labels,
3
))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from numpy
import
*
import
operator
#已有数据,以及对应的标签
group=array([[
1.0
,
1.1
],[
1.0
,
1.0
],[
0
,
0
],[
0
,
0.1
]])
labels=[
'a'
,
'a'
,
'b'
,
'b'
]
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[
0
] #获取数据集的行数
#计算距离
diffMat = tile(inX, (dataSetSize,
1
)) - dataSet
sqDiffMat = diffMat**
2
#对上述差值求平方
sqDistances = sqDiffMat.sum(axis=
1
) #对于每一行数据求和
distances = sqDistances**
0.5
sortedDistIndicies = distances.argsort() #对开方结果建立索引 按
从小到大顺序0--(k-1)
#计算距离最小的k个点的Lable
classCount={} #建立空字典,类别字典,保存各类别的数目
for
i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #先找出开方结果索引表中第i个值对应的Label值
classCount[voteIlabel] = classCount.get(voteIlabel,
0
) +
1
# 存入当前label以及对应的类别值(数个数)
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(
1
), reverse=True)
#对类别字典进行逆排序,级别数目多的往前放(py3用items(),)
#返回结果
return
sortedClassCount[
0
][
0
] #返回级别字典中(频率最高的)的第一个值,也就是最有可能的Label值
#进行分类
print(classify0([
1.0
,
0.8
],group,labels,
3
))
print(classify0([
0.5
,
0.5
],group,labels,
3
))
-----------------------------------------------------------------------------------
作用:将待分类数据集与已有数据集以其标签进行计算,从而得出待分类数据集最有可能所属的类别
参数:
inX:待分类数据集
dataSet:已有数据集,通过createDataSet()函数获取
labels:已有数据集对应的分类标签,通过createDataSet()函数获取
k:设置最小距离数
【参考网址【【http://www.2cto.com/kf/201405/299627.html】】】
-----------------------------------------------------------------------------------
作用:将待分类数据集与已有数据集以其标签进行计算,从而得出待分类数据集最有可能所属的类别
参数:
inX:待分类数据集
dataSet:已有数据集,通过createDataSet()函数获取
labels:已有数据集对应的分类标签,通过createDataSet()函数获取
k:设置最小距离数
【参考网址【【http://www.2cto.com/kf/201405/299627.html】】】
------------------------------------------------------------------------------------
[1]numpy函数:shape用法 size=dataset.shape[0]
shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。它的输入参数可以使一个整数表示维度,也可以是一个矩阵。其他几种用法如下:
[2]numpy函数:tile函数用法 tile(inX,(datasize,1))-dataset
tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,具体的例子:【 例子来源:http://blog.sina.com.cn/s/blog_6bd0612b0101cr3u.html】>>> a=[[1,2],[2,3]]
>>> tile(a,2)
array([[1, 2, 1, 2],
>>> tile(a,[1,2]) #【1,2】2看作对数组a的一维进行copy,2对a的二维进行copy
array([[1, 2, 1, 2],
>>> tile(a,[2,2])
array([[1, 2, 1, 2],
[3]numpy函数:sum函数用法 sqDiffMat.sum(axis=1)
sum(sequence[,start])->value 【参考网址http://blog.csdn.net/u012005313/article/details/49153261】函数功能:返回一个数字序列(非字符串)的和,并加上参数'start'值(默认0,如果序列空则返回start的值(如果start为负,则出错)
.sum()函数是模块numpy的一个函数:
默认axis为None,表示将所有元素的值相加,对于二维数组,axis=1表示按行相加 , axis=0表示按列相加
[4]numpy函数:argsort函数用法
http://blog.csdn.net/maoersong/article/details/21875705
>>> x = np.array([3, 1, 2])
>>> np.argsort(x)
array([1, 2, 0])
>>> np.argsort(x)
array([1, 2, 0])
>>> x = np.array([[0, 3], [2, 2]])
>>> np.argsort(x, axis=0) #按列排序
array([[0, 1],
[1, 0]])
>>> np.argsort(x, axis=1) #按行排序
array([[0, 1],
[0, 1]])
>>> np.argsort(x, axis=0) #按列排序
array([[0, 1],
[1, 0]])
>>> np.argsort(x, axis=1) #按行排序
array([[0, 1],
[0, 1]])
[5]python函数:get函数用法
字典dict.get(key, default=None)返回指定键的值,如果值不在字典中返回default值
[6]py3: items()函数
Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。将字典分解为元祖列表,
py2:iteritems() 【http://www.sjsjw.com/kf_code/article/34_20855_10234.asp】
[7]sorted()
operator.itemgetter(1) 函数,即取第二个元素(即出现次数)的次序对元祖进行来排序。逆序:从大到小。
二、k-近邻算法改进约会网站的配对效果
【1】zeros():该函数功能是创建给定类型的矩阵,并初始化为0
- #一维数组
- zeros(3)
- #二维数组
- zeros((2,3)) #或 zeros([2,3])
或|for line in file:
者| line.strip().split()这样就把每行的每个字符一个个分开,变成一个list。
【3】int(listFormLine[-1]);python中可以使用索引值-1表示列表中的最后一列元素。此外这里我们必须明确的通知解释器,告诉它列表中存储的元素值为整型,否则python语言会将这些元素当做字符串处理。
者| line.strip().split()这样就把每行的每个字符一个个分开,变成一个list。
【3】int(listFormLine[-1]);python中可以使用索引值-1表示列表中的最后一列元素。此外这里我们必须明确的通知解释器,告诉它列表中存储的元素值为整型,否则python语言会将这些元素当做字符串处理。
执行:
import matplotlib#matplotlib 是python最著名的绘图库
import matplotlib.pyplot as plt #快速绘图pyplot模块虽然用法简单,但不适合在较大的应用程序中使用
import matplotlib.pyplot as plt #快速绘图pyplot模块虽然用法简单,但不适合在较大的应用程序中使用
fig =plt.figure()#若绘制多幅图表,可以给figure()传递一个整数参数指定Figure对象的序号
ax =fig.add_subplot(111) #画子图
ax.scatter(datingDataMat[:,1],datingDataMat[:,2]) #散点图使用矩阵的第二列(游戏耗费时间)三列数据(消耗冰淇淋)
plt.show()
ax =fig.add_subplot(111) #画子图
ax.scatter(datingDataMat[:,1],datingDataMat[:,2]) #散点图使用矩阵的第二列(游戏耗费时间)三列数据(消耗冰淇淋)
plt.show()
成功
【matplotlib:http://blog.sina.com.cn/s/blog_6252a9bf0101b257.html】
【http://blog.csdn.net/you_are_my_dream/article/details/53439518】
待续
阅读全文
0 0
- 【python实战】k-近邻算法(1)
- 【python实战】k-近邻算法(2)
- python机器学习实战1:实现k-近邻算法
- 机器学习实战2:k近邻算法KNN(python)
- Python机器学习实战--(k-近邻算法)
- k-近邻算法(Python)
- 《机器学习实战》K-近邻算法代码解析(1)
- 从零开始实战机器学习(1)—K近邻算法
- 机器学习实战1:K近邻算法(KNN)
- K近邻算法(机器学习实战)
- python k-近邻算法
- K 近邻算法 @ Python
- Python:K-近邻算法
- 机器学习python实战——K近邻算法
- 机器学习实战笔记(Python)-01-K近邻算法(KNN)
- 《Python机器学习实战》第一章读书笔记:k-近邻算法
- k-近邻算法 python实现(学习笔记no.1)
- k-近邻算法(Python实现)
- 测试
- 2017年数据分析师教程全套
- 代码块
- eclipse离线安装Hibernate Tools问题
- HighCharts(3)动态加载数据的方式
- 【python实战】k-近邻算法(1)
- linux通过tar.gz包安装tomcat
- zcmu-1918
- 当推荐系统遇上深度学习
- A + B for you again(HDU-1867)(最长公共前缀和后缀)
- 《Python 源码剖析》 之 tuple
- hdu6166—Senior Pan(二进制划分跑最短路)
- MVC+Ninject+三层架构+代码生成 -- 总结(六、邏輯層)
- Excel使用MID函数从文本中指定起始位置快速提取关键词