Python基础语法和常用工具笔记

本文记录的是在使用python过程中遇到的基本语法和常用函数、动作

1、global 定义全局变量

相对于局部变量而言,global的作用是,在函数内定义一个全局变量,这样在函数内对该变量的操作,在全局都有意义。为什么不直接在函数外直接进行定义呢?原则上可以,但不建议这么做,因为那样可能导致我们在阅读代码时,不知道某个变量是如何来的,作用是什么。而在函数内,通过global xxx的形式,能方便的知道该变量的来龙去脉。

def func():
    global x  # 定义全局变量x,作用域为全局
    x = 1     # 将x的值设置为1
func()  # 执行一下func,使全局变量生效
print(x) # 打印x的值(注意除了在函数func内,我们未在其他地方定义过x)

执行结果:1

您可以尝试去掉global,将会得到一个报错,说x未被定义:NameError: name 'x' is not defined

2、int(flo) 将浮点转换为整数

flo = 3.14
print(int(flo))

输出:3

实例1:获取时间戳

import time
print(time.time()) # 这里返回的是一个类似1498428421.5438452的浮点型时间戳
print(int(time.time())) # 这里将返回的浮点型数字转换为整数时间戳

WIN8下python3使用os.system命令输出时Hbuilder控制台出现中文乱码的解决方法

未命名-1.jpg

故障表现状态

2345截图20170625173632.png

原因分析及解决过程

由于python3默认采用了UTF-8编码,而WIN8的CMD窗口采用的是GBK编码,导致了编码不同。

但是,如果简单的通过encode('gbk')之类的方法,不能解决根本问题。

尤其是当我们根本不是使用print命令来输出,而是控制台默认输出的情况下,是没办法修改os.system的编码格式的,因为os.system执行命令返回的并不是命令中出现的文本,而是一个int,为0时表示成功,为1时表示异常。

后来通过搜索hbuilder相关文章已经无法解决,想到hbuilder其实是eclipse内核的,所以搜索了eclipse+控制台+乱码,发现一篇文章:

http://blog.csdn.net/forandever/article/details/24811273

大概意思是,修改运行环境。瞬间醍醐灌顶啊:输出不是问题,问题出在控制器的显示本身了。

于是按照前辈的方法,解决了问题,解决方法如下:

解决方案

1、在代码编辑区点击右键,选择“运行方式”->“运行 配置(N)”,如图:

2345截图20170625173827.png

2、在弹出的“运行 配置”窗口中,选择左侧的文件(你在编辑的文件,应该是默认选了的),右边选择“公共”选项卡,如图:

2345截图20170625173929.png

3、 在公共选项卡中,将“编码”项的设置修改为“其他(E)”->“GB2312”,这里默认是缺省值UTF8,如图:

2345截图20170625174053.png

4、点击“应用”,然后关闭。

5、再运行一下看看,是不是变成中文了?

2345截图20170625174251.png

唠叨一句

这个问题其实无伤大雅,因为程序发布后控制台的东西外人是看不到的。纯粹就是因为看着不顺眼!

python3中os库使用笔记

python3里很多库的使用都和python2里不同了,所以做了个系列笔记,当工作中碰到了某个库,就记录在这里。

os库主要用来对操作系统进行一些操作,本文中使用的全部为windows系统。

1、os.getcwd() 获取当前路径

import os
path = os.getcwd()
print(path)

2345截图20170625162608.png

2、os.system() 执行系统命令,相当于cmd

例1:调用ping命令

import os

os.system('ping 222.222.222.222')

2345截图20170625163133.png

关于这个乱码的事情,请参照我的另一篇文章:WIN8下python3使用os.system命令输出时Hbuilder控制台出现中文乱码的解决方法

例2:查看网络配置

import os

os.system('ipconfig')

2345截图20170626054654.png

例3:打开文件

import os

os.system('call "D:\\aaa.txt"')

2345截图20170626055000.png

3、os.remove(file) 删除文件

import os

os.remove('D:\\aaa.txt')

利用最小二乘拟合(Least-square fitting)实现简易房价预测模型

1、概念简介

假设有一组数据(x[i], y[i]),我们知道它们之间的函数关系y=f(x),通过这些已知信息,我们需要确定函数中的一些参数项。
例如,如果f是一个线性函数:f(x) = k*x + b,那么参数k和b就是我们需要确认的值。
如果这些参数用P表示的话,我们会得到一组P值使得如下公式中函数S的值最小:

8da054a2d9fb73326f9fc0a3141cea13d49db11f.png

这种算法称之为:最小二乘拟合(Least-square fitting)。

公式中的m表示的是样本的记录条数,通过逐条的计算得到的和进行比较,得到S(P)的最小值。

当然这个计算如果用人来做的话,样本数多的情况下几乎无法完成,所以,一般我们用scipy库来做。

2、实际用途

假设我们掌握了若干条某城市的房价(y)与面积(x)的对应数据,且通过绘制散点图发现其相关性大致如图所示:

2345截图20170330212636.png

我们大致猜测,房价y与面积x之间是线性相关的关系,那么一定存在某个公式:y = k*x + b,能够最好的拟合现有数据(注:完全与现实数据拟合的情况是不存在的,除非所有的散点都恰好在同一个直线上)。

为了能够获得根据面积自动预测房价的超能力,我们需要知道参数k和b的具体值。

因为当我们掌握了这组拟合度最好的值,我们才能预测出最接近实际的房价。

所以,我们通过最小二乘拟合的方式,来获得最接近实际情况的k和b的值,从而实现对房价的预测。

ps:当然,实际情况是,房价并不只与面积相关,还与户型、地理位置、周边环境、楼层等多个因素相关,我们为了方便举例,忽略了其他因素。

同样的,在深入学习了机器学习的理论之后,我们还可以将其应用到更加广的范围内,例如:价格、人口、环境等,但那些情况都有一个共同点:一般他们不会是一个简单的线性函数,实际情况更加复杂。

3、使用方法(python演示)

所需资料:

  • 一组包含20条房产价格和面积对应关系的数据
  • PYTHON运行环境

实现步骤(后面会给出完整代码打包下载)

1)数据整理:将已掌握的数据整理存储为csv逗号间隔文件,方便读取。

我们将使用这样一组数据作为参考数据,用来模拟房价的计算。

真实情况下,我们可以使用已掌握的数据,或通过程序抓取等方式来获得原始数据。

2345截图20170331074105.png

很简单,将excel文件另存为CSV(逗号分隔)即可。

2345截图20170331073217.png

存储后的csv文件,选择打开方式为记事本,我们可以看到:

2345截图20170331074132.png

这时候我们已经完成了简单的数据整理,可以将文件存放到指定目录下,留待程序调用。

2)数据读取:在python中读取csv文件

请参考以下代码:

import scipy as sp
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体

data = sp.genfromtxt("D:\\Python\\ML\\test.csv", delimiter=",")
x = data[:, 0]
y = data[:, 1]

通过执行print(x)或print(y),可以看到我们已经成功将面积赋给了x,房价赋给了y,为后面的运算打下了基础。

3)绘制散点图:在pyplot中绘制数据分布散点图

散点图的绘制其实非常简单,交给pyplot来办就可以了:

plt.scatter(x,y)
plt.title("模拟演示数据分布图")
plt.xlabel("面积x")
plt.ylabel("房价y")
plt.autoscale(tight=True)
plt.grid()
plt.show()

绘制出的效果如下:

2345截图20170331074314.png

我们可以看到,其分布大致是一条直线(实际上是有微小偏差的),这就给我们一种直观的判断,房价与面积,应该是线性相关的,但究竟如何计算?我们要拿着一个尺子,去测量x轴和y轴的值吗?当然不用。

4)计算f(x)=k*x + b中的最优参数项k和b的值:

参考代码:

def error(f, x, y):
    return sp.sum((f(x)-y)**2)    
fp1, residuals, rank, sv, rcond = sp.polyfit(x, y, 1, full=True)    
print("[k,b]参数值为 %s 时,最接近演示数据结果。" % fp1)

计算结果:

2345截图20170331074842.png

这里我们得到,当k=2968.52680507,b=2296.35884168时,我们的公式计算结果最接近演示数据。

等等,我们似乎错过了什么?

通过观察演示数据,事实上我们不难发现,我是按照大约3000元/㎡的价格来计算的(真的好便宜的房价啊),然后对结果进行了微调,有的增加了几千元,有的减少了几百元,从而使数据不是非常精确的在同一条直线上。但计算的结果,为什么不是k=3000,b=0呢?

事实上,假设我们已知计算公式的情况下,我们得出的结果,也不是完全一致的,而实际上,可能存在多个参数项的组合,是可以计算出相同结果的,所以程序给出的答案,未必是错误的。下一步我们就来验证一下。

5)验证结果:我们将参数代入方程式,看看计算结果是否接近已知结果:

操作代码:

for i in range(20):
    print("当x值为%d时,y的预测值为:%.2f,演示数据中为:%d, 误差为:%d" % (x[i], (x[i]*fp1[0]+fp1[1]), y[i], y[i]-(x[i]*fp1[0]+fp1[1])))

结果如下:

2345截图20170331080213.png

你可能会说,误差也很大啊,最大误差有2000多呢。是的,因为原始数据被调整了。

不过,没关系,我们再来计算以下几组数值,看看通过我们设计数据(y=3000*x)的公式来计算的结果误差有多少:

for i in (80,90,100):
    print("当面积为%d平米时,预测值为:%.2f,计算值为:%d,误差为:%d" % (i, (i*fp1[0]+fp1[1]), i*3000, i*3000-(i*fp1[0]+fp1[1])))

我们以80、90、100平米,比较了机器预测结果与实际公式之间的误差:

2345截图20170331080718.png

由此可见,误差已经很微小了,足够进行房价预测了。

4、总结

这样我们就完成了一个非常小的房价预测的软件,如果再增加更多的样本,将会获得更加精准的预测数据。
然后还是要补充的是,通过最小二乘拟合来做的模拟预测,只是为了让我们快速理解机器学习的基本思想理念:让机器自己去尝试不同的参数值组合,找到最接近现实的参数组,从而实现预测。而实际应用中,要远远的比这复杂的多,机器学习博大精深,涉及学科众多,尤其是数学、概率、统计方面,所以要学的还很多,这只是相当于机器学习中的“Hello World!”

附:本文源码和csv文件

PYPLOT(PYTHON中绘制2D图表)使用详解(八)

在学习机器学习与PYTHON的相关内容中,接触到了pyplot这个子库,感觉非常有用,可是网络上的文章大部分都是比较零散的,于是打算按照官方文档,进行一个简单翻译与演示,详细记录一下该库的使用方法。这是本系列的第八篇,每篇大约讲解20个方法,但有些方法官方也未给出详细的用法,待以后使用中慢慢摸索后再补充。

二、方法介绍(141~151)

141、pink() —— 为pink设置默认的colormap并应用到当前图像

142、prism() —— 为prism设置默认的colormap并应用到当前图像

143、spring() —— 为spring设置默认的colormap并应用到当前图像

144、summer() —— 为summer设置默认的colormap并应用到当前图像

145、winter() —— 为winter设置默认的colormap并应用到当前图像

146、magma() —— 为magma设置默认的colormap并应用到当前图像

147、inferno() —— 为inferno设置默认的colormap并应用到当前图像

148、plasma() —— 为plasma设置默认的colormap并应用到当前图像

149、viridis() —— 为viridis设置默认的colormap并应用到当前图像

150、nipy_spectral() —— 为nipy_spectral设置默认的colormap并应用到当前图像

151、spectral() —— 为spectral设置默认的colormap并应用到当前图像